В какой момент вы достигаете избыточного убийства в модульном тестировании? - PullRequest
15 голосов
/ 23 января 2010

В настоящее время я работаю над проектом, в котором я тестирую модули с помощью NUnit, работаю над Moq, пишу спецификации для MSpec и играю с тестированием пользовательского интерфейса с WebAii.

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

Есть ли момент, когда юнит-тестирование становится немного абсурдным? Можно ли переусердствовать? Какие разумные тесты написать, а какие, на ваш взгляд, просто лишние детали?

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

Ответы [ 5 ]

29 голосов
/ 23 января 2010

Можно ли использовать сразу несколько сред тестирования?

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

Итак, когда вы достигнете избыточного тестирования юнитов ?

Вы быстро достигнете юнит-тестирования "перебор" и, возможно, уже достигли его. В целом, существует несколько способов переусердствовать с тестированием, которое противоречит цели TDD , BDD , ADD и любому подходу, который вы используете. Вот один из них:

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

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

Таким образом, при написании модульных тестов есть пара приятных мест , о которых следует помнить при написании тестов:

unit test                 dirty hybrids               integration test
---------                 -------------               ----------------
* isolated                                            * using many classes 
* well defined                  |                     * tests a larger feature
* repeatable                    |                     * tests a data set
                                |
    |                           |                              |
    |                           |                              |
    v                           v                              v

    O  <-----------------------------------------------------> O 

    ^                           ^                              ^
    |                           |                              |

sweet spot              world full of pain                sweet spot

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

Мораль этой истории в том, что не путайте юнит-тесты с интеграционными тестами. Потому что просто: они разные . Это не означает, что тесты других типов плохие, но вместо этого они должны рассматриваться скорее как спецификации или проверки работоспособности. Если тесты прерываются, они могут не указывать на неправильность кода. Например:

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

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

Вам нужно постоянно писать тесты?

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

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

… затем напишите его и протестируйте как ручной тестовый пример. Это не стоит, если написание контрольного примера займет несколько дней, а ручное тестирование займет всего минуту.

4 голосов
/ 23 января 2010

Вы переусердствовали, если снова и снова проверяете один и тот же ввод.

Пока каждый новый тестовый тест проверяет что-то свое, у вас все в порядке.

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

Я обычно проверяю границы. Если бы я написал функцию Фибуначчи, я бы проверил ее на значения -1, 0, 1, 10 и Maxvalue целого числа. Тестирование на 20 или 509 не проверяет ничего, что еще не было рассмотрено.

3 голосов
/ 23 января 2010

Если вы потратили больше времени на тесты, чем на кодирование, возможно, вы переусердствовали. Но это мое личное мнение. Вам может быть интересно взглянуть на Test-Driven Development как на хороший способ начать с тестов, гарантируя, что вы напишите необходимый код и напишите его так, как он должен работать (http://en.wikipedia.org/wiki/Test-driven_development)

Удачи!

2 голосов
/ 23 января 2010

Нет такой вещи, как переоценка! Конечно, вы не хотите делать это. Учитывая метод

public void tripleInt(int i);

Вы не хотите проверять его на бесконечное число целых. Это не будет практичным. Вы, вероятно, хотите проверить положительный, отрицательный, Integer.Max и т. Д.

0 голосов
/ 25 июля 2017

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

Точка юнит-тестов:

  1. Проверка репрезентативного набора входов для данного блока A (если один блок тестирует больший блок B, содержащий блок A, может случиться так, что набор входов, рассматриваемый как репрезентативный для блока B, не приведет к репрезентативный набор входов для блока А).
  2. Определите с максимальной точностью, где код нарушается.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...