Простой запуск @Test
-аннотированного метода без параметров может решить эту проблему.
Вместо параметров в моем решении используются поля класса и метод конструктора @Factory
.
public class TestClass implements ITest {
protected String description;
protected int firstNumber;
protected int secondNumber;
protected int sum;
@Test
public void testProvider() {
/**
* Minus or plus here to make it fail or pass.
*/
assertEquals(this.sum, this.firstNumber - this.secondNumber);
}
@Factory(dataProvider = "summationProvider")
public TestClass(String description,
int firstNumber, int secondNumber, int sum) {
this.description = description;
this.firstNumber = firstNumber;
this.secondNumber = secondNumber;
this.sum = sum;
}
@DataProvider(name = "summationProvider")
public static Object[][] summationData() {
Object[][] testData = {{"TestName1", 1, 2, 3}, {"TestName2", 2, 2, 4}};
return testData;
}
@Override
public String getTestName() {
return this.description;
}
}
Вывод с форматированием из моей идеи IntelliJ:
Конечно, можно заставить @Factory
создавать экземпляр другого класса, а не того же TestClass
.
И если у вас есть 40 отдельных переменных из параметров и вы хотите, чтобы они были короткими... Добавьте класс, который будет держателем этих параметров, например. ParametrizedInput
. По крайней мере, это позволило бы скрыть все эти переменные экземпляра. Вы также можете поместить description
во второй класс (в этом случае рекомендуется использовать ThreadLocal<ParametrizedInput>
).
Второй класс будет увеличиваться с параметрами, но, поскольку это старый простой объект Java, он не должен ничего ломать в тесте. . Если вы не хотите устанавливать все эти переменные, другой идеей будет ленивый доступ к параметрам в тестах. Следуя совету эксперта (Кришнан Махадеван), я понял, что имя с методом можно установить с помощью @BeforeMethod
- и @AfterMethod
-аннотированные методы.
public class TestClass implements ITest {
protected static ThreadLocal<String> description
= new ThreadLocal<>();
protected ParametrizedInput input;
@BeforeMethod
public void setUp(Method method) {
this.description.set(this.description.get() + " " + method.getName());
}
@AfterMethod
public void tearDown(Method method) {
this.description.set(this.description.get().substring(0,
this.description.get().length() - method.getName().length()));
}
@Test
public void testProvider() {
assertEquals(this.input.getSum(),
this.input.getFirstNumber() / this.input.getSecondNumber());
}
@Test
public void anotherTestProvider() {
assertEquals(this.input.getSum(),
this.input.getFirstNumber() - this.input.getSecondNumber());
}
@Factory(dataProvider = "summationProvider")
public TestClass(String descriptionString, ParametrizedInput input) {
this.description.set(descriptionString);
this.input = input;
}
@DataProvider(name = "summationProvider")
public static Object[][] summationData() {
Object[][] testData = {{"TestName1", new ParametrizedInput(1, 2, 3)},
{"TestName2", new ParametrizedInput(2, 2, 4)}};
return testData;
}
@Override
public String getTestName() {
return this.description.get();
}
}
Класс владельца параметра:
public class ParametrizedInput {
private int firstNumber;
private int secondNumber;
private int sum;
public ParametrizedInput(int firstNumber,
int secondNumber, int sum) {
this.firstNumber = firstNumber;
this.secondNumber = secondNumber;
this.sum = sum;
}
public int getFirstNumber() {
return firstNumber;
}
public int getSecondNumber() {
return secondNumber;
}
public int getSum() {
return sum;
}
}
Результат:
person
Grzegorz Górkiewicz
schedule
10.03.2017