Где вы положили свой юнит-тест?

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

  1. Одна папка для производительного кода, другая для модульных тестов: это отделяет модульные тесты от логических файлов проекта. Такое разделение интересов является не только неприятностью, но и преимуществом: кто-то, изучающий исходный код проекта, будет - так что я полагаю - либо просмотрите реализацию, либо юнит-тесты (или, более часто: только реализацию). Преимущество модульных тестов, являющихся еще одной точкой зрения для ваших классов, потеряно - эти две точки зрения просто слишком далеко друг от друга IMO.
  2. Аннотированные методы тестирования. Любая известная мне современная модульная среда тестирования позволяет разработчикам создавать специальные методы тестирования, аннотировать их (@test) и встраивать их в код проекта. Большой недостаток, который я вижу здесь, состоит в том, что файлы проекта загромождены. Даже если эти методы разделены с помощью заголовка комментария (например, UNIT TESTS ниже этой строки), он просто излишне раздувает класс.
  3. Тестовые файлы в тех же папках, что и файлы реализации. Наше соглашение об именах файлов требует, чтобы файлы PHP, содержащие классы (по одному классу на файл), заканчивались на .class.php. Я мог предположить, что помещение модульных тестов, касающихся файла класса, в другой файл, заканчивающийся на .test.php, предоставит тесты гораздо более значимым для других разработчиков, не портя класс. Несмотря на то, что он раздувает папки проекта, а не файлы реализации, это мой любимый вариант, но у меня есть сомнения: я думаю, что другие уже придумали это и отказались от этой опции по какой-то причине (то есть я не видел java-проект с файлами Foo.java и FooTest.java в одной папке.) Возможно, это связано с тем, что разработчики java интенсивнее используют IDE, что облегчает им доступ к тестам, тогда как в PHP не появилось больших редакторов (например, eclipse для java) - многие разработчики, которых я знаю, используют vim/emacs или подобные редакторы с небольшой поддержкой самой разработки PHP.

Каков ваш опыт с любым из этих юнит-тестов? У вас есть другое соглашение, которое я не перечислил здесь? Или я просто переоцениваю доступность юнит-тестов для рецензентов?

3 ответа

Я предпочитаю хранить юнит-тесты в отдельных исходных файлах в том же каталоге, что и рабочий код (#3).

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

В C++ у меня обычно три файла на класс:

MyClass.h
MyClass.cpp
t_MyClass.cpp

Если вы используете Vim, то мой плагин toggle_unit_tests для переключения между исходным и модульным тестовыми файлами может оказаться полезным.

В настоящее время рекомендуется разделять модульные тесты на их собственный каталог #1. Все системы "соглашения о конфигурации" делают это так, например. Maven, Rails и др.

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

Я всегда иду на #1. Пока приятно, что они рядом. Мои причины следующие:

  • Я чувствую, что есть разница между основной кодовой базой и юнит-тестами. Мне нужно настоящее разделение.
  • Конечным пользователям редко нужно смотреть на юнит-тесты. Они просто заинтересованы в API. Хотя хорошо, что юнит-тесты предоставляют отдельный взгляд на код, на практике я чувствую, что он не будет использоваться для лучшего понимания. (более описательная документация + примеры делают).
  • Поскольку конечным пользователям редко нужны юнит-тесты, я не хочу путать их с большим количеством файлов и / или методов.
  • Мои стандарты кодирования не так строги для юнит-тестов, как для основной библиотеки. Возможно, это только мое мнение, но меня не волнуют стандарты кодирования в моих тестах.

Надеюсь это поможет.

Другие вопросы по тегам