nyílt forráskódú eszközök egység tesztelése c
Arpan szeptemberben. Technikai igazgató Synapti számítógépes tervezés Pvt Ltd
Arpan Sen (Arpan Sen) - vezető mérnöke dolgozik a szoftverfejlesztés terén elektronikai tervezéshez. Több éven át dolgozott a néhány UNIX funkciókat, beleértve a Solaris, SunOS, HP-UX és IRIX, valamint Linux és Microsoft Windows. Vett egy nagy érdeklődést a módszerek optimalizáló szoftver teljesítményét, gráfelmélet, és párhuzamos számítástechnika. Arpan van diplomás szoftver rendszerek.
Mi egység tesztelése?
Nagy valószínűséggel bonyolult kódot írt C / C ++ nyelven. Hibákat tartalmaz. Ha a kód van írva, hogy megtalálják ezeket a hibákat is nehéz, mint megtalálni egy tűt a szénakazalban. A ésszerűbb megközelítés az, hogy teszteljék az egyes kódrészletek, ahogy jönnek létre. Ehhez egy kisebb (moduláris) vizsgálatokat annak ellenőrzése érdekében bizonyos paraméterek, például egy függvény C. végző intenzív számítások vagy bizonyos típusú C ++. igényel létrehozunk egy specifikus adatstruktúra, mint például egy sorban. Az összetett regressziós tesztek, összhangban létrehozott ez a filozófia, tartalmazni fog egy sor egység tesztek és a kísérleti program fog futni ezeket a vizsgálatokat és beszámolnak az eredményekről.
Létrehozása egy teszt egy adott függvény vagy osztály
Vegyünk egy egyszerű karakterlánc osztály, 1. listában Ez az osztály nem nagyon megbízható, így tesztelheti a kiemelés.
1. listán Regular string osztályból
Számos szabványos teszt ellenőrzi az üres string hossza nulla, ha a kimeneti az index a határ előfordult, hogy jelenhet meg hibaüzenetek vagy kivételt, és így tovább .. A 2. lista néhány vizsgálatra, ami azért fontos, hogy végre minden húr végrehajtását. Lefuttatjuk a 2. listában egyszerűen fordítsd használatával g ++ (vagy bármely más, fordító, amely kompatibilis a C ++ szabvány). Nem szükséges elszigetelten a fő funkciója, és minden felhasznált könyvtár konfiguráció: az összes szükséges meghatározások szerepelnek unit_test.hpp fejléc, amely része az erősítés beállítása.
2. lista Unit tesztek string osztályból
Makrók BOOST_AUTO_TEST_SUITE BOOST_AUTO_TEST_SUITE_END és határozza meg a kezdetét és végét a teszt csomag, ill. Egyedi vizsgálatok között található a makrók, és ebben a tekintetben a szemantika C ++ terek hasonló neveket. Minden egyes moduláris teszt alkalmazásával határozzuk meg BOOST_AUTO_TEST_CASE makro. 3. lista eredményeit mutatja kódlistá 2.
3. lista Az eredmények kódlistá 2
Vessünk egy közelebbi pillantást a folyamat létrehozása unit tesztek az előző listát. Az alapötlet az, hogy teszteljék a tulajdonságait az egyes osztály boost makrók. Makrók és BOOST_CHECK BOOST_REQUIRE_EQUAL előre definiált makrók (vagy mérési eszközök), szerepel a keret Boost, és célja, hogy ellenőrizze, hogy a termelés a kódot.
tesztelési eszközök kiemelés
4. lista Három lehetőség felhasználásával tesztelési eszközök kiemelés
Az ellenőrzés első BOOST_CHECK kudarcba fulladt, valamint az első teszt BOOST_REQUIRE. Mielőtt azonban a második teszt BOOST_CHECK nem jött, mert a teszt munkát azonnal félbe kell szakítani egy sikertelen befejezése BOOST_REQUIRE csekket. 5. lista mutatja az eredményeket végrehajtó kód a 4. listában.
Ha a tanulmányt a probléma akkor ellenőrizze az egyes funkciók vagy osztály módszerek, a legegyszerűbb módja annak, hogy hozzon létre egy új tesztet, és hívja az eljárást, átadva azt a bemeneti érvek és a várható értékeket. Egy ilyen példa látható, a 6. lista.
Listing 6. Egy kiemelés, hogy teszteljék a funkciókat és módszereket az osztály
összehasonlítás minták
Gyakori az eredmények összehasonlítása által visszaadott egy funkciót, a referenciaértéket. Ilyen esetekben is nagyon jól alkalmazható makro BOOST_CHECK. Ezen felül, akkor kell használni output_test_stream osztályt a kiemelés könyvtárak. Output_test_stream osztály inicializálja egy referencia fájlt (ebben a példában run.log fájl). Következtetés C / C ++ funkció át a output_test_stream objektumot. majd felhívja match_pattern eljárást. Ezt részletesen tárgyalja a 7. példában.
Listing 7. Mintaillesztés egy referencia fájlt
Összehasonlítása lebegőpontos
Az egyik legnehezebb tesztek regressziós tesztelés összehasonlítani az értékeket lebegőpontos. Vessen egy pillantást a kódot Listing 8 - első pillantásra úgy tűnik, hogy minden megfelelően működik.
Listing 8. összehasonlítása lebegőpontos, amely nem működik
A vizsgálat során a végrehajtás BOOST_CHECK makró nem működik, annak ellenére, hogy a használata sqrt függvény. része a szabványos könyvtárak. Mi a baj? összehasonlítása a lebegőpontos pontosság probléma: a változók f1 és az eredmény * eredmény kezdenek eltérőek, mivel néhány tizedes. A helyzet orvoslása érdekében a kiemelés vizsgálati eszközök közé BOOST_WARN_CLOSE_FRACTION makrókat. BOOST_CHECK_CLOSE_FRACTION és BOOST_REQUIRE_CLOSE_FRACTION. Ahhoz, hogy használni ezeket, meg kell csatlakoztatni egy előre meghatározott fejlécet kiemelés floating_point_comparison.hpp. Mindhárom makrók ugyanaz a formája, ezért csak azokat a verziójának ellenőrzése (lásd lista 9).
Listing 9. makrószintaktikát BOOST_CHECK_CLOSE_FRACTION
Ahelyett, hogy egy makró BOOST_CHECK. amint azt a jegyzék 9. Próbáljon egy makró BOOST_CHECK_CLOSE_FRACTION elfogadható pontossággal 0,0001. Ez a kód listán látható 10.
Lista 10. összehasonlítása lebegőpontos, amely működik
Ez a kód működik. Most változni lista 10-én a megengedhető precíziós 0,0000001. Az eredményt a 11. példa.
Listing 11. Hiba összehasonlítva miatt elviselhetetlen pontossággal
Egy másik gyakori (és meglehetősen bonyolult) probléma, folyamatosan előforduló működő verziója az adott alkalmazásnak, hogy összehasonlítsa a változók a kettős és úszó típusok. BOOST_CHECK_CLOSE_FRACTION makró egy figyelemre méltó jellemzője, hogy nem teszi lehetővé, hogy végre ilyen összehasonlítást. A bal és a jobb makró értéke legyen ugyanolyan típusú: float vagy dupla. Ha Listing 12 változó f1 lesz típus dupla és az eredmény eredmény - float típusú hiba fordul elő fordításkor.
Listing 12. hiba: A bal és jobb érvek BOOST_CHECK_CLOSE_FRACTION különböző típusú
Támogatja az egyéni állítmány
Kiemelés vizsgálati eszközök tud működni logikai feltételekkel. Tudod kiterjeszteni ezeket az eszközöket, hogy támogassák a bonyolultabb vizsgálat, például a meghatározása az identitás tartalmát a két lista, vagy ellenőrizze, hogy az adott körülmények között az összes eleme a vektor. Szűkítheti makró BOOST_CHECK. támogatást nyújt a felhasználó által meghatározott feltételnek. Próbáljunk egy speciális, ellenőrzés a lista tartalmának generált a felhasználó által definiált függvény a nyelv C. és meghatározza, hogy az értékek az összes keletkező elemek nagyobb, mint 1. egyéni érvényesítő funkciót kell visszaküldenie típusú boost :: test_tools :: predicate_result. Úgy ítélik meg részletesen listán 13.
Listing 13. ellenőrzése komplex predikátumok szerszámokkal kiemelés
Predicate_result objektum implicit konstruktor, hogy vesz egy logikai érték. Ez magyarázza, hogy a kód jól működik, még abban az esetben, ha a várható és tényleges hozam típusú validate_list különböznek.
Egy másik módja, hogy teszteljék komplex predikátumok boost BOOST_CHECK_PREDICATE az, hogy egy makró. Ennek az az előnye, hogy a makró nem használ predicate_result. A hátránya, hogy bizonyos bonyolult a szintaxis. A BOOST_CHECK_PREDICATE makró át kell mennie egy függvény neve és argumentum (vagy érveket). Felsorolja a 14 nem ugyanaz a dolog, mint csak felsorolja 13 más makrók használják azt. Megjegyezzük, hogy a visszatérési típus most validate_result logikai.
Listing 14. Macro BOOST_CHECK_PREDICATE
Forgalomba több teszt csomagokat egy fájlba
Akkor több helyen teszt csomagokat egy fájlba. Minden vizsgálati csomag kell egy pár BOOST_AUTO_TEST_SUITE makrók. BOOST_AUTO_TEST_SUITE_END. belül meghatározott fájlt. Lista 15. ábra két különböző vizsgálati csomagokat helyezzük egy fájlban. Amikor a regressziót futtatni a végrehajtható fájlt egy előre meghatározott opció -log_level = test_suite. Mint látható, a lista 16. kiadási generált használja ezt az opciót, akkor hajlamosabb a gyors és részletes hibakeresés.
Listing 15. Néhány teszt csomagokat helyezzük egy fájlba
Az alábbiakban egy kimeneti végrehajtásával kapott kódot hirdetések 15.
Listing 16. Futó több tesztkészle- a lehetőséget -log_level
Megértése a szerkezet a vizsgálati csomag
Eddig már tárgyalt a Boost teszt csomagokat, amelyek nem rendelkeznek egy hierarchikus. Most próbáljuk megteremteni a kiemelés tesztsorozat, amely teszteli szoftver, mivel ez általában a felhasználó lát külső eszközöket. Keretében a vizsgálat általában jelen vannak számos vizsgálati csomagokat, amelyek mindegyike ellenőrzi az egyes funkciókat. Például egy keretet regressziós tesztelés Szövegszerkesztői kell tartalmaznia vizsgálati csomagokat, hogy ellenőrizze a betűtípus támogatja a különböző formátumok, és így tovább. D. Minden egyes vizsgálati csomag tartalmaz néhány egység vizsgálatok. Listing 17 egy példát mutat a teszt keretrendszer. Felhívjuk figyelmét, hogy a belépési pontot, ahonnan indul kódfuttatást kell olyan eljárásnak nevezett (megfelelően) init_unit_test_suite.
Listing 17. létrehozása mester tesztsorozat futtatni regressziót
Mindegyik teszt csomag (például csomag TS1 17. ábra) által létrehozott a makró BOOST_TEST_SUITE. Macro elvárja karakterlánc, amely a nevét a tesztsorozat. Minden vizsgálati csomagok, végső soron, adunk a fő tesztsorozat módszerrel ADD. Hasonlóképpen, akkor hozzon létre egy teszt segítségével BOOST_TEST_CASE makro és add meg a teszt csomag módszerrel add. Azt is hozzá a unit tesztek a fő tesztsorozat, bár ez nem ajánlott. master_test_suite módszer részeként meghatározott névtér boost :: unit_test :: keret - ezen belül végrehajtja egyelem¶. Amint az a lista 18 kódot (amit a forráskód a Boost) elmagyarázza, hogyan működik.
Lista 18. megértése módszer master_test_suite
Teszt modul segítségével létrehozott BOOST_TEST_CASE makró. veszi bemeneti paraméterként függvénymutatók. Tehát Listing 17 test_case1 funkciót. test_case2 és így tovább. d. üresek void-funkciók a felhasználó programozhatja ahogy akar. Jegyezzük meg, hogy a teszt beállítást kiemelés használ egy bizonyos kis mennyiségű memóriát a halom; BOOST_TEST_SUITE minden egyes hívás érkezik egy új kihívás boost :: unit_test :: test_suite (<имя тестового пакета>).
Mintarögzitő - egy előre konfigurált a környezet állapotáról, amelyben a vizsgálatot végzik. Miután a vizsgálat befejezése összes beállítás ebben a környezetben, hogy a kezdeti értékre. Példa lámpatest látható a 19. példában.
Listing 19. Egyszerű lámpatest kiemelés
A kapott eredményeket a 20. példában.
Listing 20. Az eredmények felhasználásával a lámpatest kiemelés
Ahelyett, hogy egy makró BOOST_AUTO_TEST_CASE ezt a kódot használja BOOST_FIXTURE_TEST_CASE makró. amely továbbításra egy további érv. Módszerek konstruktor és destruktor a tárgy és működtesse a beállítást tisztítás. Ezt támasztja alá egy gyors pillantást a címet a modul kiemelés unit_test_suite.hpp (felsorolja 21).
Listing 21. Meghatározó lámpatest kiemelés cím unit_test_suite.hpp
Fokozza public class örökli struct F struktúra (lásd. A lista 19), és létrehozza az annak alapján objektumot. A szabályok szerint az öröklés C ++ nyilvános összes védett és public class változók struct közvetlenül elérhető a következő funkciókat. Megjegyezzük, hogy a változó 19. példában, az i változó t tartozik a belső objektum F típusú (lásd. A lista 20). Ez normális tesztnél tesztelj explicit inicializálás (ezért van szükség a készülék) csak akkor van szükség, két vagy három teszt. Felsorolja a 22. ábra a tesztsorozat, amelyben csak az egyik a három tesztek segítségével szerelvény.
Listing 22. Test csomag Boost, amely a kísérleti eszközt és anélkül mérkőzések
Jegyzék tartalmazza lámpatestek 22 meghatározott és csak egyetlen teszt. Makro BOOST_GLOBAL_FIXTURE (<имя фикстуры>) Fokozza a felhasználó meghatározhatja és használhatja a globális berendezési tárgyak. Akkor tetszőleges számú globális berendezési tárgyak, így külön inicializálási kódot. Egy példa segítségével globális szerelvény 23 listán látható.
Listing 23. Egy globális lámpatest inicializálás regresszió
Abban az esetben, több berendezési tárgyak saját beállítást és pusztítás fordul elő a sorrendben, amelyben bejelentik. A lista 24, a kivitelező és destruktor az osztály F nevezik, mielőtt a kivitelező és destructor F2 osztályba tartozó, rendre.
Listing 24. A több globális lámpatest a regressziós
Vegye figyelembe, hogy nem tudja használni a globális berendezési tárgyként az egyes vizsgálatok. Azt is lehet, hogy közvetlenül hozzáférjenek a nyilvános / védett nem statikus módszer vagy változó a vizsgálatot.
következtetés
- Eredeti cikk Nyílt forráskódú C / C ++ egység tesztelő eszközök, 1. rész: Ismerd meg a Boost egység vizsgálati keret (EN).
- Dokumentáció kiemelés (EN) - egy átfogó útmutató szentelt Boost vizsgálati eszközök
- Irányelvek és protokollok kiemelés (EN) - Kézikönyv a politika és a Boost tesztelése protokollok
- levelezőlista kiemelés (HU) - a különböző információk, beleértve a hibaelhárítási utasítások a telepítés során és a tesztelés