Это четвертый пост об атрибутах теста, который был описан в еще более известном посте « Как проверить свои тесты ». Если вы хотите тренироваться и / или тренироваться по тестированию, свяжитесь со мной .
Точность заключается в точном определении местоположения ошибочного кода. Если мы знаем, где находится нарушающий код, мы можем легко проанализировать, какую проблему мы вызвали, и перейти к ее устранению.
Тривиальный пример — это тесты, которые проверяют разные методы. Конечно, если один из них выходит из строя, мы знаем, где искать.
Вот еще один простой пример того же метода. У нас есть класс PositiveCalculator, в котором его метод Add добавляет два положительных числа или выдает исключение, если они не столь положительны:
1
2
3
4
5
6
7
|
public int Add( int a, int b) { if ((a < 0 ) || (b < 0 )) throw new ArgumentException(); return a + b; } |
Затем мы можем написать следующие тесты:
01
02
03
04
05
06
07
08
09
10
11
12
|
[Test] public void AddTwoPositiveNumbers_GetResult() { PositiveCalculator calculator = new PositiveCalculator(); Assert.That(calculator.Add( 2 , 2 ), Is.EqualTo( 4 )); } [Test] public void AddTwoNegativeNumbers_Exception() { PositiveCalculator calculator = new PositiveCalculator(); Assert.Throws<ArgumentException> (() => calculator.Add(- 5 , - 5 )); } |
Глядя на тесты, мы уже видим, что они проверяют два разных поведения. Когда мы объединяем то, что мы читаем из тестов, и проверенный код, легко связать части кода с каждым тестом. Так что, если один из них потерпит неудачу, мы будем знать, где искать.
К сожалению, код не всегда выглядит так. Обычно это начинается так, но затем вырастает до функций размера монстра. Когда он это делает, он либо становится непроверенным, либо подвергается тестам, которые являются большими, накладываются друг на друга и тестируют несколько вещей. Ни один из этих тестов не является точным.
Так что мы можем сделать?
Давайте начнем с превентивной меры: не позволяйте коду расти. Будьте беспощадны в отношении того, чтобы методы были небольшими, и используйте принцип единой ответственности, чтобы извлечь код в небольшие, легко тестируемые и точные функции.
Но я не написал этот код!
Как мне сделать мои тесты точными?
Вот что вы можете сделать. Теперь, когда у вас есть тест или несколько из них, самое время их использовать: начните рефакторинг кода. Наличие тестов на месте скажет вам, что вы ломаете вещи, и очень легко вернуться в рабочий режим, потому что рефакторинг также выполняется небольшими шагами.
После того, как вы разбили код на более мелкие части, теперь вы можете писать меньшие тесты, которые дают вам точность, которой не было у больших тестов. На самом деле, вы можете заменить большие тесты на несколько меньших, если они дают лучшую информацию и производительность для того же покрытия.
Мы также можем сделать тесты более точными с помощью следующих методов:
- Одно утверждение на тест — Когда вы проверяете только одну вещь, есть вероятность, что ваш тест более точен, чем при проверке нескольких вещей. Если в ваших тестах есть больше утверждений, разбейте их на несколько тестов.
- Тестирование более коротких сценариев. В унаследованном коде заманчиво тестировать большие сценарии, поскольку код выполняет много задач и не предоставляет точек входа для отдельных операций. Попробуйте протестировать более короткие сценарии, а не длинные, и более мелкие объекты, а не большие. Попробуйте разбить длинные сценарии на короткие. Если вы используете большие тесты для рефакторинга кода, вы можете написать меньшие, более точные тесты.
- Подделяйте несвязанные вещи — если у вас есть зависимости, которые делают несколько вещей и, следовательно, создают более длинные сценарии, насмехайтесь над ними. Вы сделаете тест более точным, потому что теперь он проходит через интересующий вас код.
- Проверьте покрытие — Визуально, если это возможно. Среды IDE и инструменты, которые демонстрируют визуальное покрытие кода, являются великолепными, поскольку они добавляют еще один визуальный ключ к пониманию того, где находится затронутый код. В тривиальном коде они не имеют большого значения, но в сложном коде вы можете сравнивать пути различных тестов, и, применяя некоторые исключения, вы можете выяснить, где проблемы. Вы также можете использовать визуальные пути в качестве обратной связи с тем, насколько точны ваши тесты, а если нет, то сделайте их более точными.
Точность помогает нам быстро решать проблемы. Но это определенно не так легко найти, потому что это очень сильно зависит от тестируемого кода. Однако, используя комбинацию методов, которые я предложил, и используя работу по тестированию для рефакторинга и упрощений, точность теста определенно достижима.
Ссылка: | Атрибут теста № 4 — Точность от нашего партнера по JCG Джила Зильберфельда в блоге Geek Out of Water . |