2. Obsah
I Úvod
II JUnit Framework
III Best Practices
IV Další nástroje pro podporu unit testování
V Otázky a odpovědi
2
3. Úvod
Co je unit testování?
Co je a co není Unit test
Přínosy unit testování
Mýty o unit testování
Programování řízené testy – Test Driven Development (TDD)
3
4. Úvod
Co je unit testování?
„In computer programming, unit testing is a method by which
individual units of source code are tested to determine if they
are fit for use “
-- wikipedia
Činnost úzce spjatá s vývojem aplikačních programů
Proces psaní testů pro všechny metody nebo funkce modulu
4
5. Úvod
Co je a co není Unit Test
Unit test je automaticky a samostatně testovatelná
část použitelná k potvrzení, že modul (jednotka) zdrojového
kódu pracuje správně
Modulem (jednotkou) je testovatelná část aplikačního programu
(metoda, funkce, procedura, program atd.)
Isolovaný
Opakovatelný
Rychlý
Samopopisný
5
6. Úvod
Co je a co není Unit Test
Test není Unit Testem pokud:
Komunikuje s databází
Komunikuje napříč síťovým prostředím
Spolupracuje se souborovým systémem
Nemůže běžet společně s ostatními unit testy
Musíte provést speciální akce ve vašem prostředí (konfigurace) pro
jeho běh
Nelze otestovat v izolaci od ostatních tříd
Vadí nám že Test není úplným Unit Testem?
Kdy, kde a kdo bude unit testy spouštět?
6
7. Úvod
Přínosy unit testování
Podporuje izolování částí programu a snadné ověření správné
funkčnosti
Zjednodušuje integrační testování
Poskytuje dokumentaci
Zlepšuje kvalitu kódu
Umožňuje bezpečněji provádět refaktoring
Obnovuje sebedůvěru
7
8. Úvod
Mýty o unit testování
Nepíšu unit testy protože:
Já chyby nedělám.
Funkcionalita je triviální.
Mě to zdržuje.
Nevím jak testovat.
8
9. Úvod
Test Driven Development
Design
Programovací technika
Test Test
Test-first přístup
Implement
Test – Code – Refactor
Účel vytváření testu není kontrola zda kód souhlasí se
specifikací, ale testy představují nástroj pro návrh systému.
Vedlejší efekt zaručuje, že veškerý kód je pokryt testy.
Test
Refactor Code
9
10. JUnit Framework
Framework pro unit testování v jazyce Java
3.x
4.x - Anotation based
Jednoduchý
Volně dostupný
IDE support, Maven support
10
11. JUnit Framework
Unit test Class
Standardní Java class
Testovací metoda označena anotací @Test
public class SimpleTest {
@Test
public void testEmptyCollection() {
Collection<String> collection = new ArrayList<String>();
assertTrue(collection.isEmpty());
}
}
11
12. JUnit Framework
Unit test Lifecycle
Anotace @Before @After @BeforeClass @AfterClass
public class LifecycleTest {
private Collection<String> collection;
@BeforeClass
public static void oneTimeSetUp() {}
@AfterClass
public static void oneTimeTearDown() {}
@Before
public void setUp() {
collection = new ArrayList<String>();
}
@After
public void tearDown() {
collection.clear();
}
12
…
13. JUnit Framework
Time Test
Pokud test běží déle než definovanou dobu, je ukončen a
končí neúspěšně
Anotace @Test(timeout = 1000)
public class ExpectedExceptionTest {
@Test(expected = ArithmeticException.class)
public void divisionWithException() {
int i = 1 / 0;
System.out.println(i);
}
}
13
14. JUnit Framework
Expected Exception
Testování předpokládaného vyhození výjimky
Anotace @Test(expected = ArithmeticException.class)
public class ExpectedExceptionTest {
@Test(expected = ArithmeticException.class)
public void divisionWithException() {
int i = 1 / 0;
System.out.println(i);
}
}
14
15. JUnit Framework
Anotace @Ignore
Dočasné vyřazení testu
Anotace @Ignore
Při použití na úrovni třídy vyřazujeme všechny testy
JUnit při spouštění reportuje ignorované testy
Při použití můžeme definovat důvod vyřazení
public class IgnoreTest {
@Ignore("Temporary ignore during refactoring")
@Test
public void testEmptyCollection() {
System.out.println("Method is not ready yet");
}
}
15
16. JUnit Framework
Suite Test
Seskupování testů
Anotace @Suite
@RunWith(Suite.class)
@Suite.SuiteClasses({
SimpleTest.class,
LifecycleTest.class
})
public class SuiteTest {
}
16
17. Unit Testing Best Practices
Dodržujte konvence při vytváření unit testu
Používejte Assertions při tvorbě testu
Informativní zprávy http://joe.truemesh.com/blog/000511.html
Vytvářejte rychlé unit testy
Spouštějte unit testy automaticky
Maven, Jenkins http://jenkins-ci.org/
Oddělujte unit testy pro jednotlivé business moduly
Oddělujte unit testy podle jejich typu
Spouštěné uživatelem, spouštěné při vývoji, integrační atd.
17
18. Unit Testing Best Practices
Konvence
Jméno třídy by mělo končit sufixem „Test“
Jméno metody by mělo začínat prefixem „test“
Návratová hodnota musí být „void“
Metoda nesmí vyhazovat výjimku
18
19. Další nástroje pro podporu unit testování
TestNG
Podpora unit testování v Maven
Mocking
EasyMock knihovna
…
19
20. Další nástroje pro podporu unit testování
TestNG
Unit test framework
TestNG versus JUnit
Suite Test using XML
Expected Exception Message ReqExp
Parameterized Tests
Dependency Test
Invocation Count Test
@BeforeSuite, @AfterSuite, @BeforeTest, @AfterTest
Groups
IDE support, Maven support
20
21. Další nástroje pro podporu unit testování
Podpora unit testování v Maven
Maven Surefire plugin
http://maven.apache.org/plugins/maven-surefire-plugin/
Spouští unit testy během test lifecycle phase
Wildcard default patterns:
**/Test*.java
**/*Test.java
**/*TestCase.java
JUnit, TestNG and POJO Test support
Reports
TXT and XML
HTML reports - Maven Surefire Report Plugin
http://maven.apache.org/plugins/maven-surefire-report-plugin/
21
22. Další nástroje pro podporu unit testování
Mocking
Mock Object je simulovaný objekt, který napodobuje chování
reálného objektu řízeným způsobem.
“You build something that works as something else”
Frameworks
EasyMock http://easymock.org/
PowerMock http://code.google.com/p/powermock/
Mockito, jMockit etc.
22
23. Další nástroje pro podporu unit testování
EasyMock knihovna
EasyMock http://easymock.org/
Process
Create Mock, Record Expectations
Replay
Execute
Verify
Nelze provést Mocking:
static methods, private methods, final methods
Constructor
http://www.michaelminella.com/testing/unit-testing-with-junit-and-easymock.html
23
24. Ostatní užitečné odkazy
XML Unit http://xmlunit.sourceforge.net/
Unit testy psané v Groovy
http://www.aspectworks.com/category/blog/testing
DbUnit http://dbunit.sourceforge.net/howto.html
Code Coverage Analysis Tool http://cobertura.sourceforge.net/
Jester Mutation Testing http://jester.sourceforge.net/
Maven JUnit, TestNG together
http://stackoverflow.com/questions/1232853/how-to-execute-junit-
and-testng-tests-in-same-project-using-maven-surefire-plugi
24