Каков правильный баланс между единицей измерения ифункциональное тестирование в типичном веб-приложении?
-
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
Тесты должны выполняться быстро и помогать локализовать проблемы. Модульные тесты позволяют вам делать это только путем тестирования соответствующего модуля. Однако функциональные / интеграционные / приемочные тесты могут выполняться достаточно быстро в большинстве веб-сценариев. Р>
Однажды я прочитал, что модульный тест - это «Исполняемое требование», которое имеет для меня смысл. Если ваш тест не нацелен на доказательство бизнес-требований, тогда он действительно бесполезен. Если у вас есть подробные требования (а это кислотный тест), то вы напишете ряд модульных тестов для реализации каждого возможного сценария, который, в свою очередь, обеспечит целостность ваших алгоритмов и логики структуры данных. Если вы тестируете что-то, что не является обязательным требованием, но вы знаете, что оно должно быть верным для прохождения теста, скорее всего, вы пропустите требования.