Каков правильный баланс между единицей измерения ифункциональное тестирование в типичном веб-приложении?

StackOverflow https://stackoverflow.com/questions/312904

  •  10-07-2019
  •  | 
  •  

Вопрос

Модульные тесты дешевле писать и поддерживать, но они не охватывают все сценарии.Каков правильный баланс между ними?

Это было полезно?

Решение

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

С этими рамками возникает вопрос баланса, что мне нужно прямо сейчас?

Другие советы

важно проводить различие между целью и масштабом этих двух типов тестов:

  • a модульный тест обычно тестируется определенная функция на уровне модуля / класса, напримерcreate-X, update-Y, foo-the-bar, compact-the-whizbang и т.д.Один класс может иметь несколько модульных тестов

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

этими двумя типами тестов являются не взаимозаменяемы, и являются в целом непересекающийся.Таким образом, идея достижения "баланса" между ними не имеет никакого смысла.Они либо нужны тебе, либо нет.

если вы имеете в виду простоту кодирования каждого типа тестов в вашей платформе тестирования, это другой вопрос, но использование платформы (скажем, NUnit противпользователь-бот) не меняет тип / характер теста.

лучшим "балансом", в общем, было бы модульное тестирование на достоверность и полноту и функциональное тестирование на приемлемость для клиента

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

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

Если это поможет, вот мои категории тестирования.

Разработчики начинают изнутри и работают вовне, сосредоточившись на коде:

  • Утверждения - проверка потока данных и структур
  • Отладчик - проверка потока кода и данных
  • Модульное тестирование - проверка каждой функции
  • Интеграционное тестирование - проверка подсистем
  • Тестирование системы - проверка функциональности
  • Регрессионные тесты - убедитесь, что дефекты остаются исправленными
  • Тесты безопасности - убедитесь, что в систему нелегко проникнуть.

Тестировщики начинают снаружи и работают изнутри, сосредотачиваясь на функциях:

  • Приемочные испытания - проверка требований конечного пользователя
  • Сценарные тесты - проверка реальных ситуаций
  • Глобальные тесты - проверка допустимых входных данных
  • Регрессионные тесты - убедитесь, что дефекты остаются исправленными
  • Тесты юзабилити - убедитесь, что система проста в использовании
  • Тесты безопасности - убедитесь, что в систему нелегко проникнуть
  • Покрытие кода - тестирование нетронутого кода
  • Совместимость - с предыдущими версиями
  • Ищу причуды и шероховатости.

Конечные пользователи работают извне и, как правило, не уделяют особого внимания:

  • Приемочные испытания - проверка требований конечного пользователя
  • Сценарные тесты - проверка реальных ситуаций
  • Тесты юзабилити - убедитесь, что система проста в использовании
  • Ищу причуды и шероховатости.

В приложении, над которым я сейчас работаю, вероятно, есть функциональные тесты с соотношением 10: 1. Модульные тесты работают просто как извлечение сущностей из БД, тесты обработки ошибок для БД / подключения к сети и т. Д. Эти вещи выполняются быстро - минуты или меньше и ежедневно выполняются разработчиками.

функциональные тесты, в то время как меньшее количество, как правило, являются подходом для кухонной мойки - может ли пользователь выполнить заказ и т. д., как правило, покрывают деловую сферу. Конец вещей управляется бизнес-анализом и операциями - к сожалению для нас, часто вручную. Эти вещи занимают недели и обычно завершают цикл выпуска.

Мой текущий проект покрывает около 60% модульных тестов, и все пользовательские истории имеют охват счастливых дней в пользовательских тестах на селен, некоторые имеют дополнительное покрытие.

Мы постоянно обсуждаем это: есть ли смысл подталкивать охват юнит-тестом все более и более абсурдных сценариев для гораздо более высокого охвата?

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

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

Стоимость выполнения - еще одна проблема. У нас есть небольшой кластер коробок, в которых все эти тесты выполняются постоянно.

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

Первоначально я сильно склонялся к предпочтению модульных тестов функциональным / приемочным тестам из-за начального фактора стоимости приемочных тестов.Однако со временем я изменил свою философию и теперь являюсь убежденным сторонником выбора приемочных тестов везде, где это возможно, и использования модульных тестов только тогда, когда приемочные тесты не могут удовлетворить мои потребности.

Основное соображение, лежащее в основе выбора приемлемости по сравнению с модульными тестами, такое же, как и основное соображение для ТВЕРДЫЙ код.Ваша реализация должна быть способна кардинально измениться с помощью рефакторинга и т.д., но все бизнес-кейсы - приемочные тесты - должны оставаться неизмененными и подтверждать приемлемое поведение системы (тесты пройдены).В модульных тестах часто наблюдается естественная сильная связь теста с кодом реализации.Несмотря на то, что это тестовый код, это все равно код, и сильной связи, как мы знаем, следует избегать.Выбирая приемочные тесты, вы часто спускаетесь по спирали успеха к созданию хорошо спланированных, расходуемых несвязанных API, позволяющих изменять вашу реализацию за кулисами, не заставляя меняться ваши тесты.Кроме того, ваши мысли разработчика о реализации согласуются с мыслями о поведении бизнес-системы.В конце концов, я нахожу, что все это лучше для бизнеса и для удовлетворения потребностей программистов.

С точки зрения теории я часто спрашиваю себя, если фрагмент кода не может быть протестирован с помощью приемочного теста, то почему этот фрагмент кода должен существовать?Т.е. - если это не является частью допустимого бизнес-сценария, то добавляет ли этот код ценность или он существует в настоящее время и останется ли он исключительно дорогостоящим?

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

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

Джей БИ http://jb-brown.blogspot.com

Тесты должны выполняться быстро и помогать локализовать проблемы. Модульные тесты позволяют вам делать это только путем тестирования соответствующего модуля. Однако функциональные / интеграционные / приемочные тесты могут выполняться достаточно быстро в большинстве веб-сценариев.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top