NUnit - unit-vizsgálat keretében - hangosan gondolkodtam

Magamról szeretnék hozzáadni. Az anyag elég hasznos, csak le, és azt mutatja, sok lehetőséget, ha azt megelőzően munka NUnit mint olyan nem végzik el.

Nos, ez valószínűleg megkezdődik (ooh és namuchalas, mint én most a bejegyzés)

Szóval, mi meg NUnit 2.5 verzió?

  1. Új kényszerek.
  2. Felhasználó által definiált komparátor.
  3. Képes meghatározni a pontosságát összehasonlítását lebegőpontos számok, dátum és idő.
  4. Parametrikus teszteket.
  5. Kombinatorikus és Pairwise-vizsgálatok.
  6. Elméleteket.
  7. Kivétel böngésző (a GUI-kliens).
  8. Párhuzamos végrehajtását vizsgálatok (pnunit).

Megkötés alapú modell

Valószínűleg, mielőtt a leírását az új korlátok és módosítók, érdemes néhány szót arról, hogy mi van a kényszerek és módosítók

A hagyományos modell az ellenőrzés, amelynek gyökerei hazugság, talán az első nyilvános egység tesztelése keret JUnit azt jelenti, hogy van néhány osztály (Assert), amelynek a statikus ellenőrzésére szolgáló módszerek különböző körülmények között.

Ezzel a megközelítéssel a vizsgálati módszerek a következők:

Az első változat NUnit teszteli a hagyományos modell, és ez még mindig fennmaradt a visszamenőleges kompatibilitás, de most az alapmodell ellenőrzések alapján az olyan egyedi tárgyak-korlátok (végrehajtási IConstraint interface), amelyek mindegyike végrehajtja az adott ellenőrzés:

Sok tárgyak-korlátok módosítók - az ingatlan vagy módszerek további paraméterek megadását. Ezek a tulajdonságok és módszerek visszatér egy hivatkozás a tárgy maga, ezért lehet használni „egy lánc”:

Végül NUnit tartalmaz speciális osztályok „szintaxis segítők” - és ma, amely lehetővé teszi, hogy rögzítsék a feltétele szinte „emberi” nyelv:

Véleményem kényszer-alapú modell már csak három plusz:

Először is, a könnyebb feltételek vizuális észlelés - azonban vannak különböző vélemények ebben a kérdésben.

Másodszor, a könnyebb írásban feltételek - AreEqual () metódus 24 változatok, és elég nehéz kiválasztani a megfelelő használata esetén is az IntelliSense, és a használata korlátok és szintaktikai segítők kiválasztása a megfelelő módszer nagyban megkönnyíti.

És végül, kényszer-alapú modell pontosabb módszertani szempontból - minden típusú vizsgálat választ egy külön osztály, ami azt jelenti, hogy a kód érthetőbbé.

új kényszerek

Úgy gondolom, hogy most van itt az ideje, hogy válaszoljon a kérdésre, hogy milyen új korlátozásoknak meg NUnit 2.5. Ezek a korlátozásoknak az alábbiak:

  1. RangeConstraint
  2. Path kényszerek (SamePathConstraint, SamePathOrUnderConstraint)
  3. Gyűjtemény kényszerek (UniqueItemsConstraint, CollectionOrderedConstraint)
  4. ThrowsConstraint
  5. DelayedConstraint

Persze, nem kinyilatkoztatások, de dolgozni NUnit most egyszerűbb!

tartománymegkötéses

RangeConstraint lehetővé teszi, hogy ellenőrizze, hogy az érték ebbe a tartományba esik:

Mint látható, ez csak egy rövid helyettesíti a fenti konstrukció az alábbiak szerint:

path kényszerek

SamePathConstraint lehetővé teszi, hogy ellenőrizze, hogy ugyanúgy:

SamePathOrUnderConstraint lehetővé teszi, hogy ellenőrizze, hogy a tényleges útvonal megegyezik vagy „alatt” a várható módon:

Semmi különös, csak egy praktikus kiegészítője összehasonlítás módon.

Gyűjtemény kényszerek

Sokkal nagyobb jelentőséggel bírnak a kényszerek összehasonlítására gyűjtemények: UniqueItemsConstraint és CollectionOrderedConstraint.

UniqueItemsConstraint, mint a neve is mutatja, lehetővé teszi, hogy ellenőrizze, hogy a gyűjtemény csak az egyedi elemek:

CollectionOrderedConstraint ellenőrzi, hogy az elemek a gyűjtemény követett egy adott sorrendben. A következő példa kivitel látható segítségével ez a megszorítás.

dob Megkötés

Végül megjelent a NUnit korlátot követési kivételekkel:

Korábban annak igazolására, hogy egy kódot kivételt dob, akkor kellett használni egy ilyen ormótlan szerkezet:

Mint látható, a dob kényszer kell írni kevesebb kódot, lehetséges, hogy különböző körülmények között kivétel egyetlen vizsgálat, és végül, több lehetőségünk van, hogy ellenőrizze a tartalmát a kivétel objektum!

késleltetett Megkötés

Végül DelayedConstraint lehetővé teszi, hogy ellenőrizze, hogy az esemény után egy bizonyos ideig. Egy kis példa:

Ie DelayedConstraint lehet nyomon követésére használható anélkül, hogy további mozgását bizonyos műveleteket végeznek tekintettel aszinkron módon a teszt. Annak érdekében, hogy ez a helyzet nem tűnik erőltetett, adok egy valós példa:

Ebben a példában CommandProcessor osztály végzi aszinkron feldolgozás parancsokat rendelni, és a kezelés végén kiteszi Feldolgozott zászló. Ellenőrzését, hogy a parancs sikeresen feldolgozott, gyártott felhasználásával DelayedConstraint, a maximális várakozási idő 1 másodperc, a zászló poll készült időközzel 100 milliszekundum.

Ha összehasonlítjuk az az egyenlet, hogy képesek a felhasználó által megadott összehasonlító:

És még két lehetőség:

Egy ilyen megközelítés hasznos lehet abban az esetben, ha szükség van, hogy végezzen több összehasonlítást „komplex” tárgyak, amelyek azonban nem kívánatos felülírás Egyenlő () metódus, de a legnagyobb hatás érhető el, ha összehasonlítjuk gyűjtemények:

Előtt 2.5 verzió végrehajtására ilyen összehasonlítást kellett megoldások használata, mint például a LINQ:

De ugyanakkor a hiba esetén, ahelyett, hogy informatív hozzászólások:

Samples.CollectionSamples.CustomComparerTest:
Várható és tényleges értékek egyaránt eltérnek index [1]
Karakterlánc hosszak mindkét 1. húrok különböznek 0 indexű.
Várt: «B»
De ez volt: «X»
---- ^

megkaptuk meggyőző:

Samples.CollectionSamples.LinqComparerTest:
Várt: True
De volt: False

Összehasonlítás lebegőpontos számok

Mint már említettem, a NUnit 2,5 lehetősége van arra, hogy meghatározza a pontosság, amellyel szeretné összehasonlítani lebegőpontos számok. Ehhez három EqualConstraint módosítót egészül ki: belül, Százalék és Ulps.

Belül módosító lehetővé teszi, hogy meghatározza az abszolút értéke a hiba, amely össze két lebegőpontos számok:

Hanem azért, mert a korlátozások a mantissza hossza abszolút értéke a hiba nem mindig, például lehetetlenné válhat a paraméteres tesztet, a munka széles értékek, válassza az érték a hiba -, hogy vagy túl magas lesz, hogy teszteljék a „kis” értékek ami azt jelenti, vagy túl kevés, hogy teszteljék sikeresen a „nagy” értékeket. Ennek kompenzálására ezek a bajok módosítókat százalékos Ulps.

Százalékos módosító lehetővé teszi, hogy meghatározza a hiba százalék:

A Ulps módosító lehetővé teszi, hogy meghatározza a pontosságot „egységek az utolsó helyen”, azaz Sőt, tekintve gép aritmetikai hibák:

Hasonlítsuk össze a dátum és az idő

Ezen kívül módosítók megadott pontosság képest lebegőpontos számok NUnit 2,5 megjelent módosítók specifikáló pontosságot, amikor összehasonlítjuk dátum és idő. Az élet példája - DATETIME típusú SQL Server lehetővé teszi, hogy mentse a dátum és az idő legfeljebb 3 milliszekundum, ezért ha mi írjuk a dátumot és az időt érték az adatbázis SQL Server, majd azonnal olvasni az érték, a legtöbb esetben kapott SQL szerver érték nem egyezik az eredetivel.

Ez könnyen ellenőrizhető:

Amint az várható volt, a teszt sikertelen.

Korábban ebben a tesztben a munka, kézzel kellett hozzá kódot átalakítani DateTime hogy SqlDateTime, akkor most csak adj egy módosítót Milliseconds:

Emellett néhány ezredmásodperccel módosító vannak mások: nap, óra, perc, másodperc és kullancsok.

Parametrikus teszteket 2.5 verzió

Ez a megközelítés nem mentes a problémáktól, mert Nem minden érték megadható tulajdonságokat. Például az attribútum nem adja meg a decimális érték típusát, amely a használt üzleti alkalmazások.

Egyszerű paraméteres

A NUnit 2,5 volt „natív” parametrikus tesztek és számos lehetőség megadása az érveket ezeket a teszteket.

Először is, akkor meg paramétereket attribútumokat, mint ahogy azt tette a RowTest:

Akkor egyszerűsíteni ezt a tesztet, a csak egy ilyen szórakoztató design:

Megadhat egy sor vizsgálati tömb elemeinek - és most lehet paramétereket bármilyen típusú, például az azonos Tizedes:

Akkor hivatkoznak mindegyik vizsgálati értékek további adatokat, például meghatározhatják, hogy ha egy bizonyos érvek, van egy kivétel, vagy kifejezetten határozza az eredmény:

És, akkor milyen típusú IEnumerable tulajdon, és ebben az esetben nem korlátozza az adatforrás választása - be lehet venni egy fájlból vagy letölthető az adatbázisból:

Kombinatorikus és Pairwise-tesztek

kombinatorikus tesztelés

Amellett, hogy az egyszerű paraméteres tesztek NUnit lesz két típusú vizsgálatok - kombinatorikus és páronként-vizsgálatok.

Egyszerű kombinatorikai tesztek - NUnit vizsgálati módszerrel bemeneten összes lehetséges kombinációját bemeneti paraméterek:

A vizsgálat eredményét:

***** Samples.CombinatorialSamples.CombinatorialTest ( «a», »-«»x»)
a-X
***** Samples.CombinatorialSamples.CombinatorialTest ( «a», »-«»y»)
a-y
***** Samples.CombinatorialSamples.CombinatorialTest ( «A», »+», »x»)
a + x
***** Samples.CombinatorialSamples.CombinatorialTest ( «A», »+», »y»)
a + y
***** Samples.CombinatorialSamples.CombinatorialTest ( «b», »-«»x»)
b-X
***** Samples.CombinatorialSamples.CombinatorialTest ( «b», »-«»y»)
b-y
***** Samples.CombinatorialSamples.CombinatorialTest ( «b», »+», »x»)
b + x
***** Samples.CombinatorialSamples.CombinatorialTest ( «b», »+», »y»)
b + y

By the way, kombinatorikus attribútum megadása nem kötelező, de én inkább csinálni az olvashatóság javítása érdekében.

A páros-tesztek

A második típusú teszt - páronkénti-tesztek. A páros, vagy „minden pár” egy vizsgálati módszert a vizsgálati bemeneti továbbított összes lehetséges kombinációját pár paraméterek:

Ez az, amit látunk, amikor fut ez a teszt:

***** Samples.PairwiseSamples.PairwiseTest ( «a», »-«»x»)
a-X
***** Samples.PairwiseSamples.PairwiseTest ( «A», »+», »y»)
a + y
***** Samples.PairwiseSamples.PairwiseTest ( «b», »-«»y»)
b-y
***** Samples.PairwiseSamples.PairwiseTest ( «b», »+», »x»)
b + x
***** Samples.PairwiseSamples.PairwiseTest ( «b», »+», »y»)
b + y

Mire használható páros-teszt? Természetesen annak érdekében, hogy csökkentse a költségeit teszt végrehajtása - még egy kis minta látható nyerő páros teszt képest kombinatorikus teszt - 5-8 kombináció!

Annak valószínűsége, hogy bármilyen hiba által okozott egyedülálló kombinációja minden paraméter jelentősen alacsonyabb, mint a valószínűsége, hogy a hiba okoz némi kombinációja a két (három, stb) beállításokat, és a kombinációk száma az összes-párok teszt, attól függően, hogy a az argumentumok számát növeljük sokkal lassabban, mint a kombinációk száma kombinatorikus vizsgálatok.

Például, ha van 10 paraméter, és minden paraméter 10 érték, kombinatorikai vizsgálat a kombinációk száma lesz 1010, míg a minden pár tesztet, a kombinációk száma csak 155!
Általánosságban elmondható, hogy ez nem teljesen igaz, helyes azt mondani, „nem több, mint 155”. A minimális számú teszt szükséges, hogy minden lehetséges pár értékeket lehet beállítani csak nyers erő, amely megköveteli a hatalmas mennyiségű erőforrásokat. Az algoritmust használjuk NUnit, aki feltalálta és végrehajtani annak hasznosságát, „Jenny” Bob Jenkins. Ebben az algoritmusban véletlenszerűen generál több teszt esetek, majd az egyikük úgy választjuk, hogy a legjobb lefedettséget - és így, amíg azokat „zárt”, minden pár értékeket.

Attribútumok ValueSource, Range, Random és szekvenciális teszt

attribútum ValueSource

Értékek, amelyeket használni fognak, hogy teszteljék az érv lehet beállítani ValueSource attribútumot (mint ahogy ez történik a vizsgálat példák):

attribútum tartomány

A tartomány attribútum megadhatja egy értéktartomány az érvelés: