Если метод вызывает другой метод, это модульный тест или интеграционный тест? - PullRequest
1 голос
/ 11 апреля 2019

Я новичок в концепции tdd, поэтому мой вопрос: если у меня есть метод, который вызывает другой метод, какой бы простой он не звучал, это модульный тест или интеграционный тест?Если это тест на интеграцию, то это просто потому, что мой метод вызывает другой метод, и там есть «интеграция» между методами?

Ответы [ 4 ]

4 голосов
/ 11 апреля 2019

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

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

Но TDD случился;и Кент Бек не был особенно дисциплинирован в своих определениях, и начали появляться новые идеи.

Даже в контексте TDD существуют тонкие разногласия по поводу того, что означает «модульный тест».Например, одна важная идея заключается в том, что тесты не должны быть чувствительны к порядку их выполнения;Каждый отдельный тест содержал все настройки и демонтаж, необходимые для правильного измерения системы.Другое состояло в том, что два теста, выполняющиеся одновременно в одном и том же процессе, не должны мешать друг другу;поэтому нет общего изменяемого состояния ..

Общей темой здесь является то, что test ограничен;«модульный тест» будет описывать тесты, которые имеют определенный набор свойств.

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

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

Добавляя еще больше путаницы к миксу, ритуалы, которые Бек и другие использовали с некоторым успехом, продавались в разное время как «Test First Development», «Test Driven Development», «Test Driven Design» -- что смутило мотивацию.Является ли цель test или design?

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

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

Но разногласия начинаются, когда мы заменяемдизайн, который не использует соавторов, с дизайном, который использует нестабильных соавторов (делегирование работы другим методам, особенно если они находятся в разных «классах»).

Будет ли это все еще модульным тестом, если мы изменим дизайн, чтобы разделить работу между нестабильными частями?Я вполне уверен, что Бек скажет «да», как и Фриман и Прайс.Я менее уверен насчет @JBrains;см. Интегрированные тесты - афера .Некоторые провели свои собственные эксперименты и пришли к выводу, что находят для них работы;другие интерпретируют «лучшие практики», описанные их любимыми экспертами.

Короче: это беспорядок.

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

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

1 голос
/ 13 апреля 2019

Я бы пошел дальше и постараюсь забыть о «единичных», «интеграционных», «поведенческих» или «приемочных» тестах, вместо этого разделить все тесты на две группы

  • Быстрые тесты
  • Медленные тесты
    • при доступе к внешним ресурсам (файловая система, база данных, веб-службы и т. Д.)
    • очень сложный контрольный пример для настройки

Путем насмешки над внешними ресурсами или очень сложными зависимостями вы можете переместить некоторые тестовые примеры в категорию «Быстрые» и обеспечить более быструю обратную связь с разработчиком.

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

Тогда «единица» станет единицей поведения, которая будет проверять поведение приложения и, насколько это возможно, сохранять приложение в качестве «черного ящика».

1 голос
/ 11 апреля 2019

Другой ответ действительно полезен, но давайте добавим эту мысль:

, если у меня есть метод, который вызывает другой метод

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

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

Другими словами, вы смотрите на цель, и «определение» какого «модуля» оборачивается: когда я пишу набор тестов, все из которых работают с открытыми методами одного класса Java, то, скорее всего,Это юнит-тесты.Может быть, я должен заглушить зависимости, может быть, я сделал отличный дизайн и зависимые блоки могут быть использованы без обходных путей.

«Следующий» уровень не является интеграционным тестированием.Это «функциональное» тестирование.Вместо того, чтобы смотреть «класс X делает то или это», вы спрашиваете «работает ли функция Y», не беспокоясь, нужен ли вам только класс X или 5 других классов.Вы заботитесь о большей (сквозной) функциональности, а не об отдельной «единице» организации кода.

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

0 голосов
/ 22 мая 2019

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

...