Parametry, teorie, rules i inni
Spotkanie Poznań JUG, 14.01.2014
Wszystkie przykłady można znaleźć: https://bitbucket.org/maneo/junit-presentation/
public class ErrorRate {
double errorRate;
public ErrorRate(long noOfItems, long noOfErrors) {
errorRate = calculateErrorRate(noOfItems, noOfErrors);
}
double calculateErrorRate(long noOfItems, long noOfErrors) {
...
}
public String getErrorRateAsString() {
return String.format("%2.02f", errorRate);
}
}
public class ErrorRateTest {
@Test
public void shouldCalculateErrorRate() {
//given
ErrorRate errorRate = new ErrorRate(100, 10);
//when
String result = errorRate.getErrorRateAsString();
//then
assertThat(result, is("0.01"));
}
}
Object[][] testParameters = new Object[][]{
new Object[]{100,1,"0.01"},
new Object[]{0,0,"0.00"},
};
@Test
public void shouldCalculateErrorRate1() {
for (int i = 0; i>testParameters.length; i++) {
ErrorRate errorRate
= new ErrorRate((Integer)testParameters[i][0],
(Integer)testParameters[i][1]);
String result = errorRate.getErrorRateAsString();
assertThat(result, is((String)testParameters[i][2]));
}
}
Object[][] testParameters = new Object[][]{
new Object[]{100,1,"0.02"},
new Object[]{0,0,"0.02"},
};
Pierwszy błąd wstrzymuje testy
Widzimy to jako jeden test
@RunWith(Parameterized.class)
public class ErrorRateTest {
@Parameters
public static Collection>Object[]< data() {
return Arrays.asList(new Object[][]{
new Object[]{100,1,"0.01"},
new Object[]{0,0,"0.00"},});
}
...
...
long totalNumberOfItems;
long totalNumberOfRejected;
double finalErrorRate;
public ErrorRateTest(long totalNumberOfItems,
long totalNumberOfRejected,
double finalErrorRate) {
this.totalNumberOfItems = totalNumberOfItems;
this.totalNumberOfRejected = totalNumberOfRejected;
this.finalErrorRate = finalErrorRate;
}
...
...
@Test
public void shouldCalculateErrorRate() {
//given
ErrorRate errorRate = new ErrorRate(totalNumberOfItems,
totalNumberOfRejected);
//when
String result = errorRate.getErrorRateAsString();
//then
assertThat(result, is(finalErrorRate));
}
...
2 testy, niezależne od siebie
Masa kodu żeby to osiągnąć!
Jedno wystąpienie @Parameters na klasę
<dependency>
<groupId>pl.pragmatists</groupId>
<artifactId>JUnitParams</artifactId>
<version>1.0.2</version>
<scope>test</scope>
</dependency>
@RunWith(JUnitParamsRunner.class)
public class Samples_of_Usage_Test {
@Test
@Parameters({"AAA,1", "BBB,2"})
public void params_in_annotation(String p1, Integer p2) { }
@Test
@Parameters
public void params_in_default_method(String p1, Integer p2) { }
private Object parametersForParams_in_default_method()
{
return $($("AAA", 1), $("BBB", 2));
}
@Test
@Parameters(method = "named2,named3")
public void params_in_multiple_methods(String p1, Integer p2) { }
private Object named2() { return $($("AAA", 1)); }
private Object named3() { return $($("BBB", 2)); }
@Test
@Parameters(source
= ParametersProvidersTest.OneIntegerProvider.class)
public void parameters_from_external_class(int integer) { }
@Test
@FileParameters("src/test/resources/test.csv")
public void load_params_from_csv(int age, String name) { }
@Test
@FileParameters(value = "src/test/resources/test.csv",
mapper = PersonMapper.class)
public void load_params_from_any_file(PersonTest.Person person) { }
@Test
@FileParameters("classpath:test.csv")
public void load_params_from_classpath(int age, String name) { }
Więcej przykładów Samples_of_Usage_Test.java i PersonTest.java
Porównywalne do metod stosowanych w TestNG
Całkiem fajne - bardzo czytelny kod
Przykład w ErrorRate_05_Theory_Test.java
Testy opisują teorię jaką spełnia klasa/metoda, weryfikacja przez podanie wszystkich możliwych kombinacji danych
Dla niektórych danych testy mogą nie mieć sensu (assumeTrue)
Uruchamiane jako jeden test
Jeżeli jedna kombinacja nie przejdzie pada cała teoria
public static class HasTempFolder {
@Rule
public TemporaryFolder folder = new TemporaryFolder();
@Test
public void testUsingTempFolder() throws IOException {
File createdFile = folder.newFile("myfile.txt");
File createdFolder = folder.newFolder("subfolder");
// ...
}
}
The basic problem was that Java 7, when using reflection to find methods, doesn't return them in a consistent order. With Java 6, it was pretty much guaranteed that they'd be returned in the order in which they appear in the source file. This is no longer the case.
Przykład w MethodOrderTest.java
Dziękuje za uwagę.
adam (at) dudczak.info / @maneo