Вопрос

Я работаю над проектом PHP с надежным покрытием модульных тестов.

Я заметил, что в прошлый раз я совершаю очень хитрые манипуляции с юнит-тестами. Command-Line Test Runner' --фильтр команда.

Вот объяснение этой команды из официальной документации:

--фильтр

Запускает только тесты, имя которых соответствует заданному шаблону.Шаблон может быть либо именем одного теста, либо регулярным выражением, соответствующим нескольким именам тестов.

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

Мне интересно, это хорошая практика или нет?

Я слышал, что иногда полезно запустить весь набор тестов на вашей машине непрерывной интеграции, если ты знаешь наверняка что вы изменили только один компонент и 100% процент уверенности, что он не провалит модульные тесты других компонентов.Что вы думаете об этом?

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

Я понимаю, что «настоящие» юнит-тесты не должны взаимодействовать с БД, использовать макеты/заглушки, я с этим согласен.Но иногда гораздо проще (дешевле) использовать для тестов фикстуры БД.

Дайте пожалуйста совет, как можно решить эту проблему?

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

Решение

Хорошие модульные тесты должны:

  • Имейте четкие имена методов и имена переменных, которые будут служить документацией.
  • Беги быстро.Это также будет возможно для тестирования со сложной бизнес -логикой.Тест должен работать во время аваража что -то около 0,1 секунды.
  • Тестируйте ровно одну вещь в одном методе тестирования
  • Не интегрируйтесь с внешними ресурсами, такими как файловая система, электронная почта, базы данных, веб -сервисы и все остальное.Вы можете создать отдельные тесты интеграции базы данных для проверки инициации вашей базы данных.Эти тесты будут медленнее, чем ваш модульный тест большую часть времени.Я поместил свои интеграционные тесты в отдельный проект и запускаю их только тогда, когда работаю над кодом интеграции.Я также запускаю их на всех сборках на сервере CI.
  • Будьте полностью изолированы друг от друга.Если у вас есть тесты в зависимости от друг друга, вы не можете увидеть, в чем ваша проблема от чтения, какие тесты не сбой.Возможно, вам придется отладить, чтобы найти проблему.Изолированные тесты сэкономит вам много времени.

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

Реакция на:

«Но иногда гораздо проще (дешевле) использовать приспособления DB для тестов».

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

Лично я научился лучше тестировать,

  • читаю блоги об этом
  • читаю книги об этом
  • чтение проверенного кода, написанного другими
  • конечно, написание большого количества тестов.Мне потребовалось несколько тысяч тестов, чтобы научиться этому.

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

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

Мне интересно, это хорошая практика или нет?

Конечно, если вы время от времени запускаете полный набор модульных тестов (через CI-сервер звучит идеально).

Регулярное выполнение «интересных» тестов лучше, чем редкое выполнение всех тестов.

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

Если ваш полный набор тестов занимает > 15 минут, я бы попробовал разделить их и запустить параллельно.

Затем вы можете использовать --filter для запуска тестов, которые вас больше всего интересуют, затем дымовых тестов перед фиксацией, а остальные запускать с CI-сервера.

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