Подтвердить что ты не робот

Когда использовать тестовые скрипты для модульного тестирования?

В настоящее время я работаю над проектом, который работает уже более двух лет. В проекте широко используется модульное тестирование и сценарии пользовательского интерфейса. Первоначальные модульные тесты охватывали системную структуру, бизнес-правила и переходы состояний (или рабочий процесс). Тестовые скрипты используются для тестирования черного ящика. Однако со временем затраты на поддержание нашего полного набора единичных тестов стали все более дорогостоящими, особенно теми, которые касаются состояния.

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

Наш проект запускается на итеративной инкрементной модели.

4b9b3361

Ответ 1

В большей степени, чем один, я испытал ту же боль, что и у вас, например, в модульных тестах, особенно в проектах, в которых члены не испытывают энтузиазма по поводу модульного тестирования, и многие из них просто игнорируют или комментируют, чтобы иметь возможность обмануть контроль источника, сэкономить время и т.д. Один из бывших коллег даже придумал термин "Deadline Driven Development" для этого.

По моему мнению, когда вы сталкиваетесь с такой проблемой, ниже приведены некоторые рекомендации по тестированию модулей:

  • Отменить устаревшие тесты. Иногда бессмысленно пытаться обновить сотни-тысячи строк тестов, если они, по сути, неточны или неактуальны. Немедленно отменить тесты. Не игнорируйте их, не комментируйте их. Удалите их полностью.
  • Записать тесты для новой функциональности. Любые новые функции все еще нуждаются в тестировании и написании с использованием единицы измерения.
  • Записывать тесты для исправлений ошибок. При регрессионном тестировании приложения может быть важно убедиться, что исправления ошибок имеют модульные тесты, которые гарантируют исправление ошибки.
  • К черту охват кода. Это может заработать несколько downvotes, я уверен, но есть тонкая линия между обеспечением функциональности и использованием тестов в качестве предлога для задержки работы. Основное внимание должно быть уделено обеспечению основных функциональных возможностей, а не по любому проценту покрытия кода.

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

Ответ 2

Один из ответов на SO на вопрос "ограничения модульного тестирования" заключался в том, что модульное тестирование становится запутанным, когда оно используется для проверки чего-либо, что связано с INTEGRATION, а не с функцией. Подключение к внешним сервисам и их использование (база данных, SSH'ing на другой сервер и т.д.) И пользовательские интерфейсы были двумя из используемых примеров.

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

Я использую "script тесты" для всего моего пользовательского кода JavaScript JavaScript (механизм шаблонов, эффекты и анимации и т.д.), и я нахожу его быстрым и надежным, если все сделано правильно.

Ответ 3

Обычно вы используете Unit Tests, чтобы выполнить именно это: тестовые единицы. Более точно, чтобы проверить, соответствует ли устройство спецификации интерфейса/контракта. Если сбой unit test, вы точно знаете, где проблема: он находится в тестируемой единице. Это облегчает отладку, особенно потому, что результат unit test может обрабатываться автоматически. Здесь приводятся тесты автоматической регрессии.

Вы начинаете использовать скриптовые тесты пользовательского интерфейса, если вы либо хотите покинуть область модульных тестов, либо хотите проверить те вещи, которые не могут быть хорошо протестированы с модульными тестами. Например. когда вы проверяете код, который взаимодействует с большим количеством внешних API, которые вы не можете высмеять. Теперь вы можете спровоцировать определенные ошибки, но отслеживать, где именно в коде сбой похож, намного сложнее.

Ответ 4

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

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

Пример функционального домена: Шина Service Layer Bus, то есть все проекты (обычно инкапсулирующие некоторые основные референтные базы данных), способные раскрывать свои службы на шине.
Вы можете:

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

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

Ответ 5

Две разные вещи

  • Unit Tests - Developer - проверьте правильность кода.
  • Приемочные тесты - Клиент /QA/BA - убедитесь, что правильный код разработан.

Две категории должны быть различны, и оба играют не менее важную роль. Отбрасывание одного не сулит ничего хорошего. Тестируемые сценарии, как вы упомянули, попадают во вторую категорию. Я бы рекомендовал что-то вроде FIT/Fitnesse для этой цели. Если это невозможно, то инструменты сценариев/записи-воспроизведения. Но не выбрасывайте хорошие модульные тесты. Что вы подразумеваете под "стоимостью поддержания тестов, стало дорого"?

Ответ 6

Мое предположение заключается в том, что затраты на обслуживание для ваших модульных тестов увеличиваются, потому что архитектура вашего приложения разрешается разваливаться. Поскольку никто, кроме вас, не знает, что в вашем коде, вы можете применить метод five whys, чтобы решить, какова ваша настоящая, существенная, корневая проблема. Модульные тесты IME никогда не должны быть дорогостоящими для обслуживания, если вы используете сильно развязанную архитектуру на основе интерфейсов.