Testování jednotek, JUnit

Tomáš Pitner, Radek Ošlejšek

Testování software

  • Účelem testování je obecně vzato zajistit bezchybný a spolehlivý software.

  • Testování je naprosto klíčová součást SW vývoje.

  • Je to rozsáhlá disciplína softwarového inženýrství sama o sobě.

  • Některé postupy vývoje jsou přímo řízené testy (Test-driven Development).

  • Zde v PB162 se zatím budeme věnovat jen testování jednotek programu.

  • Každopádně se jedná o case-based testování, tj. testování na příkladech.

  • Nejde tedy o formální ověření korektnosti (verifikaci).

  • Bližší info v řadě předmětů na FI, např. PV260 Software Quality

Typy testování

Testování jednotek

malé, ale ucelené kusy, např. třídy, samostatně testované — dělá vývojář nebo tester

Integrační testování

testování, jak se kus chová po zabudování do celku — dělá vývojář nebo tester často ve spolupráci s architektem řešení

Akceptační testování

při přijetí kódu zákazníkem — dělá přebírající

Testování použitelnosti

celá aplikace obsluhovaná uživatelem — dělá uživatel či specialista na UX

Bezpečnostní testování

zda neobsahuje bezpečnostní díry, odolnost proti útokům, robustnost — dělá specialista na bezpečnost

Testování jednotek

  • Testování jednotek (unit testing) testuje jednotlivé elementární části kódu, kde elementární části jsou třídy a metody.

  • V Javě se nejčastěji používá volně dostupný balík JUnit.

  • V nových produktech se používají verze JUnit 4.x nebo JUnit 5.

  • Alternativně lze použít například AssertJ.

  • Elementárním testem v JUnit je testovací metoda opatřena anotací @Test.

Jednoduchý příklad JUnit testu

  • @Test před metodou označí tuto metodu za testovací.

  • Metoda se nemusí nijak speciálně jmenovat (žádné testXXX jako dříve není nutné).

@Test
public void minimalValueIs5() {
  Assert.assertEquals(5, Math.min(7, 5));
}
  • Metoda assertEquals bere 2 parametry

    • očekávanou (expected) hodnotu — v příkladu 5 a

    • skutečnou (actual) hodnotu — v příkladu Math.min(7, 5).

  • Pokud hodnoty nejsou stejné, test selže.

  • Může přitom vydat hlášku, co se vlastně stalo.

Příklad Calculator — testovaná třída

  • Testovaná třída Calculator, jednoduchá sčítačka čísel:

public class Calculator {
  public int evaluate(String expression) {
    int sum = 0;
    for (String summand: expression.split("\\+"))
      sum += Integer.valueOf(summand);
    return sum;
  }
}

new Calculator().evaluate("1+2"); // returns 3
Řetězec "\\+" je pouhý regulární výraz reprezentující znak +.

Příklad Calculator — testovací třída

  • Třída testující Calculator:

public class CalculatorTest {
  @Test
  public void evaluatesExpression() {
    Calculator calculator = new Calculator();
    int sum = calculator.evaluate("1+2+3");
    Assert.assertEquals(6, sum);
  }
}
Zdroj: junit wiki.

Repl.it demo k JUnit testování

assert metody

  • Jak bylo vidět, pro ověření, zda během provádějí testu platí různé podmínky, jsem používali volání Assert.assertXXX.

  • Z jejich názvů je intuitivně patrné, co vlastně ověřují.

  • Jsou realizovány jako statické metody třídy Assert z JUnit:

    • assertTrue()

    • assertFalse()

    • assertNull()

    • a další

Import statických metod Assert

  • Abychom si ušetřili psaní názvu třídy Assert, můžeme potřebné statické metody importovat

import static org.junit.Assert.assertEquals;
public class CalculatorTest {
  @Test
  public void evaluatesExpression() {
    Calculator calculator = new Calculator();
    int sum = calculator.evaluate("1+2+3");
    assertEquals(6, sum);
  }
}
Javové testování bude podrobně probíráno v dalším kurzu — PV168.