Эта функция включена в JUnit 4.11 .
Чтобы использовать изменение имени параметризованных тестов, вы говорите:
@Parameters(name="namestring")
namestring
является строкой, которая может иметь следующие специальные заполнители:
{index}
- индекс этого набора аргументов. По умолчанию namestring
это {index}
.
{0}
- первое значение параметра из этого вызова теста.
{1}
- значение второго параметра
- и так далее
Конечным названием теста будет название метода теста, за которым следуют namestring
квадратные скобки, как показано ниже.
Например (адаптировано из модульного теста для Parameterized
аннотации):
@RunWith(Parameterized.class)
static public class FibonacciTest {
@Parameters( name = "{index}: fib({0})={1}" )
public static Iterable<Object[]> data() {
return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
{ 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
}
private final int fInput;
private final int fExpected;
public FibonacciTest(int input, int expected) {
fInput= input;
fExpected= expected;
}
@Test
public void testFib() {
assertEquals(fExpected, fib(fInput));
}
private int fib(int x) {
// TODO: actually calculate Fibonacci numbers
return 0;
}
}
даст имена, как testFib[1: fib(1)=1]
и testFib[4: fib(4)=3]
. ( testFib
Часть имени является именем метода @Test
).
{0}
и{1}
есть массивы? Юнит должен в идеале звонитьArrays.toString({0})
, а не{0}.toString()
. Например, мойdata()
метод возвращаетArrays.asList(new Object[][] {{ new int[] { 1, 3, 2 }, new int[] { 1, 2, 3 } }});
.Глядя на JUnit 4.5, его исполнитель явно не поддерживает это, так как эта логика скрыта внутри частного класса внутри класса Parameterized. Вы не могли бы использовать JUnit Parameterized runner и создать вместо него свое собственное, которое бы понимало концепцию имен (что приводит к вопросу о том, как вы можете установить имя ...).
С точки зрения JUnit было бы неплохо, если бы вместо (или в дополнение к) просто передачи приращения они передавали аргументы с разделителями-запятыми. TestNG делает это. Если эта функция важна для вас, вы можете оставить комментарий к списку рассылки Yahoo, указанному на сайте www.junit.org.
источник
Недавно я столкнулся с той же проблемой при использовании JUnit 4.3.1. Я реализовал новый класс, который расширяет Parameterized под названием LabelledParameterized. Он был протестирован с использованием JUnit 4.3.1, 4.4 и 4.5. Он восстанавливает экземпляр Description, используя строковое представление первого аргумента каждого массива параметров из метода @Parameters. Вы можете увидеть код для этого на:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../LabelledParameterized.java?r=3789
и пример его использования по адресу:
http://code.google.com/p/migen/source/browse/trunk/java/src/.../ServerBuilderTest.java?r=3789
Описание тестов в Eclipse прекрасно форматируется, что я и хотел, так как это значительно облегчает поиск неудачных тестов! Я, вероятно, буду дорабатывать и документировать занятия в течение следующих нескольких дней / недель. Бросить '?' часть URL-адресов, если вы хотите кровоточить. :-)
Чтобы использовать его, все, что вам нужно сделать, это скопировать этот класс (GPL v3) и изменить @RunWith (Parameterized.class) на @RunWith (LabelledParameterized.class), предполагая, что первый элемент вашего списка параметров является разумной меткой.
Я не знаю, решают ли какие-либо более поздние выпуски JUnit эту проблему, но даже если бы они это сделали, я не могу обновить JUnit, так как все мои со-разработчики должны будут обновить тоже, и у нас есть более высокие приоритеты, чем повторная установка. Следовательно, работа в классе будет компилироваться несколькими версиями JUnit.
Примечание: есть некоторые jiggery-pokery, так что он работает с различными версиями JUnit, как указано выше. Версию, специально предназначенную для JUnit 4.3.1, можно найти здесь, а для JUnit 4.4 и 4.5 - здесь .
источник
execute[0], execute[1] ... execute[n]
в созданных отчетах об испытаниях.В
Parameterized
качестве модели я написал собственный тестовый набор / тестирование - заняло около получаса. Он немного отличается от darrenp тем,LabelledParameterized
что позволяет явно указывать имя, а не полагаться на первый параметрtoString()
.Он также не использует массивы, потому что я ненавижу массивы. :)
И пример:
источник
из junit4.8.2 вы можете создать свой собственный класс MyParameterized, просто скопировав класс Parameterized. измените методы getName () и testName () в TestClassRunnerForParameters.
источник
Вы также можете попробовать JUnitParams: http://code.google.com/p/junitparams/
источник
Вы можете создать метод, как
Хотя я бы не использовал его все время, было бы полезно выяснить, какой именно тест № 143.
источник
Я широко использую статический импорт для Assert и друзей, поэтому мне легко переопределить утверждение:
Например, вы можете добавить поле «имя» в ваш тестовый класс, инициализированный в конструкторе, и отобразить его при сбое теста. Просто передайте его в качестве первых элементов вашего массива параметров для каждого теста. Это также помогает маркировать данные:
источник
У меня ничего не получалось, поэтому я получил исходный текст для Parameterized и изменил его, создав новый тестовый запуск. Мне не пришлось много менять, но это работает !!!
источник
Обходной путь может заключаться в том, чтобы перехватить и вложить все Throwables в новый Throwable с настраиваемым сообщением, которое содержит всю информацию о параметрах. Сообщение появится в трассировке стека. Это работает всякий раз, когда тест завершается неудачей для всех утверждений, ошибок и исключений, поскольку все они являются подклассами Throwable.
Мой код выглядит так:
Трассировка стека неудачного теста:
источник
Проверьте JUnitParams, как упоминалось в dsaff, работает с использованием ant для построения параметризованных описаний методов тестирования в отчете html.
Это было после попытки LabelledParameterized и обнаружения, что, хотя он работает с eclipse, он не работает с ant в том, что касается отчета html.
Ура,
источник
Поскольку доступ к параметру (например, with
"{0}"
всегда возвращаетtoString()
представление), одним из обходных путей было бы сделать анонимную реализацию и переопределитьtoString()
в каждом случае. Например:источник