Есть ли смысл писать логические тесты с помощью JBehave?

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

Взяв это за отправную точку, я попросил тестировщика написать истории для тестового приложения (ката игры в боулинг дяди Боба). В конце дня мы попытались сопоставить его тесты с игрой в боулинг.

Я ожидал такого теста:

Given a bowling game
When player rolls 5
And player rolls 4
Then total pins knocked down is 9

Вместо этого тестер пришел с «логическими тестами», другими словами, он не был таким конкретным. Но, с его точки зрения, это было действительное испытание.

Given a bowling game
When player does a regular throw
Then score should be calculated appropriately

Моя проблема с этим - двусмысленность, что такое «обычный бросок»? Что такое "должным образом"? Что это будет означать, если один из этих шагов не удастся?

Тем не менее, тестировщик говорит, что человек все-таки понимает, и что я искал «физические тесты», которые было бы более громоздко писать.

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

Вот мне интересно, как вы к этому относитесь? Как вы пишете свои тесты JBehave? И есть ли у вас опыт, когда эти тесты пишете не вы, и вам приходится сопоставлять их со своим кодом?


person Stefan Hendriks    schedule 17.09.2011    source источник


Ответы (5)


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

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

Но представьте себе более сложную область, например финансы. Для этого, вероятно, было бы лучше иметь более явные примеры, чтобы обеспечить хорошее понимание требования.

В качестве альтернативы, скажем, у вас есть сценарий:

Given I try to sign up with an invalid email address
Then I should not be registered

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

person Andy Waite    schedule 17.09.2011
comment
То есть, вы бы сказали, что достаточно разработать несколько конкретных примеров вместе с логическими тестами? - person Stefan Hendriks; 18.09.2011
comment
Да, сочетание двух стилей часто является лучшим подходом. - person Andy Waite; 19.09.2011

Его тест валиден, но требует определенных знаний предметной области, которых не будет ни у одного фреймворка. Автоматические тесты должны быть явными, думайте о них как о примерах. Их написание стоит дороже, чем написание «логических тестов», но в долгосрочной перспективе это окупается, поскольку их можно воспроизвести по желанию, очень быстро и получить немедленную обратную связь.

Вы должны были в паре с ним написать первые тесты, чтобы направить их в правильном направлении. Возможно, вы могли бы дать ему свой тест и попросить его увеличить охват, добавив новые тесты.

person philant    schedule 17.09.2011
comment
Я объединился с ним после того, как позволил ему писать тесты, чтобы проверить, будет ли это соответствовать его способу работы. Позже мы сели и написали несколько физических тестов. Но нам все еще нужно найти способ, с которым мы оба можем работать. Однако, возможно, мы можем сделать и то, и другое. Мы могли бы проводить логические тесты, но нам также нужны физические тесты, чтобы убедиться, что логические тесты не неоднозначны. То есть у нас есть физические тесты, говорящие о том, что такое «обычный» бросок. - person Stefan Hendriks; 18.09.2011

Я ненавижу такие расплывчатые слова, как "соответствующим образом" в "ожидаемых значениях". «Соответственно» — это просто пример «ядовитого слова» для тестирования, и если его не устранить, этот «подход» может получить широкое распространение, эффективно убивая тестирование в целом. Для тестировщика-человека этого может быть "достаточно", но такие "тесткейсы" приемлемы только при первых попытках исследовательского "дымового теста".

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

То, что сделал ваш тестер, было скорее «областью тестирования», «шаблоном сценария», а не реальным тестовым набором: поскольку может быть получено так много возможных результатов тестирования... Вы были конкретны в своем сценарии: это был очень специфическим реальным «тестовым случаем». Можно автоматизировать ваш тестовый пример, приятно: вы можете делегировать его на машину и автоматически оценивать его так часто, как вам нужно. (с бонусом автоматического отчета с сервера непрерывной интеграции)

Но "пустой шаблон тестового сценария"? Это также имеет некоторую ценность: это «шаблон сценария», пустой скелет, подготовленный для заполнения данными: поэтому я люблю называть эти ситуации «DDT»: «Тестирование на основе данных».

Представьте веб-форму, которую нужно протестировать, с проверкой ее 10 входных данных, с перекрестной проверкой... И с кнопкой отправки. Для каждого входа может быть 10 тестовых случаев:

  • пустой;
  • с обуглившимся, но все равно слишком коротким;
  • слишком длинно для сервера, но разрешено внутри формы для копирования-вставки и дальнейших правок;
  • с недопустимыми символами...

Подход, который я рекомендую, состоит в том, чтобы подготовить набор данных для прохождения: даже для их генерации (из БД или даже случайным образом), все, что вы можете предсказать, должно пройти тест, «счастливый сценарий». Держите данные в стороне, как шаблон данных, и используйте их для инициализации формы, для ее заполнения, а затем для разбивки некоторого единственного значения: Создайте тестовые примеры «на провал». Сделайте это, т.е. 10 раз для каждого отдельного входа, для каждого из 10 входов (100 тестовых случаев даже до попытки перекрестных правил) ... и затем, после 100 раз отказа формы сервером, заполните форма по проходным данным, не искажая их, чтобы форма могла быть принята окончательно. (принят статус отправки изменений в серверном приложении, поэтому нужно идти последним, чтобы проверить все 101 случай в одном и том же состоянии приложения)

Чтобы провести тест таким образом, вам нужны две вещи:

  • пустой шаблон сценария,
  • and a table of 100 rows of data:
    • 10 columns of input data: with only one value manipulated, as passing row by row down the table (i.e. ever heard about grey-code?),
    • возможно, сохранение истории наследования в описании строки, откуда получена строка и как, через какое управляемое значение.
    • Также 11-й столбец, заполненный столбец (столбцы) «ожидаемый результат»: ожидаемый статус «пройдено/не пройдено», сообщение об ожидаемой ошибке/проверке, ссылка на требования для отслеживания покрытия тестами. (т.е. когда-нибудь видели FitNesse?)
    • И, возможно, также столбец для реального обнаруженного результата при выполнении теста, чтобы отслеживать историю тестового примера с одной строкой. (так уже упоминался сервер CI)

Чтобы совместить «пустой каркас сценария» с одной стороны и «таблицу данных для проведения теста» с другой стороны, действительно нужен какой-то механизм. И ваши данные должны быть импортированы. Таким образом, вы можете подготовить строки в Excel, которые теоретически также могут быть импортированы, но для облегчения жизни я рекомендую либо CSV, свойства, XML, либо просто любой машиночитаемый формат, текстовый формат.

person Franta    schedule 10.07.2017

Его «логический тест» имеет то же информационное содержание, что и фраза «проверить регулярный счет в боулинге» в плане тестирования или списке TODO. Но значительно длиннее, оттого и хуже.

Использование jbehave вообще имеет смысл только в том случае, если команда тестирования отвечает за создание тестов с большим количеством информации, чем это. В противном случае было бы более эффективно взять список TODO и закодировать его в JUnit.

person soru    schedule 16.06.2012

И я люблю такие слова, как «соответствующим образом» в «ожидаемых значениях». Вам нужно использовать огурец или другие обертки в качестве общей документации. Если вы используете его, чтобы охватить и указать все возможные сценарии, вы, вероятно, тратите много времени на прокрутку сотен файлов функций.

person Imlus    schedule 01.09.2017
comment
указать все возможные сценарии - в общем, надо сложность перевести в количество, т. адрес только один случай (пусть узкий, но конкретный: то есть в предварительных условиях). ...вместо одного общего сценария, который либо неясен (и, следовательно, не автоматизирован, непригоден для использования), либо имеет так много подслучаев, обнаруженных внутри IF, что его невозможно измерить - что он действительно проверил, что есть / нет покрытый. - person Franta; 13.01.2018
comment
Итак, еще раз: я действительно ненавижу соответственно, как слишком расплывчатый/неконкретный/сложный. ...вместо того, чтобы быть KISS: a] очень конкретным (можно даже назвать это многословным) в предварительных условиях, b] поэтому это может быть очень KISS в ожидаемом, то есть таким простым, как True/False. -- Уместное в предварительных условиях является бесполезным вариантом использования, ни уместным в результате, так как ожидаемое должно быть четко сформулировано, действительно выражено/сформулировано. ›› Appropriately=void - я не знаю, чего ожидать, поэтому не совсем сформулированный тест: Там нет утверждения. - person Franta; 13.01.2018