Tesztelés – Teljesítményellenőrzés folyamata – Minőségbiztosítás
Ismerje meg a szoftveres teljesítménytesztelés és minőségbiztosítás (QA) fejlett fogalmait, beleértve a folyamatokat, módszertanokat, eszközöket, mérőszámokat é...
A füstteszt egy gyors, végpontok közötti ellenőrzés, amely azt vizsgálja, hogy egy szoftverpipeline reprezentatív adatokon végrehajtható-e összeomlás nélkül, és elvárt kimeneteket produkál. A TarmacView scripts/smoke_*.py tesztjei a pipeline egyes fázisait validálják (analyze, assess, crack, defect, survey, visualize). A cikk kiterjed a füsttesztek tervezésére, arra, hogy mit ellenőriznek a füsttesztek a teljes tesztekhez képest, valamint a CI/CD-ben betöltött szerepükre.
{{
A füstteszt egy könnyű súlyú automatizált ellenőrzési eljárás, amely egy szoftverpipeline-t futtat végpontok között reprezentatív vagy minimális bemeneti adatokon, hogy megerősítse: a pipeline összeomlás nélkül fut le, és a kimeneti fájlok az elvárt szerkezettel rendelkeznek. A teszt bináris sikeres/sikertelen kiértékelést végez – ha bármely lépés kezeletlen kivételt dob, nem produkál kimenetet, vagy a kimenetből hiányoznak kritikus oszlopok, a teszt megbukik, és a build azonnal elutasításra kerül.
A kifejezés a hardvermérnökségből származik, ahol a metafora szó szerinti. Amikor a mérnökök első alkalommal kapcsoltak be egy újonnan összeszerelt áramköri lapot, figyelték, hogy száll-e ki füst a kiégett alkatrészekből. Ha füst jelent meg, a lap katasztrofális meghibásodást szenvedett, és minden további tesztelés leállt. A hibás lapot vagy megjavították, vagy kidobták, mielőtt bárki időt fektetett volna a részletes diagnosztikába. A szoftveres füsttesztelés ugyanezt az elvet alkalmazza: futtasd a kódot, és ellenőrizd a “füstöt” – összeomlások, el nem kapott kivételek, hiányzó kimenetek – mielőtt időt fektetnél a részletes validációba.
A felügyeleti szoftver-pipeline-ok kontextusában a füstteszt azt validálja, hogy a feldolgozási lánc minden szakasza képes-e reprezentatív adatokon végrehajtódni. A TarmacView esetében ez egy kis kifutópálya- vagy burkolatkép átfuttatását jelenti a teljes pipeline-on – a képbeolvasástól a repedésdetektáláson, hibabesoroláson, felületfelmérésen, térképezésen és vizualizáción át – és annak ellenőrzését, hogy minden szakasz hibamentes kimenetet produkál. Ez különösen kritikus a repüléssel kapcsolatos szoftvereknél, ahol a pipeline-hibák késleltethetik a repülőtéri infrastruktúra-felméréseket, amelyek közvetlenül befolyásolják a repülésbiztonságot.
A build-verifikációs teszt (BVT) kifejezést gyakran használják a füstteszt szinonimájaként, a Microsoft a legjelentősebb átvevője ennek a terminológiának. A Microsoft belső fejlesztési folyamatai – különösen a Windows és Office esetében – a füsttesztelést kötelező minőségi kapuként intézményesítették az 1990-es években. Steve McConnell Code Complete című könyve a “napi build és füsttesztet” a legmagasabb szintű iparági bevált gyakorlatként azonosítja a folyamatos integráció érettségének mérésére. A Google Site Reliability Engineering (SRE) keretrendszere a füstteszteket a “rendszertesztelés” kategóriába sorolja – ezek a legegyszerűbb típusok, amelyeket kifejezetten a költséges tesztelési pipeline-ok lerövidítésére használnak.
A füsttesztelés célja háromirányú:
A füsttesztek a tesztelési piramis első szintjét foglalják el, az egységtesztek, integrációs tesztek és végpontok közötti regressziós szettek előtt futnak. Úgy tervezték őket, hogy egy tipikus felügyeleti pipeline esetében 60 másodperc alatt elkészüljenek, ami alkalmassá teszi őket minden egyes kódkommitnál történő futtatásra a CI/CD-ben. Magas tesztelési érettségű szervezetekben a füsttesztek minden push-nál futnak bármely ágon, nem csak a főágon, biztosítva a lehető legkorábbi észlelést az integrációs hibákra.
A füsttesztelés koncepciója évtizedekkel megelőzi a szoftvermérnökséget. A kifejezés első dokumentált használata a vízvezeték- és kályhatesztelésből származik a 19. századból. A kályhagyártók tüzet gyújtottak egy újonnan összeszerelt kályhában, elzárták az összes csappantyút, és figyelték, hogy hol szivárog a füst – ha nem kívánt helyeken tört elő a füst, a kályha gyártási hibával rendelkezett. Ugyanez a logika – “alkalmazz minimális energiát, és figyeld, hol törik el a dolog” – vándorolt át az elektronikai tesztelésbe a 20. század közepén, majd végül a szoftvermérnökségbe az 1980-as és 1990-es években.
A Microsoft széles körben elismerten hozta be a füsttesztelést a mainstream szoftvermérnökségi gyakorlatba. Az 1990-es évek végén a Microsoft Windows és Office divíziói bevezették az úgynevezett Build Verification Testing (BVT) eljárást kötelező kapuzási folyamatként. Minden éjszakai build-nek át kellett esnie egy BVT-szerten, mielőtt a build belső tesztelőkhöz került. Ha a BVT megbukott, a build “eltörtnek” számított, és a felelős fejlesztőt az időponttól függetlenül értesítették. Ez az azonnali elszámoltathatósági kultúra a build minőségéért a Microsoft mérnöki kultúrájának alapkövévé vált, és széles körben dokumentálták az MSDN dokumentációban és a Microsoft Press könyveiben.
A Crosslake Technologies taxonómiája (amely közvetlenül a Microsoft gyakorlatából ered) különbséget tesz a füsttesztek és a BVT-k között. A füstteszteket “felületes – alapvető funkciók működésének biztosítása” jelleggel írják le, percek alatt futnak, és a kritikus funkciókra összpontosítanak. A BVT-ket “a füsttesztek bővített halmazaként” írják le, amelyek “kissé alaposabbak”, de szintén percek alatt futnak, nem órák alatt. Mindkettő ugyanazt a kapuzási funkciót szolgálja, de a BVT-k szélesebb körű kritikus útvonal forgatókönyveket tartalmaznak.
A Google az SRE (Site Reliability Engineering) gyakorlatán keresztül vette át a füsttesztelést. A Google Testing Blog a füsttesztelést ismert, elfogadott gyakorlatként kezeli, inkább arra összpontosítva, hogyan kell súlyozni a füsttesztek eredményeit más tesztelési típusok mellett. A Google mérnöki kultúrája a precizitást hangsúlyozza az egységtesztekben és a súlyozott megbízhatósági pontozást a füstteszt-jellegű széles körű ellenőrzéseknél, a füstteszteket az egységtesztek kiegészítőinek tekintve, nem pedig helyettesítőinek.
A repüléssel kapcsolatos szoftverek területén a füsttesztelés a DO-178C 6.4.3 szakaszában leírt Hardver/Szoftver Integrációs Tesztelési fázisba illeszkedik. Bár a DO-178C nem nevezi kifejezetten “füsttesztelésnek” a fogalmat, a szabvány megköveteli, hogy az integrált rendszer “boot-oljon és az alapvető funkciók működjenek”, mielőtt a mélyebb tesztelés megkezdődik. Ez funkcionálisan azonos a füstteszteléssel. Az ICAO Annex 14 – amely a repülőterek tervezését és üzemeltetését szabályozza – hatálya alá tartozó repülőtéri felügyeleti szoftverek esetében a füsttesztek biztosítják a szoftver megbízhatóságának garanciáját, amely a repülőtéri biztonsági irányítási rendszereket tápláló Burkolatállapot-index (PCI) felmérések támogatásához szükséges.
Annak megértése, hogy hol helyezkednek el a füsttesztek a tágabb tesztelési taxonómiában, elengedhetetlen a kiegyensúlyozott minőségbiztosítási stratégia felépítéséhez. A négy fő tesztelési szint egymást kiegészítő, de eltérő szerepet tölt be, mindegyik más-más meghibásodási módot célozva a pipeline-életciklus különböző szakaszaiban.
| Dimenzió | Füstteszt | Egységteszt | Integrációs teszt | Rendszerteszt |
|---|---|---|---|---|
| Hatókör | Teljes pipeline végpontok között | Egyetlen függvény vagy metódus | Két vagy több egymással kölcsönható komponens | Teljes rendszer éleshez hasonló környezetben |
| Adat | Minimális reprezentatív minta | Mock-olt vagy szubsztituált bemenetek | Valós, de korlátozott adat | Éles méretű adat |
| Végrehajtási idő | Másodpercek – 1 perc alatt | Milliszekundumok | Percek – órák | Órák – napok |
| Mit fog el | Összeomlások, hiányzó kimenetek, import hibák | Logikai hibák egy függvényen belül | Interfész-eltérések, protokoll hibák | Végpontok közötti helyesség, teljesítmény |
| Függőségek | Valós (nem mock-olt) | Mock-olt vagy szubsztituált | Valós részhalmaz | Teljes éles stack |
| Gyakoriság | Minden kommitnál CI-ben | Minden kommitnál CI-ben | Build-enként vagy éjszakánként | Kiadásonként |
| Hibahatás | Megállítja a pipeline-t | Egyetlen függvényre korlátozódik | Blokkolja az integrációs ágat | Blokkolja a kiadást |
Egységtesztek azt validálják, hogy az egyes függvények a megadott bemenetekre helyes kimeneteket produkálnak. Minden külső függőséget mock-olnak – adatbázisok, fájlrendszerek, hálózati szolgáltatások, hardvergyorsítók. Egy repedésdetektáló függvény egységtesztje ellenőrizheti, hogy a függvény helyesen azonosítja-e a repedéseket egy szintetikus 10x10 pixeles tömbben ismert repedéspozíciókkal. Az egységtesztek szűkek és mélyek: egyetlen függvény logikáját ellenőrzik kimerítően, lefedve a szélsőséges eseteket, határfeltételeket és hibautakat. Az egységtesztek azonban nem képesek elkapni az integrációs hibákat, mert a függőségek mock-olva vannak – a teszt soha nem gyakoroltatja a tényleges importláncot, konfigurációbetöltést vagy modulok közötti adatáramlást.
Integrációs tesztek azt validálják, hogy két vagy több komponens együtt helyesen működik-e. Valós, de kontrollált példányait használják a függőségeknek. A TarmacView egy integrációs tesztje ellenőrizheti, hogy a képbeolvasási szakasz helyesen adja-e át az adatokat a repedésdetektáló modellnek a várt tenzor formátumban, a megfelelő csatornasorrenddel és normalizációs paraméterekkel. Az integrációs tesztek szűkebbek a pipeline hatókörében, mint a füsttesztek, de mélyebbek az interakciók validálásában: konkrét komponenshatárokra összpontosítanak a teljes pipeline helyett.
Füsttesztek azt validálják, hogy a teljes pipeline összeomlás nélkül végrehajtódik. Minden szakaszt egymás után futtatnak valós, bár kis adatokkal. A füsttesztek szélesek és sekélyek – lefedik a teljes pipeline-t, de csak azt ellenőrzik, hogy a végrehajtás befejeződik és a kimenetek léteznek, nem pedig azt, hogy a numerikus eredmények helyesek-e. Egy repedéshossz-számítás, amely 47,2 képpontot ad vissza a helyes 42,1 helyett, átmegy a füstteszten, amíg a length_px oszlop létezik és lebegőpontos értéket tartalmaz.
Rendszertesztelés (más néven végpontok közötti tesztelés) a teljes rendszert futtatja éles méretű adatokkal egy éleshez hasonló környezetben. Azt ellenőrzik, hogy a rendszer megfelel-e funkcionális és nem funkcionális követelményeinek, beleértve a pontosságot, teljesítményt és megbízhatóságot. A rendszertesztelés a legdrágább futtatni és karbantartani, és csak kiadásjelölteken fut, nem minden kommitnál.
A tesztelési piramisban a füsttesztek alkotják az alapréteget – ezek futnak először, leggyorsabban és leggyakrabban. Ha egy füstteszt megbukik, az adott build-en az egység- és integrációs teszteket kihagyják, vagy megbízhatatlannak jelölik. Ez számítási erőforrásokat és fejlesztői időt takarít meg azáltal, hogy gyorsan jelez a hibáról, amikor a pipeline alapvető végrehajtása hibás.
A hatékony füstteszt-tervezés középpontjában a reprezentatív minimális bemenet koncepciója áll – az a legkisebb adathalmaz, amely a pipeline minden szakaszát gyakoroltatja anélkül, hogy adatfüggő szélsőséges eseteket aktiválna. Ez a legfontosabb tervezési döntés egy füstteszt-szert felépítésekor.
1. elv: Minimális, de nem triviális. A bemenetnek elég nagynak kell lennie ahhoz, hogy áthaladjon a pipeline minden szakaszán anélkül, hogy olyan kódútvonalakat járna be, amelyek megkerülik a valódi feldolgozási logikát. Egy egypixeles kép triviális – átmenne a képbetöltésen, de a feldolgozó algoritmusok degenerált kódútvonalakat járnának be, amelyek soha nem futnak le valós adatokon. Egy 256x256 pixeles kép tényleges kifutópálya-burkolatról minimális, mégis reprezentatív: gyakoroltatja a csempézett feldolgozó algoritmusokat, színnormalizációs rutinokat és modell-kiértékelési útvonalakat anélkül, hogy túlzott számítási időt igényelne.
2. elv: Reprezentatív az éles adatokhoz képest. A bemenetnek ugyanazokkal a fájlformátummal, színmélységgel, metaadat-szerkezettel és statisztikai tulajdonságokkal kell rendelkeznie, mint az éles adatoknak. Ha az éles adatok egy Phase One iXM-RS150F légi kamerából származnak, amely 16 bites TIFF fájlokat rögzít beágyazott EXIF GPS metaadatokkal, a füstteszt bemenetének is ezeket a jellemzőket kell tükröznie. Szintetikus adatok használata, amelyek eltérnek az éles adatoktól, meghiúsítja a füstteszt célját, mert a pipeline-hibák gyakran az éles adatok váratlan tulajdonságaiból erednek – hiányzó EXIF címkék, váratlan színprofilok, nem szabványos GeoTIFF vetületi karakterláncok.
3. elv: Rögzített és verziókezelt. A füstteszt bemeneteket a kóddal együtt verziókezelésbe kell venni bináris fájlként, vagy Git LFS-en (Large File Storage) keresztül kell kezelni. Soha nem változhatnak explicit felülvizsgálat nélkül pull request-eken keresztül. A változó bemenet lehetetlenné teszi a pipeline-regressziók és a tesztadatok változásainak megkülönböztetését – egy füstteszt, amely ma sikeres és holnap sikertelen, jelezhet akár kódregressziót, akár módosított tesztbemenetet. A bemenetek verziókezelése kiküszöböli ezt a kétértelműséget.
4. elv: Gyorsan feldolgozható. A teljes füstteszt-szert végrehajtási ideje nem haladhatja meg a 60 másodpercet egy tipikus pipeline esetében, és a 3 percet összetett több szakaszos pipeline-ok – például felügyeleti szoftverek – esetében. Ez a korlát határozza meg a bemenet méretét. Kép alapú felügyeleti pipeline-okhoz egyetlen 512x512 pixeles kép általában elegendő. Videó-pipeline-okhoz egyetlen képkocka vagy egy 2 másodperces klip. LiDAR pipeline-okhoz egyetlen repülési vonalszakasz, amely 100 méternyi burkolatot fed le.
5. elv: Ismert jellemzőket tartalmaz. A tesztbemenetnek tartalmaznia kell azokat a jellemzőket, amelyeket a pipeline egyes szakaszai detektálni hivatottak. Egy repedésdetektálásra szolgáló füstteszt haszontalan, ha a bemeneti kép nem tartalmaz repedéseket – a pipeline csendben átugorhatná a repedésdetektálást, és így is sikeres lenne. A tesztbemeneteket úgy kell összeválogatni, hogy az egyes detektálható jellemzőkből legalább egy példányt tartalmazzanak ismert alapigazsággal, amelyre a hibaelemzés során hivatkozni lehet.
A TarmacView felügyeleti pipeline-jához a füstteszt bemenet egyetlen 1024x768 pixeles RGB ortofotó sáv repülőtéri burkolatról, 1 mm-es terepi mintavételezési távolsággal (GSD) rögzítve. A kép legalább egy látható repedést, egy felületi hibát (pl. kátyúsodás vagy kitöredezés) és egyértelmű burkolati jelzéseket tartalmaz. Ez az egyetlen kép:
A várt feldolgozási idő ennél az egyetlen képnél a teljes pipeline-on keresztül 30 másodperc alatt van CI-hardveren, ami időt hagy a szert további füsttesztjeinek. A tesztképet a tests/data/smoke/ könyvtárban tárolja a tároló, és Git LFS-en keresztül verziókezelt.
A TarmacView felügyeleti pipeline-ját dedikált füstteszt szkriptek sorozata validálja, amelyek mindegyike egy adott pipeline-fázist fed le. Ezek a szkriptek a scripts/ könyvtárban találhatók a smoke_<fázis>.py elnevezési konvenciót követve. Minden szkript önállóan (fejlesztési hibakereséshez) és a CI-szert részeként (automatizált kapuzáshoz) is futtatható.
{{
Ez a szkript a képfeldolgozási fázist validálja. Beolvas egyetlen reprezentatív ortofotó sávot, lefuttatja a teljes feldolgozási pipeline-t a képfeldolgozó modulon keresztül, és ellenőrzi:
A szkript elfogad egy --input argumentumot, amely a tesztképre mutat, és egy --output-dir argumentumot, amely meghatározza, hogy a pipeline hova írja az eredményeket. Ha a pipeline bármely feldolgozási lépésben összeomlik, a kivétel elkapásra kerül, és a teszt strukturált hibajelentést ad vissza.
Ez a szkript a burkolat állapotfelmérési fázist validálja. A feldolgozási fázis kimenetét (vagy egy verziókezelésben tárolt előre generált feldolgozási fájlt) veszi bemenetként, lefuttatja az állapotfelmérő algoritmust, és ellenőrzi:
pavement_id, condition_index, severity, extent, date_assessedA TarmacView állapotfelmérő algoritmusa az ASTM D5340 szabványt követi a repülőtéri PCI számításhoz, automatizált képalapú felügyelethez adaptálva. A füstteszt nem ellenőrzi, hogy a PCI értékek numerikusan helyesek-e – csak azt ellenőrzi, hogy a számítás lefut, az eredményeket a várt formátumban állítja elő, és lemezre írja őket.
Ez a szkript a repedésdetektálási fázist validálja. Lefuttatja a repedésdetektáló modellt egy ismerten repedéseket tartalmazó tesztképen, és ellenőrzi:
crack_id, length_px, width_px, orientation, confidence, classificationA TarmacView által használt repedésdetektáló modell egy U-Net architektúra ResNet-50 törzzsel, amely több repülőtérről származó feliratozott burkolati képeken lett betanítva. A füstteszt bemeneti képet kifejezetten a validációs halmazból választották ki, ami azt jelenti, hogy olyan repedéseket tartalmaz, amelyeket a modell a tanítás során már látott, de a tesztkészlet kiértékelése során nem.
Ez a szkript a felületi hibák osztályozási fázisát validálja. Lefuttatja a hibabesorolót egy ismert hibákat (kátyúsodás, kitöredezés, foltozás, időjárás okozta károsodás) tartalmazó tesztképen, és ellenőrzi:
defect_id, defect_type, area_px, severity, confidence, timestampA hibabesoroló egy Mask R-CNN architektúrát használ, amely példány-szegmentációs maszkokat hoz létre minden észlelt hibához. A füstteszt ellenőrzi, hogy a kimeneti maszk méretei helyesek-e, és hogy a leltárfájl tartalmazza-e a várt sémaoszlopokat. Nem ellenőrzi, hogy a hibabesorolások helyesek-e – ehhez külön validációs szettre van szükség feliratozott alapigazság adatokkal.
Ez a szkript a térképezési fázist validálja. A felsőbb szakaszok által előállított repedés- és hibaadatokat veszi bemenetként, lefuttatja a geotérbeli térképező modult, és ellenőrzi:
A térképező modul az ortofotó georeferálási metaadatait használja a pixelkoordináták földrajzi koordinátákká történő projektív transzformációjához. A füstteszt ellenőrzi, hogy ez a transzformáció érvényes földrajzi koordinátákat állít-e elő a tesztkép várt befoglaló téglalapján belül. A tesztkép helyszínéről a repülőtéren készült fénykép vizuális keresztreferenciát biztosít a hibaelemzéshez.
Ez a szkript a vizualizációs és szegmentációs fej fázist validálja – a pipeline utolsó szakaszát, amely emberi olvasásra alkalmas kimenetet állít elő. A feldolgozott pipeline-kimeneteket veszi, lefuttatja a vizualizációs megjelenítőt, és ellenőrzi:
A vizualizációs fázis gyakran az első hely, ahol a kumulatív pipeline-hibák láthatóvá válnak. Egy repedésdetektálási szakasz, amely rossz koordinátatérben hoz létre maszkot, olyan vizualizációt eredményez, ahol a repedésfedvények eltolódnak az alapképhez képest. A füstteszt ezt közvetetten érzékeli, ha a megjelenítés összeomlik, de a vizuális ellenőrzési regressziós teszt – nem a füstteszt – az, ami a vizuális minőségi regressziókat kiszűri.
Ezek a füsttesztek sorosan futnak, de önállóan is végrehajthatók, ha a felsőbb szakaszok kimenetei gyorsítótárazva vannak. A teljes szert kevesebb mint 3 perc alatt fut le CI-hardveren. Minden teszt strukturált JSON jelentést ad ki a következő mezőkkel:
| Mező | Típus | Leírás |
|---|---|---|
test_name | string | A teszt egyedi neve (pl. “smoke_crack”) |
passed | boolean | A teszt sikeres (true) vagy sikertelen (false) volt |
duration_ms | integer | Falióra szerinti végrehajtási idő ezredmásodpercben |
output_files | string tömb | A teszt során létrehozott kimeneti fájlok elérési útjai |
failure_reason | string vagy null | Emberi olvasásra alkalmas hiba oka, ha a teszt sikertelen volt |
input_path | string | A teszthez használt bemeneti adat elérési útja |
pipeline_version | string | A pipeline kód Git commit SHA-ja vagy verziócímkéje |
A teszfuttató az egyes JSON jelentéseket egy szert összesítésbe gyűjti, amelyet közzétesz a CI műszerfalon, és opcionálisan elküld Slackre vagy e-mailbe valós idejű értesítésként.
A füsttesztek szándékosan szűk körben állítanak ki állításokat. Három kategóriájú feltételt ellenőriznek, és semmi többet. Ez a szűk hatókör szándékos – gyorsan, determinisztikusan és könnyen karbantarthatóvá teszi a teszteket.
A legalapvetőbb állítás: a kód végrehajtódik-e anélkül, hogy kezeletlen kivételt dobna? Ez magában foglalja:
Egy olyan pipeline, amely induláskor vagy végrehajtás közben összeomlik, azonnal megbuktatja a füsttesztet. A hiba okát a kivétel visszakövetéséből rögzítik, közvetlen mutatót biztosítva a fejlesztőknek a hiba kódhelyére.
A végrehajtás befejezése után a füstteszt ellenőrzi, hogy a kimeneti fájlok a várt útvonalakon léteznek. Ez magában foglalja:
Egy olyan pipeline, amely azt állítja, hogy befejeződött, de nem hoz létre kimeneti fájlokat, megbuktatja a füsttesztet. Ez elkapja a csendes hibákat, ahol a pipeline tisztán kilép, de kihagyja a kritikus írási műveleteket hibásan konfigurált kimeneti útvonalak vagy váratlanul hamisra kiértékelt feltételes logika miatt.
Minden táblázatos kimenetnél (CSV, Parquet, GeoJSON feature collection) a füstteszt ellenőrzi, hogy a várt oszlopok név szerint léteznek. Ez egy szerkezeti integritási ellenőrzés – az oszlopsémának meg kell egyeznie azzal, amit a downstream felhasználók elvárnak.
| Kimeneti típus | Kötelező oszlopok |
|---|---|
| Repedésleltár | crack_id, length_px, width_px, orientation, confidence, classification |
| Hibaleltár | defect_id, defect_type, area_px, severity, confidence, timestamp |
| Állapotfelmérés | pavement_id, condition_index, severity, extent, date_assessed, method |
| Térképezés | feature_id, latitude, longitude, geometry_type, crs_epsg, accuracy_m |
A teszt oszlop-létezési ellenőrzést használ (nem típusellenőrzést, nem értéktartomány-ellenőrzést). Ez szándékos – az oszlop létezése a minimális szerkezeti integritási garancia. A típus- és tartományellenőrzések az integrációs és validációs tesztek közé tartoznak, ahol a futtatás költségét indokolja a kapott információ mélysége.
A füsttesztek által végzett ellenőrzések negyedik kategóriája – amelyet gyakran figyelmen kívül hagynak – az adatformátum-kompatibilitás. A füstteszt ellenőrzi, hogy a kimeneti fájlok visszaolvashatók-e a várt downstream felhasználók által. TarmacView esetében ez a következőket jelenti:
Ez elkapja a formátumverziók közötti eltéréseket – például ha a Parquet könyvtárat frissítik és az megváltoztatja a kódolást, vagy ha a GeoJSON specifikáció fejlődik, és a pipeline kimenete már nem felel meg neki.
Ugyanilyen fontos megérteni, hogy mit zárnak ki szándékosan a füsttesztek. Ennek félreértése hamis biztonságérzethez vezet a pipeline helyességét illetően – egy sikeres füstteszt nem jelenti azt, hogy a pipeline helyes, csak azt, hogy nem katasztrofálisan hibás.
A füsttesztek nem ellenőrzik, hogy a számított értékek helyesek-e. Egy repedéshossz-számítás, amely 47,2 képpontot ad vissza a helyes 42,1 helyett, átmegy a füstteszten, amíg a length_px oszlop létezik és float értéket tartalmaz. A pontosság validálása az egységtesztek közé tartozik, ahol a helyes érték beégetve szerepel, és az integrációs tesztek közé, ahol az eredményeket tanúsított szakemberek kézi méréseivel hasonlítják össze.
Az ICAO Annex 14 hatálya alá tartozó repülőtéri felügyeleti pipeline-ok esetében a numerikus pontosság kritikus, mert az állapotfelmérések közvetlenül befolyásolják a karbantartási prioritásokat és a költségvetés-elosztást. Egy olyan pipeline, amely átmegy a füstteszteken, de pontatlan PCI pontszámokat produkál, hibás karbantartási döntésekhez vezethet. Ezért a füsttesztek csak az első kapu – pontosságra összpontosító validációs teszteknek kell követniük őket.
A füsttesztek reprezentatív, de nem ellenséges bemeneteket használnak. Nem tesztelik:
A szélsőséges esetek kezelését dedikált szélsőséges eset tesztek validálják, amelyek kifejezetten az egyes határfeltételeket célozzák. Ezek a tesztek drágábbak futtatni, és általában éjszakánként futnak, nem minden kommitnál.
A füsttesztek azt ellenőrzik, hogy a pipeline befejeződik, nem azt, hogy egy teljesítménykereten belül fejeződik be. Egy olyan pipeline, amely füsttesztekben 10 másodpercet vesz igénybe képenként, de az élesben 100 képet kell feldolgoznia másodpercenként, gond nélkül átmegy a füstteszteken. A teljesítmény validálásához dedikált benchmark tesztek szükségesek éles méretű adatokkal és időküszöbökkel.
Repülőtéri felügyeleti pipeline-ok esetében a teljesítmény kritikus, mert a repülőterek felmérésenként több száz burkolati képet dolgoznak fel. Egy 10-szeres teljesítményregresszió még átmehet a füstteszteken egyetlen képen, de teljes felméréseket lehetetlenné tenne. A teljesítmény-benchmarkok időküszöbökkel a megfelelő eszközök az ilyen regressziók észlelésére.
A füsttesztek csak a mag végrehajtási útvonalat fedik le. A nem kritikus útvonalon lévő funkciók – alternatív kimeneti formátumok, opcionális naplózás, telemetria, audit nyomvonalak, kísérleti export funkciók – nem fedettek. Az ezen területeken bekövetkező regressziót regressziós teszt szetteknek kell elkapniuk, amelyek kifejezetten a nem kritikus funkciókat célozzák.
A füsttesztek nem ellenőrzik, hogy az adatértékek belsőleg konzisztensek-e. Például egy füstteszt ellenőrzi, hogy a crack_id oszlop létezik-e, de nem ellenőrzi, hogy az összes crack_id érték egyedi, nem nulla, vagy a várt tartományon belül van-e. Az adatminőség validálásához dedikált adatminőségi tesztek szükségesek olyan keretrendszerekkel, mint a Great Expectations vagy a Pandera, amelyek adatszerződéseket definiálnak és adathalmazokat érvényesítenek ezek alapján.
A füsttesztek akkor nyújtják a legnagyobb értéket, ha integrálva vannak a folyamatos integrációs és folyamatos telepítési (CI/CD) pipeline-ba. A pipeline munkafolyamatban elfoglalt helyük meghatározza a minőségi kapuként betöltött hatékonyságukat.
{{
Egy tipikus CI/CD munkafolyamatban a füsttesztek a build-verifikációs szakaszban futnak, közvetlenül a fordítás után és minden más tesztelési szert előtt:
Kód Kommit → Build → Lint → Egységtesztek → Füsttesztek → Integrációs tesztek → Validációs tesztek → Telepítés
A pontos sorrend a projekt tesztelési stratégiájától függ. Egyes szervezetek az egységteszteket futtatják először azzal az indokkal, hogy azok gyorsabbak és logikai hibákat fognak el. Mások a füstteszteket futtatják először azzal érvelve, hogy egy olyan pipeline-t, amely az alapvető végrehajtáson összeomlik, el kell utasítani anélkül, hogy időt vesztegetnénk az egységtesztekre. A TarmacView pipeline párhuzamosan futtatja az egységteszteket és a füstteszteket egy sikeres build után, mivel független meghibásodási módokat fednek le, és nincsenek kölcsönös függőségeik.
Ez az elhelyezés biztosítja, hogy ha a build olyan pipeline-t hoz létre, amely az alapvető végrehajtáson összeomlik, akkor nem fogy további tesztinfrastruktúra. A visszacsatolási hurkot percekben, nem órákban mérik. Az a fejlesztő, aki olyan kommitot push-ol, amely megtöri az importláncot, 2-3 percen belül CI hibaértesítést kap, ahelyett, hogy 4 órát várna az integrációs teszt szett bukására.
A CI/CD pipeline kemény kaput használ: ha bármely füstteszt megbukik, a pipeline megáll, és nem lép tovább a következő szakaszokba. A build sikertelenként van megjelölve, és a fejlesztők értesítést kapnak a füstteszt hibajelentésével. Az alapértelmezett konfigurációban nincs manuális felülbírálási lehetőség – a sikeres füstteszt-szert szükséges feltétel a telepítéshez.
Ez a kapulogika megakadályozza a következő forgatókönyveket:
A kapu a CI platform konfigurációjában van implementálva. CircleCI esetében ez azt jelenti, hogy a munkafolyamat-függőségeket úgy kell konfigurálni, hogy a smoke-test feladat az integration-test és a deploy előtt fusson. GitHub Actions esetében ez a needs: kulcsszó használatát jelenti a feladatok sorrendjének kényszerítésére.
A szerten belüli füsttesztek párhuzamosan futhatnak, ha független pipeline-szakaszokat tesztelnek. A TarmacView füstteszt-szertje lehetőség szerint párhuzamosítást használ:
smoke_crack.py és a smoke_defect.py nem rendelkezik kölcsönös függőségekkel, és egyidejűleg futhat, 40%-kal csökkentve a teljes szertidőtsmoke_analyze.py-nak be kell fejeződnie a smoke_assess.py előtt, mivel az utóbbi a feldolgozás kimenetét használja felsmoke_survey.py függ a repedés- és hibakimenetektőlsmoke_seg_head.py függ az összes felsőbb szakasz kimenetétőlA párhuzamos végrehajtási stratégia a CI pipeline YAML-ben van konfigurálva feladatszintű párhuzamosítással. Minden feladat saját konténerben fut elszigetelt függőségekkel, megakadályozva az erőforrás-versengést.
A CI/CD integráció automatizált jelentéskészítést foglal magában több csatornán keresztül:
# .circleci/config.yml
version: 2.1
jobs:
smoke-test:
docker:
- image: tarmacview/pipeline:ci
parallelism: 3
steps:
- checkout
- run: pip install -r requirements.txt
- run: python scripts/smoke_analyze.py --input tests/data/smoke_image.tif --output-dir /tmp/smoke-output
- run:
name: "Parallel smoke tests"
command: |
python scripts/smoke_crack.py --input tests/data/smoke_image.tif --output-dir /tmp/smoke-output &
python scripts/smoke_defect.py --input tests/data/smoke_image.tif --output-dir /tmp/smoke-output &
wait
- run: python scripts/smoke_assess.py --input /tmp/smoke-output/cracks.parquet --output-dir /tmp/smoke-output
- run: python scripts/smoke_survey.py --input /tmp/smoke-output --output-dir /tmp/smoke-output
- run: python scripts/smoke_seg_head.py --input /tmp/smoke-output --output-dir /tmp/smoke-output
- store_artifacts:
path: /tmp/smoke-output
workflows:
version: 2
build-and-test:
jobs:
- build
- unit-tests:
requires: [build]
- smoke-test:
requires: [build]
- integration-tests:
requires: [smoke-test]
- deploy:
requires: [integration-tests]
Hatékony füsttesztek írása fegyelmet igényel. A tesztnek gyorsnak, megbízhatónak kell lennie, és csak arra kell összpontosítania, amit detektálni hivatott. Minden füstteszt ugyanazt az alapvető mintát követi: futtasd a pipeline szakaszt, ellenőrizd a kimenet létezését, ellenőrizd a minimális séma helyességét, jelentsd a sikeres/sikertelen eredményt strukturált JSON formátumban.
# smoke_crack.py — simplified pattern
import sys
import json
import time
from pathlib import Path
import pandas as pd
def test_smoke_crack(input_path: str, output_dir: str) -> dict:
result = {
"test_name": "smoke_crack",
"passed": False,
"duration_ms": 0,
"output_files": [],
"failure_reason": None,
"input_path": input_path,
"pipeline_version": "unknown"
}
start = time.time()
try:
# Step 1: Get pipeline version
from tarmacview import __version__
result["pipeline_version"] = __version__
# Step 2: Run the pipeline stage with real imports
from tarmacview.pipeline.crack import detect_cracks
output = detect_cracks(input_path, output_dir)
# Step 3: Verify output file exists and is non-empty
output_path = Path(output["crack_mask_path"])
assert output_path.exists(), f"Output file not found: {output_path}"
assert output_path.stat().st_size > 0, f"Output file is empty: {output_path}"
result["output_files"].append(str(output_path))
# Step 4: Verify key columns in tabular output
if output.get("crack_inventory_path"):
inv_path = Path(output["crack_inventory_path"])
assert inv_path.exists(), f"Inventory file not found: {inv_path}"
df = pd.read_parquet(inv_path)
required_columns = [
"crack_id", "length_px", "width_px",
"orientation", "confidence", "classification"
]
for col in required_columns:
assert col in df.columns, f"Missing required column: {col}"
result["output_files"].append(str(inv_path))
# Step 5: Verify output mask dimensions match input
from PIL import Image
input_img = Image.open(input_path)
mask_img = Image.open(output_path)
assert input_img.size == mask_img.size, \
f"Mask dimensions {mask_img.size} do not match input {input_img.size}"
result["passed"] = True
except Exception as e:
result["failure_reason"] = f"{type(e).__name__}: {str(e)}"
result["passed"] = False
result["duration_ms"] = int((time.time() - start) * 1000)
return result
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--input", required=True)
parser.add_argument("--output-dir", default="/tmp/smoke-output")
args = parser.parse_args()
result = test_smoke_crack(args.input, args.output_dir)
print(json.dumps(result, indent=2))
sys.exit(0 if result["passed"] else 1)
Kategóriánként egy állítás. Állítsd, hogy a végrehajtás befejeződött. Állítsd, hogy a kimenet létezik. Állítsd, hogy az oszlopok léteznek. Ne állíts numerikus tartományokat, pontos fájlméreteket vagy adatminőségi mutatókat. Minden további állítás növeli a teszt karbantartási költségét és csökkenti a teszt megbízhatóságát.
Használj valós importokat. Ne mock-old a pipeline moduljait. A füsttesztnek a tényleges importláncot kell gyakoroltatnia, hogy elkapja az importálási hibákat és a hiányzó függőségeket. Az a füstteszt, amely a unittest.mock segítségével elnyomja az importálási hibákat, meghiúsítja saját célját.
Minimális beállítás és takarítás. A teszt nem igényelhet adatbázis-beállítást, szolgáltatásindítást vagy a teszt bemeneti fájlon kívüli külső konfigurációt. Ha beállítás szükséges, annak a CI feladatdefiníció részét kell képeznie, nem a teszt szkriptének. Minden füsttesztnek futtathatónak kell lennie egy fejlesztő laptopján egyetlen paranccsal.
Determinisztikus. Ugyanaz a bemenet mindig ugyanazt a sikeres/sikertelen eredményt kell produkálja. A véletlenszerű magokat rögzíteni kell a pipeline konfigurációjában. A teszt bemeneti fájloknak verziókezelteknek kell lenniük. A nem determinisztikus füsttesztek rosszabbak, mint a haszontalanok – aláássák a teljes tesztinfrastruktúrába vetett bizalmat.
Önálló strukturált kimenet. A tesztnek strukturált JSON kimenetet kell kiírnia a befejezéskor, megkönnyítve a CI rendszerek számára az eredmények elemzését egyedi naplóelemzés nélkül. A JSON sémának konzisztensnek kell lennie a szert összes füsttesztje között.
Gyors. Minden tesztnek 60 másodpercen belül be kell fejeződnie CI-hardveren. Ha egy teszt következetesen túllépi ezt a határt, optimalizálni kell a tesztet, mielőtt hozzáadnánk a szerthez. Egy 5 percig tartó füsttesztet a fejlesztők kihagynak, amikor helyben futtatják a teszteket.
except Exception segítségével, elmulaszthatja az importálási hibákat. Hagyj néhány kivételt továbbterjedni, vagy legalább naplózd az importálási hibákat külön.--output-dir argumentumot a rugalmas végrehajtási környezetek biztosításához.Amikor egy füstteszt megbukik, a fejlesztési munkafolyamatnak “fejlesztésről” “diagnosztizálásra és javításra” kell váltania. A hatékony hibaértelmezés strukturált megközelítést követ, amely a hibák tüneteit a valószínű kiváltó okokhoz rendeli.
| Hiba Tünet | Valószínű Kiváltó Ok | Azonnali Intézkedés |
|---|---|---|
| ImportError | Hiányzó függőség, átnevezett modul, eltávolított modul, verzióütközés | Ellenőrizd a requirements.txt fájlt és a közelmúltbeli importálási változtatásokat a kommit diff-ben |
| ModuleNotFoundError | Csomag nincs telepítve vagy nincs a Python útvonalon | Ellenőrizd, hogy a környezet megfelel-e a lock fájlnak, nézd meg a feltételes importokat |
| FileNotFoundError | Kimeneti útvonal megváltozott, írási jogosultsági hiba, hiányzó könyvtár | Ellenőrizd a kimeneti útvonal konfigurációját a közelmúltbeli kommitokban, nézd meg a könyvtárlétrehozási logikát |
| PermissionError | Elégtelen fájlrendszer-jogosultságok a CI konténerben | Ellenőrizd a Dockerfile jogosultságokat és a CI futató felhasználót |
| Üres kimeneti fájl | A szakasz befejeződött, de kihagyta a feldolgozási logikát egy váratlanul kiértékelt feltételes utasítás miatt | Adj hozzá hibakeresési naplózást a végrehajtási útvonal nyomon követéséhez, ellenőrizd a korai visszatéréseket |
| Hiányzó oszlop | Séma változás a felsőbb szakaszban, átnevezett oszlop, eltávolított oszlop, típuseltérés | Hasonlítsd össze az oszlopsémákat a pipeline szakaszai között, ellenőrizd a séma-definíciókat érintő legutóbbi PR-eket |
| Segfault vagy OOM | Memóriaszivárgás, korlátlan memóriafoglalás, natív kiterjesztés összeomlás | Profilozás csökkentett bemenettel, ellenőrizd a végtelen ciklusokat, vizsgáld meg a CUDA memóriakezelést |
| Timeout | Végtelen ciklus, blokkoló I/O, holtpont, lassú külső API | Adj hozzá timeout burkolót, ellenőrizd a szálbiztonsági problémákat, vizsgáld meg a hálózati kapcsolatot |
| AssertionError a méreteken | Átméretezési művelet eltávolítva, modellbemenet mérete megváltozott, adattípus-konverzió alakított át | Ellenőrizd a képfeldolgozási paramétereket, vizsgáld meg a modellbemeneti specifikációkat |
| CUDA hiba | GPU illesztőprogram-eltérés, CUDA verzióütközés, elégtelen GPU memória | Ellenőrizd a CUDA toolkit verzióját, vizsgáld meg a Docker kép GPU illesztőprogramjait |
Amikor egy füstteszt megbukik a CI-ben, az ajánlott válaszadási munkafolyamat a következő:
Ellenőrizd a hibajelentést. A füstteszt strukturált JSON kimenete tartalmazza a failure_reason mezőt, amely a kivétel típusát és üzenetét tartalmazza. Ez a leggyorsabb út annak megértéséhez, hogy mi tört el.
Határozd meg, hogy a hiba kódregresszió vagy infrastruktúra-probléma. Egy ModuleNotFoundError egy tegnap telepített csomag esetében regresszióra utal. Egy Timeout, amely egyszerre minden build-en megjelenik, infrastruktúra-problémára utal (hálózati kimaradás, CI futató degradáció).
Vond vissza, ha a kiváltó ok nem nyilvánvaló 15 percen belül. A füstteszt-szert kifejezetten azért gyors, hogy lehetővé tegye a gyors visszavonást. Egy build-et, amely megbukik a füstteszteken, azonnal vissza kell vonni a CI pipeline más fejlesztők számára való felszabadításához.
Vizsgáld meg a tesztbemenettel. Futtasd le a hibás füsttesztet helyben ugyanazzal a verziókezelt tesztbemenettel. A hiba helyi reprodukálása kiküszöböli a CI-specifikus változókat (konténerkülönbségek, erőforráskorlátok, párhuzamossági problémák).
Javítsd ki, és adj hozzá egy egységtesztet. Miután a kiváltó okot azonosítottad, javítsd a kódot, és adj hozzá egy egységtesztet a megfelelő szinten, amely elkapta volna a hibát. Ez megakadályozza az azonos osztályú regresszió megismétlődését.
Ellenőrizd, hogy a javítás átmegy a füstteszteken. Futtasd le a teljes füstteszt-szertet helyben, mielőtt push-olod a javítást. Ez biztosítja, hogy a javítás ne vezessen be új hibákat más pipeline-szakaszokban.
A füsttesztek téves pozitív eredményeket produkálhatnak – a teszt megbukik, de a pipeline valójában működőképes. Gyakori okok:
A pöttyös füsttesztek aláássák a tesztinfrastruktúrába vetett bizalmat. Azok a fejlesztők, akik véletlenszerűen bukó füstteszteket látnak, elkezdik figyelmen kívül hagyni a hibákat. A megoldás az agresszív stabilizálás: a pöttyösség kiváltó okának azonosítása és a teszt megerősítése. Ha egy teszt ésszerű erőfeszítéssel nem tehető megbízhatóvá, akkor alacsonyabb prioritású tesztelési szettbe kell helyezni, vagy robusztusabb tervre kell cserélni.
Repülési szoftverek – beleértve a repülőtéri felügyeleti pipeline-okat – esetében a füsttesztek további jelentőséggel bírnak a terület biztonságkritikus jellege miatt. A DO-178C (Szoftver szempontok a légi fedélzeti rendszerekben és berendezések tanúsításában) keretében a szoftververifikáció szigorú követelmény-alapú folyamatot követ. Bár a DO-178C nem nevezi kifejezetten “füsttesztelésnek” a fogalmat, a 6.4.3 szakaszban meghatározott Hardver/Szoftver Integrációs Tesztelés koncepciója megköveteli, hogy az integrált rendszer “boot-oljon és az alapvető funkciók működjenek” – ami funkcionálisan a füstteszt megfelelője.
Az ICAO Annex 14 I. kötete – Repülőterek tervezése és üzemeltetése – alapján a repülőtéri burkolatok állapota közvetlenül befolyásolja a repülőgép-biztonságot. A burkolat meghibásodása egy kifutópályán repülőgép-károsodást vagy irányításvesztést okozhat felszállás és leszállás során. A repülőtéri burkolatok automatizált felügyeletére használt szoftvereknek ezért a kimenetük biztonsági vonatkozásaival arányos megbízhatósági szabványoknak kell megfelelniük. A füsttesztek biztosítják az első védelmi vonalat a szoftverhibákkal szemben, amelyek veszélyeztethetik a burkolat állapotfelméréseit.
A TarmacView esetében a füsttesztek egy tágabb szoftverminőség-biztosítási keretrendszer részét képezik, amely a következőket foglalja magában:
Ez a többrétegű megközelítés biztosítja, hogy a füsttesztek az első kapuként szolgáljanak anélkül, hogy az egyetlen kapu lennének. A sikeres füstteszt azt jelenti, hogy a pipeline szerkezetileg rendben van. De az integrációs tesztek, validációs tesztek és teljesítmény-benchmarkok azok, amelyek megadják a szükséges bizalmat ahhoz, hogy a TarmacView kimenetét valós repülőtéri karbantartási döntésekhez használják.
A füsttesztelés egy alapvető szoftverminőségi gyakorlat, amely a megvalósítási költségéhez képest kiemelkedő értéket nyújt. A TarmacView-hoz hasonló felügyeleti szoftver-pipeline-ok esetében a füsttesztek másodpercek alatt – nem órák alatt – kapják el az integrációs hibákat (törött importok, hiányzó fájlok, sémaeltérések). Első kapuként szolgálnak a CI/CD-ben, elutasítva az instabil build-eket, mielőtt azok felemésztenék a tesztinfrastruktúrát. A TarmacView füstteszt-szertje a pipeline minden fázisát lefedi a képbeolvasástól a repedésdetektáláson, hibabesoroláson, felületfelmérésen, térképezésen és vizualizáción át, ahol minden teszt ellenőrzi, hogy a szakasz lefut, kimenetet produkál, és fenntartja a várt oszlopsémákat.
A hatékony füsttesztelés kulcsa a szűk hatókör megértése. A füsttesztek ellenőrzik, hogy a pipeline fut és kimenetet produkál. Nem ellenőrzik a pontosságot, teljesítményt, szélsőséges esetek kezelését vagy adatminőséget. Ezeket más tesztelési típusok validálják a tágabb minőségbiztosítási keretrendszerben. Amikor a füsttesztek ezzel a fegyelemmel készülnek – reprezentatív minimális bemenetek, gyors végrehajtási idő, széles de sekély lefedettség –, gyors és megbízható hibafelismerést biztosítanak, ami hatékonnyá teszi a CI/CD pipeline-okat a biztonságkritikus repülési szoftverek számára.
A TarmacView automatizált füstteszteket használ felügyeleti pipeline-ja minden szakaszának validálására. Vegye fel velünk a kapcsolatot, és tudja meg, hogyan biztosítunk szoftverminőséget a kritikus fontosságú repülőtéri infrastruktúra-elemzéshez.
Ismerje meg a szoftveres teljesítménytesztelés és minőségbiztosítás (QA) fejlett fogalmait, beleértve a folyamatokat, módszertanokat, eszközöket, mérőszámokat é...
A teszteljárás egy lépésről lépésre dokumentált módszer, amely rendszerezett módon ellenőrzi a rendszerek megfelelőségét, helyességét és teljesítményét a minősé...
A hibaszűrés egy olyan kiértékelési stratégia, amely a prediktált hibacímkéket felülettípus és szerkezeti tartomány alapján szűri a hamis pozitívok visszaszorít...