PV168/JUnit v IntelliJ IDEA

Z FI WIKI
Přejít na: navigace, hledání

Tato stránka obsahuje stručný návod jako používat JUnit v IntelliJ IDEA.


Testované třídy

Projekt pro Maven má automaticky vytvořené adresáře src/main/java pro třídy a src/test/java pro unit testy.

Mějme tedy například třídu Car, interface CarManager a jeho implementaci CarManagerImpl.

 
package cz.muni.fi.pv168;
 
public class Car {
 
    private Long id;
    private String name;
 
    public Car() {
    }
 
    public Long getId() {
        return id;
    }
 
    public void setId(Long id) {
        this.id = id;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
    
}
 
package cz.muni.fi.pv168;
 
import java.util.List;
 
public interface CarManager {
 
    void createCar(Car car);
 
    List<Car> findAllCars();
}
 
package cz.muni.fi.pv168;
 
import java.util.List;
 
public class CarManagerImpl implements CarManager {
 
    @Override
    public void createCar(Car car) {
        throw new UnsupportedOperationException();
    }
 
    @Override
    public List<Car> findAllCars() {
        throw new UnsupportedOperationException();
    }
}

JUnit 4 s AssertJ

Nejdřív je třeba přidat do projektu knihovny pro JUnit 4 a AssertJ. Do otevřeného souboru pom.xml přidáme závislosti:

 
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>3.9.1</version>
        </dependency>
    </dependencies>


Pokud umístíme kurzor na řádek s definicí třídy CarManager a zmáčkneme Alt+Enter (vyvolání tzv. Intention Action), nabídne se nám akce Create test. Po zvolení této akce se objeví dialogové okno, ve kterém zvolíme parametry generovaného testu, tedy zvolíme Test Library: JUnit 4, že chceme generovat @Before a pro které metody chceme test. Vygeneruje se třída, která vypadá nějak takto:

 
package cz.muni.fi.pv168;
 
import org.junit.Before;
import org.junit.Test;
 
public class CarManagerTest {
    
    @Before
    public void setUp() throws Exception {
 
    }
 
    @Test
    public void testCreateCar() throws Exception {
 
    }
}

Do metody naimplementujte testy, např.

 
package cz.muni.fi.pv168;
 
import org.junit.Before;
import org.junit.Test;
 
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNullPointerException;
 
public class CarManagerTest {
 
    private CarManagerImpl carManager;
 
    @Before
    public void setUp() throws Exception {
        carManager = new CarManagerImpl();
    }
 
    @Test
    public void testCreateCarWithNull() throws Exception {
        //see http://joel-costigliola.github.io/assertj/assertj-core-features-highlight.html#exception-assertion
        assertThatExceptionOfType(NullPointerException.class).isThrownBy(() -> {
            carManager.createCar(null);
        });
    }
 
    @Test
    public void testCreateCarWithId() throws Exception {
        Car car = new Car();
        car.setName("Škodovka");
        carManager.createCar(car);
        assertThat(car.getId()).as("check that car.id is assigned").isNotNull();
    }
 
    @Test
    public void testCreateCarCanBeRetrieved() throws Exception {
        Car car = new Car();
        car.setName("Škodovka");
        carManager.createCar(car);
        assertThat(carManager.findAllCars()).as("check that %s can be found", car.getName()).contains(car).hasSize(1);
    }
}

Při psaní testů můžete používat buď metody assertTrue(), assertEquals() poskytované knihovnou JUnit 4 , nebo pohodlnější přístup s assertThat() knihovny AssertJ, který je o něco čtivější a umožňuje generovat automaticky lepší chybová hlášení.

Spuštění testů

Spuštění s grafickým rozhraním v IntelliJ IDEA

Pravým tlačítkem klikneme na adresář src/test/java a vybereme Create All Tests. Tím se vytvoří položka pro spouštění testů.

Kliknutím na zelenou šipku, případně zmáčknutím Shfit+F10 testy spustíme.

Pokud bude nějaký test neúspěšný, zobrazí se chybová hlášení:

Junit idea fail.png

Naopak pokud budou všechny testy úspěšné, zobrazí se jen potvrzení úspěchu:

Junit idea success.png

Spuštění v Mavenu z příkazového řádku

Unit testy nemusíme spouštět jen z vývojového prostředí. Díky tomu, že máme projekt ve formátu pro Maven, můžeme spustit testy i Mavenem.

Nejřív ale musíme do popisu projektu v souboru pom.xml přidat tyto řádky:

 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

Těmi říkáme, že naše zdrojové kódy jsou v kódování UTF-8, a že používáme verzi jazyka Java 8.

Testy pak spustíte z příkazového řádku v adresáři projektu příkazy:

module add jdk-1.8.0
module add maven
mvn clean
mvn test

Příkaz module add maven-loc přidá do cesty program Maven. Příkaz mvn clean smaže adresář target, čímž smaže všechny zkompilované třídy a uvede projekt do čistého stavu. Příkaz mvn test pak projekt znovu zkompiluje a spustí testy.

JUnit 5

Od podzimu 2017 existuje nová verze JUnit 5. Testovací plugin pro Maven ji nepodporuje rovnou, j tedy nutné pom.xml rozšířit o něco více než u JUnit4:

 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <junit5.version>5.1.0</junit5.version>
    </properties>
 
    <dependencies>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit5.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>3.9.1</version>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19</version>
                <dependencies>
                    <dependency>
                        <groupId>org.junit.platform</groupId>
                        <artifactId>junit-platform-surefire-provider</artifactId>
                        <version>1.0.1</version>
                    </dependency>
                    <dependency>
                        <groupId>org.junit.jupiter</groupId>
                        <artifactId>junit-jupiter-engine</artifactId>
                        <version>${junit5.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

Hlavní změnou je přejmenování anotace @Before na @BeforeEach, metody nemusí být public, a nová anotace @DisplayName umožňuje měnit zobrazované názvy testů.

 
package cz.muni.fi.pv168;
 
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
 
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNullPointerException;
 
@DisplayName("CarManager tests")
class CarManagerTest {
 
    private CarManagerImpl carManager;
 
    @BeforeEach
    void setUp() {
        carManager = new CarManagerImpl();
    }
 
    @Test
    @DisplayName("createCar(null)")
    void testCreateCarWithNull() throws Exception {
        assertThatNullPointerException().isThrownBy(() -> carManager.createCar(null));
    }
 
    @Test
    void testCreateCarWithId() throws Exception {
        Car car = new Car();
        car.setName("Škodovka");
        carManager.createCar(car);
        assertThat(car.getId()).as("check that car.id is assigned").isNotNull();
    }
 
    @Test
    void testCreateCarCanBeRetrieved() throws Exception {
        Car car = new Car();
        car.setName("Škodovka");
        carManager.createCar(car);
        assertThat(carManager.findAllCars()).as("check that %s can be found", car.getName()).contains(car).hasSize(1);
    }
 
}