( enpassant | 2015. 11. 24., k – 11:55 )

"Je, ugy tudtam, nalad osszemosodik a unit es az integration teszt fogalma, pont azert probalom en is egyszerre kezelni oket (bar megmondom oszinten, egy kicsit nehez), mert azt mondtad, egy jo alkalmazasnal ossze lehet oket mosni. Most akkor megiscsak kulon kellene kezelnem az unit teszteket az integration tesztektol, vagy hogy van ez?"

Megpróbálom kicsit részletesebben kifejteni.

- Unit tesztnél a programnak egy izolált kis egységét (unit) (általában függvény vagy osztály) akarod egyszerre tesztelni.
- Az integrációs tesztnél pedig a kis unit-ok együttműködését akarod tesztelni.

Azért mosódik össze ez a kettő, mert nincs értelme szigorúan izolálni az egységet.

Vegyük pl. ezt a kódot:


public String calc(int a, int b) {
  StringBuilder sb = new StringBuilder();
  int result = Service.operation(a, b);
  sb.append("a op b =")
    .append(a).append(" op b =")
    .append(a).append(" op ").append(b).append(" = ")
    .append(result);
  return sb.toString();
}

Itt a calc-ot akarjuk unit tesztelni. Ha szigorúan izolálni akarnám, akkor a StringBuilder függvény hívásait és az Service.operation hívást is izolálni kellene, gyakorlatilag minden sort. Ennek nem igazán van értelme. Ha viszont a StringBuildert nem izolálom, akkor a calc unit tesztje egyúttal a StringBuilderrel való integrációs tesztje is lesz.
Hasonlóan, ha a Service-t nem izolálom, akkor a Service-szel való integrációs tesztem is lesz.
A videóban és a leírásban Ken Scambler azt mondja, hogy ha az input és az output determinisztikus, akkor felesleges izolálni. Ha nincs izolálva, akkor viszont integrációs teszt is lesz. Ha megnézed ilyen szemüvegen át a unit tesztjeidet, akkor meglátod, hogy a túlnyomó többség egyben integrációs teszt is.
Ha viszont az input vagy az output nem determinisztikus, akkor mindenképp szükséges izolálni!
Ha külső service hívás van, akkor annak az eredménye nem determinisztikus (pl. nincs net, nem ad eredményt), ezért izolálni kell.
Minél kevésbé kell izolálnod a unitodat, annál hasznosabban fog lefutni a "unit" tesztje, hiszen annál inkább integrációs teszt is. Elvileg az a legjobb, ha a unit teszt teljesen integrációs teszt is egyben.
Ha külső service hívás van, akkor mindenképp lesz olyan integrációs teszted is, ahol a unit-ot a külső service integrálódásával teszteled, de az már nem a unit tesztek közé kerül. Csak ez utóbbiakat szokták sokan integrációs tesztnek hívni. Bár ahogy az előbb leírtam ez a megnevezés nem fedi le a valóságot, ahogy a unit tesztek sem csak unit-okat tesztelnek, hanem integrálódást is.