Как написать определение шага, которое сравнивает ответ json с таблицей схемы сценария - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть 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 и строка таблицы.

Ответы [ 2 ]

0 голосов
/ 17 февраля 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

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

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

0 голосов
/ 14 февраля 2020

Из комментариев кажется, что вам нужен способ сделать строку за строкой, в которой вы используете заголовки таблицы данных в качестве ключей для 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);
}

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

Однако, скорее всего, правильное решение - достаточно досадно - действительно переосмыслить ваш сценарий. Есть несколько действительно хороших рекомендаций для лучших практик и т. Д. c. на 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, и, судя по вашим данным, тесты на самом деле более тесно связаны с ожидаемыми вещами.

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

...