JUnit

JUnit er...

 - Et testrammeverk

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.

JUnit er...

 - Det mest kjente testrammeverket

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

Kjøre testene

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

Kjøre testene med Gradle

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

IntelliJ IDEA

IntelliJ IDEA

Alt+Enter for å få opp den første menyen

IntelliJ IDEA

Testdreven utvikling (TDD)

  1. Skriv en test som feiler
  2. Få testen til å passere
  3. Gå til punkt 1
    @Test
    public void testFactorial() throws Exception {
        assertEquals(factorial(1), 1);
        assertEquals(factorial(3), 6);
        assertEquals(factorial(10), 3628800);
        
        assertEquals(factorial(0), 1);
    }

Tilbake til koden

@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
}

Å teste feilmeldinger

 public class Example {
    File output;

    @Before
    public void createOutputFile() {
          output = new File(...);
    }

    @Test
    public void something() {
          ...
    }

    @After
    public void deleteOutputFile() {
          output.delete();
    }
 }

Before / After

@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)));
}

assertThat

import static org.hamcrest.CoreMatchers.*;

En ny metode for mer lesbare tester. Egentlig et eksternt prosjekt, men inkludert med JUnit versjon 4.8

Mockito

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:

http://slides.com/evestera/junit/

Kode fra presentasjonen:

https://github.com/evestera/1010-pusle

JUnit

By Erik Vesteraas

JUnit

  • 1,709