JUnit
JUnit je framework pro jednotkové testy psaný v programovacím jazyce Java. Na jeho vývoji se podíleli vývojáři – Kent Beck a Erich Gamma. JUnit je pravděpodobně nejúspěšnější z rodiny xUnit frameworků, kterou odstartoval Kent Beck se svým SUnit pro Smalltalk.
Vývojář | Kent Beck, Erich Gamma, David Saff |
---|---|
Aktuální verze | 5.7.2 (15. května 2021) |
Operační systém | Cross-platform |
Platforma | Java Virtual Machine |
Vyvíjeno v | Java |
Typ softwaru | Jednotkové testy |
Licence | Common Public License |
Web | junit.org |
Některá data mohou pocházet z datové položky. |
Použití
Jednotkové testy jsou základním kamenem vývojových technik test-driven development a Extrémního programování a má se za to, že právě JUnit stojí za vznikem těchto programovacích technik. JUnit byl později portován na mnoho dalších jazyků, např. C# (NUnit), Python (PyUnit), Fortran (fUnit), Perl (Test::Class a Test::Unit) a C++ (CPPUnit). Tato rodina frameworků pro jednotkové testy byla pojmenována xUnit.
Příklad
Mějme třídu Calculator
ve které máme některé operace (sčítání a dělení). Pro tuto třídu jsou níže uvedeny JUnit testy pro verze 3.8, 4 a 5.
package mypackage;
public class Calculator {
private double result = 0.0;
public void sum(double sum) {
result += sum;
}
public void divide(double divide) {
result /= divide;
}
public double getResult() {
return result;
}
}
JUnit verze 3.8
Tento unittest kontroluje správnost sčítání a návrat chybové hodnoty při dělení nulou.
package mypackage;
import junit.framework.*;
public class TestCalculator38 extends TestCase {
public void testSum() {
Calculator calc = new Calculator();
calc.sum(4.0);
calc.sum(7.0);
assertEquals(11.0, calc.getResult());
}
public void testDivByZero() {
Calculator calc = new Calculator();
calc.sum(4.0);
calc.divide(0.0);
assertTrue(Double.POSITIVE_INFINITY == calc.getResult());
}
}
JUnit verze 4
Tento test má stejnou funkcionalitu jako verze 3.8, jeho zápis však nevyžaduje, aby testovací metody začínaly předponou „test“. Syntaxe využívá novinek jazyka Java5 a novějších.
package mypackage;
import org.junit.*;
import static org.junit.Assert.*;
public class TestCalculator4 {
@Test
public void sum() {
Calculator calc = new Calculator();
calc.sum(4.0);
calc.sum(7.0);
assertEquals(11.0, calc.getResult());
}
@Test
public void divByZero() {
Calculator calc = new Calculator();
calc.sum(4.0);
calc.divide(0.0);
assertTrue(Double.POSITIVE_INFINITY == calc.getResult());
}
}
JUnit verze 5
Tento test vychází z příkladu k verzi 4 s těmito rozdíly (pro JUnit 5):
- všechny třídy frameworku JUnit jsou umístěny do nového package org.junit.jupiter.api
- anotace @Test již nevyžaduje public metody a nemá žádné atributy (původní atributy expected a timout je řešeno modelem rozšíření)
- používá se Java8
package mypackage;
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
public class TestCalculator5 {
@Test
void sum() {
Calculator calc = new Calculator();
calc.sum(4.0);
calc.sum(7.0);
assertEquals(11.0, calc.getResult(), () -> "Calculation error");
}
@Test
void divByZero() {
Calculator calc = new Calculator();
calc.sum(4.0);
calc.divide(0.0);
assertTrue(Double.POSITIVE_INFINITY == calc.getResult());
}
}
Spouštění testů
Většina nových verzí vývojových prostředí má integrovanou podporu pro spouštění JUnit testů, je ale možné testy spustit i zvlášť a to buď s textovým nebo grafickým výstupem nebo přímo v programu pomocí příslušných tříd frameworku JUnit.