Как написать определение шага, которое сравнивает ответ json с таблицей схемы сценария

У меня есть пример ответа json:

{
   "colours": ["green","blue", "red"],
   "type" :   ["shoes","socks","t-shirts"],
   "make" :   ["nike", "adidas"],
} 

У меня есть общая таблица сценариев:

    |colours|type    |make  |
    |red    |shoes   |nike  |
    |blue   |socks   |nike  |
    |green  |t-shirts|adidas|

Я хочу использовать таблицу сценариев для подтверждения ответа json. Теперь я знаю, как это проверить по одному, например

* Assert colour is correct: <colours>
* Assert type is correct: <type>
* Assert make is correct: <make>

А затем выполните определение шага, как в примере ниже для цвета:

    @Step("Assert colour is correct: <colours>")
    public void assertColourIsCorrect(String colourValue) {
        String responseBody = BridgeTestState.getLastResponse().getBody().toString();
        itemState itemStateResp = new Gson().fromJson(responseBody, itemState.class);

        assertThat("colours", itemStateResp.getColour(), is(equalTo(colourValue.toLowerCase())));
    }

Примечание. getColour () поступает от установленного мной геттера и сеттера.

Теперь это работает, но, как вы можете видеть, это немного затянуто, поскольку мне нужно создать три отдельных шага для утверждения по каждому столбцу.

Я хочу быть немного умнее этого, но не знаю, как это реализовать. Я хотел бы определение шага, в котором он будет смотреть на ответ json и сравнивать его с таблицей на основе его поля, а затем оттуда просматривать значение.

Что-то вроде:

  • Выводятся верные «поля» и «значения».

Я надеюсь, что это имеет смысл, в основном умное одношаговое определение для проверки между ответом json и строкой таблицы.


person BruceyBandit    schedule 04.02.2020    source источник
comment
Scenario Outline предназначен для выполнения столько тестов, сколько строк в его Examples части. Я думаю, что вам лучше будет Data Table, поскольку он может передавать несколько строк значений при выполнении одного сценария (при условии, что все colours в вашем json возвращаются в одном ответе).   -  person JDelorean    schedule 04.02.2020
comment
Это должно быть в схеме сценария, должна быть одна строка даты для каждого выполнения.   -  person BruceyBandit    schedule 05.02.2020
comment
Вы можете перечислить свои значения в ячейке | red, blue, green |, а затем заполнить им список Arrays.asList(cellString.split("\\s*, \\s*"));. Это то, что вы ищете?   -  person JDelorean    schedule 05.02.2020
comment
@JDelorean Спасибо за ваше предложение, но не совсем так, как в ячейке. По сути, он должен быть достаточно умным, чтобы сравнивать поля и значения в каждой строке с dtos и значениями в ответе json.   -  person BruceyBandit    schedule 05.02.2020
comment
проверьте github.com/cucumber/cucumber/tree/master/datatable   -  person lojza    schedule 10.02.2020
comment
Меня немного смущает, как разные ключи в ответе JSON соотносятся друг с другом. Каждый из них содержит массивы по 3 элемента, за исключением производителей, массив которых содержит только 2 элемента.   -  person Greg Burghardt    schedule 12.02.2020
comment
У меня та же проблема, что и у @GregBurghardt - какого типа сравнения вы хотите добиться? Не могли бы вы добавить несколько вводных предложений, какова точная цель, а также сказать что-нибудь о предыстории?   -  person B--rian    schedule 14.02.2020


Ответы (2)


Из комментариев кажется, что вам нужен способ сделать строку за строкой, где вы используете заголовки данных в качестве ключей для json. Вы не можете добиться этого, используя это в качестве примера, потому что это специально предназначено для отображения непосредственно в этапах, как вы описываете себя. Как я вижу, есть два способа справиться с этим, в зависимости от вашего варианта использования.

Во-первых, по-прежнему обрабатывайте его как параметры в шагах, т. Е.

Then the "colours" is <colours>
And the "type" is <type>

а затем просто выполните одноэтапное внедрение

Then("the {string} is {string}")
public void theKeyIsValue(String key, String value) {
    assertThat(json.get(key)).contains(value);
}

Другой, и, скорее всего, лучше, будет иметь дело с этим как с обычным сценарием, как уже предлагалось в комментариях (я не понял, почему вы утверждаете, что не можете). Что чаще всего лучше.

Однако, скорее всего, правильное решение - как это ни досадно - действительно переосмыслить ваш сценарий. На https://cucumber.io/docs/bdd/ они довольно быстрые и легкие для чтения, и помогут с множеством начальных проблем.

Это сложно без полного примера, но, судя по тому, что вы пишете, я подозреваю, что ваши тесты могут быть слишком техническими. Это чрезвычайно сложный баланс, но постарайтесь сделать их настолько расплывчатыми, чтобы они указывали не «Как», а только «Что». Пример Given the username "Kate" - лучший шаг, чем Given I type the username "Kate", потому что в последнем вы указываете, что должно быть что-то, что вы можете ввести текст. Я обычно спрашиваю людей, работают ли их тесты с голосовым помощником.

Еще я подозреваю, что вы пытаетесь протестировать слишком много вещей одновременно. Например, я заметил одну вещь: нет очевидной связи между вашим json и вашей таблицей. То есть, если эти данные должны совпадать, например, в индексе, это может иметь больше смысла. Однако, глядя на немногочисленные данные, я думаю, что вам понадобятся следующие тесты:

Scenario: The colour options
  Given ...

  When the options are given

  Then the following can be chosen
    | Colour |
    | red    |
    | blue   |
    | green  |


Scenario: The clothing options
  Given ..

  When the options are given

  Then the following can be chosen
    | Type     |
    | shoes    |
    | socks    |
    | t-shirts |

Таким образом, вы все еще можете повторно использовать шаги, вы можете использовать заголовок для ключа в json, и, судя по вашим данным, тесты действительно более тесно связаны с ожидаемыми вещами.

Написание приемочных тестов - это искусство, требующее практики. Я надеюсь, что некоторые из приведенных здесь предложений можно использовать, однако трудно прийти с более прямыми предложениями без дополнительного контекста.

person Rohde Fischer    schedule 14.02.2020

Делать то, что вы хотите, непродуктивно и противоречит основным принципам проектирования Cucumber, Scenario Outlines и, возможно, даже таблицам данных в Cucumber.

Cuke должен объяснять, ЧТО представляет ответ json и ПОЧЕМУ это важно. КАК создается ответ json, и детали исследования его достоверности и структуры содержимого должны быть перенесены в определения шагов или, что еще лучше, вспомогательные методы, вызываемые определениями шагов.

Это действительно сложно проиллюстрировать на примерах данных, потому что очень сложно понять, ЧТО

{
   "colours": ["green","blue", "red"],
   "type" :   ["shoes","socks","t-shirts"],
   "make" :   ["nike", "adidas"],
} 

представляет. Также довольно сложно понять, почему вы хотите делать те утверждения, которые хотите сделать.

Если вы привели реальный пример и объяснили, что представляют собой данные и ПОЧЕМУ они важны, а также, возможно, ПОЧЕМУ вам нужно их проверить и ЧТО бы вы сделали, если бы они не были правильными, тогда мы могли бы добиться большего прогресса.

Так что я попробую на собственном примере, который будет не очень хорошим.

Given a set of clothing
When I get a json representation of the clothing
Then the json should be valid clothing

и шаги

Given 'a set of clothing' do
  create_clothing_set
end

When 'I get a json representation of the clothing' do
  @json = make_clothing_request type: :json
end

Then 'the json should be valid clothing' do
  res = validate_clothing json: @json
  expect res ...
end

Теперь ваша проблема в том, как написать код для проверки вашей одежды, т.е.

  def validate_clothing(json: )
    ...
  end

Это гораздо более простая задача, выполняемая в гораздо более мощной среде. Это не имеет ничего общего с огурцом, никаких взаимодействий с функциями, сценариями и т. Д., Это просто проблема программирования.

В общем, с Cucumber либо устраняют технические проблемы, так что они становятся проблемами программирования, либо вытягивают проблемы, так что они находятся за пределами Cucumber и становятся проблемами сценариев. Это держит Cucumber в теме. Его задача - описать ЧТО и ПОЧЕМУ и предоставить основу для автоматизации.

person diabolist    schedule 17.02.2020