czyli wypaśne testy jednostkowe
Blog
Kod
class SimpleCalculatorWithExampleTests implements SimpleCalculator { @Override public int sum(int a, int b) { return a + b; } }
class SimpleCalculatorByExampleTestSample { //…
@Test
void add2And2() {
int sum = sut.sum(2, 2);
org.junit.jupiter.api.Assertions.assertEquals(4, sum);
org.assertj.core.api.Assertions.assertThat(sum).isEqualTo(4);
}
}
class SimpleCalculatorByExampleFull implements SimpleCalculator { @Override public int sum(int a, int b) { int sum = a + b; if (a > 0 && b > 0) Preconditions.checkState(sum >= a && sum >= b, "Result overflow MAX_INT"); if (a < 0 && b < 0) Preconditions.checkState(sum <= a && sum <= b, "Result overflow MIN_INT"); return sum; } }
Kurt Gödel
class SimpleCalculatorParametersTest {
@ParameterizedTest @CsvFileSource(resources = "/positive-data.csv") void simpleAddPositiveNumbers(int a, int b, int expectedSum) { int sum = sut.sum(a, b); assertThat(sum).isEqualTo(expectedSum); }
@ParameterizedTest @CsvFileSource(resources = "/exceptional-data.csv") void simpleAddOverflow(int a, int b, String expectedMessage) { assertThrows(IllegalStateException.class, () -> sut.sum(a, b), expectedMessage); }
}
Dla każdego elementu ze zbioru (x, y, …)
Gdy wykonam pewną operację A.
Spełnione będą następujące warunki (a, b, …).
Dla każdych niepustych ciągów znaków a, b, c
ciąg powstały z ich połączenia
zawiera w sobie ciąg b.
@ExtendWith(JGivenExtension.class)
class SimpleCalculatorBddStyleTest {
@ScenarioStage
private GivenStage given;
@ScenarioStage
private WhenStage when;
@ScenarioStage
private ThenStage then;
//... @Test void add2And2() { given.forAddends(2, 2); when.sut(sut).performAdd(); then.sumIsEqualTo(4); } }
To jest infrastruktura BDD
mvn test ; if (( $? )) ; then git checkout HEAD -- src/main/. fi
class Customer { private final String firstName; private final String lastName; public Customer(String firstName, String lastName) { // ??? this.firstName = firstName; this.lastName = lastName; }
class CustomerWithValidator { @Name private final String firstName; @Name private final String lastName; public CustomerWithValidator(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } }
BŁĄD!!!
class CustomerWithTypes { private final Name firstName; private final Name lastName; public CustomerWithTypes(Name firstName, Name lastName) { Preconditions.checkArgument(firstName!=null); Preconditions.checkArgument(lastName!=null); this.firstName = firstName; this.lastName = lastName; } }
Kod dołączony do naszego projektu zawsze może być źródłem problemów. Musimy ufać twórcom, że odpowiednio testują swoje rozwiązania.