Каков рекомендуемый способ регистрации данных, которые вызвали ошибки в JUnit? - PullRequest
2 голосов
/ 14 февраля 2009

Я относительно новичок в JUnit, и я написал несколько своих первых тестов сегодня. Для какого-то конкретного метода я хотел передать случайные значения (все из которых находятся в правильном диапазоне). Если метод по какой-либо причине дает сбой, я хочу знать, какое значение вызвало его сбой. Так каков рекомендуемый способ сделать это?

(Или плохо использовать случайные значения в тестах JUnit?)

Ответы [ 7 ]

3 голосов
/ 14 февраля 2009

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

Это Fuzz Testing и это мощный метод, но он наиболее полезен, когда у вас нет доступного исходного кода или при тестировании системы со сложным внутренним состоянием и множеством взаимодействий .

Более полезным типом тестирования для вас может быть тестирование белого ящика , когда тестовые входы преднамеренно выбраны для охвата различных классов ввода, которые вы можете получить. JTest представляется автоматизированным инструментом для этого в Java. MS Research поставляет PEX для c #).

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

2 голосов
/ 15 февраля 2009

Вы пробовали использовать методы assertThat и Hamcrest Matchers, которые являются частью JUnit 4.4+? Проверьте README [1] и найдите «assertThat».

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

[1] http://junit.sourceforge.net/README.html

2 голосов
/ 14 февраля 2009

Просто сообщите фактические и ожидаемые значения в параметре «диагностическое сообщение» ваших утверждений. Это обычная практика для тестов JUnit, и «вспомогательные» методы assert делают это по умолчанию, например, assertEquals скажет что-то вроде «ожидал 6 и получил 7».

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

2 голосов
/ 14 февраля 2009

Вы можете попытаться использовать: http://www.openfuture.de/Log4Unit/ для регистрации, , но Я бы рекомендовал использовать случайные значения для модульных тестов, поскольку они должны повторяться. Если вы хотите проверить множество значений, просто используйте цикл for и внесите некоторые изменения в значение индекса, что легко повторяется.

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

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

1 голос
/ 16 февраля 2009

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

0 голосов
/ 16 февраля 2009

Вы можете иметь повторяемые случайные значения, предоставляя постоянное начальное число генератору случайных чисел. В Java создайте java.util.Random с фиксированным видимым и передайте классу в качестве параметра конструктора (внедрение зависимости). Как это:

new ClassUnderTest(new Random(123L));

В зависимости от того, что вы тестируете, вы можете также отделить генерацию случайных значений от их использования. Если у вас есть класс X, который принимает случайные значения в диапазоне от 1 до 10, то вы можете проверить его, передав ему значения ребер 1 и 10 и некоторое значение из середины, например 4. Затем вам потребуется еще один тест для производителя этих случайные значения. Например, дайте ему java.util.Random с фиксированным начальным числом, сгенерируйте 100 значений и убедитесь, что все они находятся в допустимом диапазоне.

0 голосов
/ 14 февраля 2009

Если ваш модульный тест не пройден по какой-либо причине, вы увидите красный светофор в тестовом средстве. Бегущий по тестам также покажет вам, какой метод теста не удался, и в журнале тестового теста будет более подробно (например, трассировка сброшенного стека) Расследуйте эту ошибку, исправьте ее, и ваш тест никогда не будет повторяться, если вы не нарушите код.

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

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

...