it-swarm-eu.dev

Jak píšete testovací případy?

Někdy skončím psaní případů testů jednotek pro kód, který napsali jiní vývojáři. Jsou případy, kdy opravdu nevím, co se vývojář snaží dělat (obchodní část) a já jen manipulovám s testovacím případem, abych získal zelenou linii. Jsou tyto věci v oboru normální?

Jaký je normální trend? Mají vývojáři psát případy testů jednotek pro kód, který sami napsali?

14
Vinoth Kumar C M

Zkuste si přečíst tento blogový příspěvek: Psaní skvělých testů jednotek: Nejlepší a nejhorší postupy .

Na webu je však nespočet dalších.

V přímé odpovědi na vaše otázky ...

  1. "Normální trend" - myslím, že by se to mohlo lišit od místa k místu, co je pro mě normální, pro ostatní by to mohlo být zvláštní.
  2. Řekl bych (podle mé volby) vývojář, který píše tento kód, napsat test, nejlépe pomocí metod jako TDD, kde byste test napsali před kódem. Ale ostatní zde mohou mít různé metody a nápady!

A způsob, jakým jste popsali psaní testů (ve vaší otázce), je naprosto špatný !!

12
user18041

Tento přístup činí test jednotky bezcenné.

Pokud některá skutečná akce nefunguje tak, jak bylo zamýšleno, musíte nechat test jednotky selhat. Pokud to neuděláte a možná ještě před testem napíšete test, je to jako mít nefunkční kouřové alarmy.

9
user1249

V reálném světě je naprosto normální psát testy jednotek pro kód někoho jiného. Jistě, původní vývojář by to už měl udělat, ale často dostanete starší kód tam, kde to prostě nebylo provedeno. Mimochodem, nezáleží na tom, zda tento dědický kód přišel před desítkami let z galaxie daleko, daleko, nebo zda jej jeden z vašich spolupracovníků zkontroloval minulý týden, nebo zda jste to napsali dnes, starší kód je kód bez testů

Zeptejte se sami sebe: proč píšeme testy jednotek? Going Green je samozřejmě jen prostředkem k dosažení cíle, konečným cílem je prokázat nebo vyvrátit tvrzení o testovaném kódu.

Řekněme, že existuje metoda, která počítá druhou odmocninu čísla s pohyblivou řádovou čárkou. V Javě by to rozhraní definovalo jako:

public double squareRoot(double number);

Nezáleží na tom, zda jste napsali implementaci nebo zda to udělal někdo jiný, chcete uplatnit několik vlastností squareRoot:

  1. že dokáže vrátit jednoduché kořeny jako sqrt (4.0)
  2. že dokáže najít skutečný root jako sqrt (2.0) s rozumnou přesností
  3. že zjistí, že sqrt (0.0) je 0.0
  4. že vyvolá IllegalArgumentException při podávání záporného čísla, tj. na sqrt (-1,0)

Takže začnete psát tyto jako jednotlivé testy:

@Test
public void canFindSimpleRoot() {
  assertEquals(2, squareRoot(4), epsilon);
}

Jejda, tento test již selhal:

Java.lang.AssertionError: Use assertEquals(expected, actual, delta) to compare floating-point numbers

Zapomněli jste na aritmetiku s pohyblivou řádovou čárkou. OK, představíš double epsilon=0.01 a jít:

@Test
public void canFindSimpleRootToEpsilonPrecision() {
  assertEquals(2, squareRoot(4), epsilon);
}

a přidat další testy: konečně

@Test
@ExpectedException(IllegalArgumentException.class)
public void throwsExceptionOnNegativeInput() {
  assertEquals(-1, squareRoot(-1), epsilon);
}

a oops, opět:

Java.lang.AssertionError: expected:<-1.0> but was:<NaN>

Měli byste vyzkoušet:

@Test
public void returnsNaNOnNegativeInput() {
  assertEquals(Double.NaN, squareRoot(-1), epsilon);
}

Co jsme tady udělali? Začali jsme několika předpoklady o tom, jak by se měla metoda chovat, a zjistili jsme, že ne všechny jsou pravdivé. Poté jsme provedli testovací sadu Green, abychom si zapsali důkaz, že se metoda chová podle našich opravených předpokladů. Nyní se mohou klienti tohoto kódu spolehnout na toto chování. Pokud by si někdo vyměnil skutečnou implementaci squareRoot s něčím jiným, něčím, co například namísto vracení NaN skutečně vyvolalo výjimku, naše testy by to okamžitě zachytily.

Tento příklad je triviální, ale často zdědíte velké části kódu, kde není jasné, co vlastně dělá. V takovém případě je normální položit testovací postroj kolem kódu. Začněte několika základními předpoklady o tom, jak by se kód měl chovat, napište pro ně testy jednotek, test. Pokud je zelená, dobrá, napište více testů. Pokud je červená, tak nyní máte neúspěšné tvrzení, které můžete držet proti spec. Možná je ve starém kódu chyba. Možná je specifikace o tomto konkrétním vstupu nejasná. Možná nemáte spec. V takovém případě přepište test tak, aby dokumentoval neočekávané chování:

@Test
public void throwsNoExceptionOnNegativeInput() {
  assertNotNull(squareRoot(-1)); // Shouldn't this fail?
}

Postupem času skončíte s testovacím postrojem, který dokumentuje, jak se kód skutečně chová, a stává se tak trochu kódovanou specifikací. Pokud byste někdy chtěli změnit starší kód nebo jej nahradit něčím jiným, máte zkušební svazek k ověření, zda se nový kód chová stejně nebo že se nový kód chová jinak a očekávaným a kontrolovaným způsobem (například, že skutečně opravuje chybu, kterou očekáváte. Tento úvazek nemusí být v první den úplný, ve skutečnosti má neúplný úvazek téměř vždy lepší než vůbec žádný úvazek. Díky postroji můžete psát svůj klientský kód snadněji, víte, kde můžete očekávat, že se něco změní, když něco změníte, a kde se zlomili, když to nakonec udělali.

Měli byste se pokusit dostat z myšlení, že musíte psát jednotkové testy jen proto, že musíte, jako byste vyplňovali povinná pole ve formuláři. A neměli byste psát testy jednotek pouze proto, aby červená čára byla zelená. Testy jednotek nejsou vaši nepřátelé, testy jednotek jsou vaši přátelé.

3
wallenborn

Pokud nevíte, co funkce dělá, nemůžete pro ni napsat test jednotky. Pro všechno, co víte, nedělá to, co má. Musíte zjistit, co má dělat jako první. POTŘEBA napsat test.

3
Edward Strange

Když píšu testovací případy (pro tiskárny), snažím se vymyslet každou malou součástku ... a co mohu udělat, abych ji rozbila. Řekněme tedy, že například skener, jaké příkazy používá (v jazyce pjl printer-job-language), co mohu napsat, abych otestoval každý kousek funkčnosti ... Ok, co teď mohu udělat, abych to zkusil a rozbít.

Snažím se to udělat pro každou hlavní součást, ale pokud jde o software a ne tolik hardwaru, chcete se podívat na každou metodu/funkci a zkontrolovat hranice a tak.

1
user6791

Zní to, jako byste spolupracovali s jinými vývojáři (nebo udržovali kód napsaný jinými vývojáři), kteří neprovádějí testování jednotek. V takovém případě si myslím, že byste určitě chtěli vědět, co má objekt nebo metoda, kterou chcete testovat, vytvořit test.

Nebude to TDD, protože jste test nenapsali jako první, ale mohli byste situaci zlepšit. Můžete také chtít vytvořit kopii testovaných objektů pomocí pahýlů, aby bylo možné zjistit, že vaše testy fungují správně, když se kód nezdaří.

1
vjones