Altså kode vi importerer inn i vår egen kode for å gjøre det lett å skrive testkode.
Ikke et program for å kjøre tester på en praktisk måte.
Laget av Kent Beck (Extreme Programming, Agile, TDD) og Erich Gamma.
Mange andre testrammeverk er inspirert av / basert på JUnit (xUnit)
public class MathUtils {
public static int add(int a, int b) {
return a + b;
}
}
import org.junit.Test;
import static org.junit.Assert.*;
public class MathUtilsTest {
@Test
public void testAdd() throws Exception {
assertEquals(MathUtils.add(2, 2), 4);
}
}
javac -cp .:junit-4.12.jar *.java
java -cp .:junit-4.12.jar:hamcrest-core-1.3.jar org.junit.runner.JUnitCore MathUtilsTest
Man kan laste ned JUnit som jar-filer og kjøre manuelt via terminalen:
Men ingen gjør det på denne måten i praksis.
Eksempel på GitHub under JUnit/NoTools
./gradlew test
Man kan i stedet bruke byggeverktøy som Maven og Gradle.
.
├── build.gradle
└── src
├── main
│ └── java
│ └── MathUtils.java
└── test
└── java
└── MathUtilsTest.java
Mappestruktur:
Kommando for testing:
Eksempel på GitHub under JUnit/Gradle
Alt+Enter for å få opp den første menyen
@Test
public void testFactorial() throws Exception {
assertEquals(factorial(1), 1);
assertEquals(factorial(3), 6);
assertEquals(factorial(10), 3628800);
assertEquals(factorial(0), 1);
}
@Rule
public ExpectedException exception = ExpectedException.none();
@Test
public void testFactorialValidation() throws Exception {
exception.expect(IllegalArgumentException.class);
exception.expectMessage("negative");
factorial(-1);
// No more test-code will be excecuted after this
}
public class Example {
File output;
@Before
public void createOutputFile() {
output = new File(...);
}
@Test
public void something() {
...
}
@After
public void deleteOutputFile() {
output.delete();
}
}
@Test
public void testAddParent() throws Exception {
Person bob = new Person("Bob");
Person bobjr = new Person("Bob Jr.");
bobjr.addParent(bob);
assertThat(bobjr.getParents(), hasItem(sameInstance(bob)));
assertThat(bob.getChildren(), hasItem(sameInstance(bobjr)));
}
import static org.hamcrest.CoreMatchers.*;
En ny metode for mer lesbare tester. Egentlig et eksternt prosjekt, men inkludert med JUnit versjon 4.8
Mockito eller andre "mocking"-biblioteker brukes veldig ofte sammen med JUnit, for å kunne bruke "Mock"-objekter i testingen.
Dette brukes for å kun teste funksjonaliteten i klassen man tester.
import static org.mockito.Mockito.*;
// mock creation
List mockedList = mock(List.class);
// using mock object - it does not throw any "unexpected interaction" exception
mockedList.add("one");
mockedList.clear();
// selective, explicit, highly readable verification
verify(mockedList).add("one");
verify(mockedList).clear();
Denne presentasjonen:
Kode fra presentasjonen: