Regresní testování (anglicky regression testing ale i non-regression testing)[1] je provedení funkčních a nefunkčních testů pro zjištění, zda dříve vyvinutý a otestovaný software po změně stále funguje.[2] Pokud se chyby objeví, říkáme, že došlo k regresi. Náprava chyb nalezených při regresním testování může zahrnovat opravy softwarových chyb, vylepšování softwaru, změny konfigurace, a dokonce i náhradu elektronických součástek.[3] Sady regresních testů se obvykle zvětšují s každou nalezenou závadou, takže bývají velmi rozsáhlé, a proto se pro ně často využívá automatizace testů. Někdy se provádí analýza vlivu změn pro určení vhodné podmnožiny testů (anglicky non-regression analysis).[4]
Při aktualizaci, změnách nebo znovupoužití softwaru pro jiný účel je běžné, že se objevují chyby; ne vždy jsou to chyby nové, často se jedná i o chyby v minulosti již opravované. K opětovnému objevování starých chyb může dojít kvůli ztrátě opravy v důsledku špatných postupů (nebo jednoduše lidské chyby) při verzování. Další příčinou může být fakt, že oprava obecnější chyby byla provedena pouze pro určitý speciální případ, ve kterém byla chyba původně pozorována. Tomuto jevu se někdy říká „softwarová křehkost“. Často oprava problému v jedné oblasti neúmyslně způsobí softwarovou chybu v jiné oblasti. Může se také stát, že při přepracování určité vlastnosti se část chyb, které se objevily v původní implementaci, objeví i v přepracované verzi.
Při procesu lokalizace a opravy chyby se považuje za dobrý kódovací postup vytvoření testu, který je schopen příslušnou chybu odhalit, a ověření, že se chyba znovu neobjevila jeho provedením po dalších úpravách programu.[5] I když toho může být dosaženo pomocí postupů manuálního testování, vhodnější je používání automatizovaných testovacích nástrojů.[6] Taková sada testů obsahuje softwarové nástroje, které umožňují testovacímu prostředí automaticky provádět všechny regresní testovací případy automaticky; součástí některých projektů jsou automatizované systémy, které zajišťují, aby se všechny regresní testy znovu spouštěly v zadaných intervalech a oznamovaly všechna selhání (která mohou znamenat regres nebo chybný či zastaralý test).[7] Obvyklou strategií je spustit takovou sadu po každém úspěšném překladu (u malých projektů), každou noc nebo jednou týdně. Tyto strategie lze automatizovat externími nástroji.
Regresní testování[8] je nedílnou součástí metodiky extrémní programování. U této metody je vývojová dokumentace nahrazena širokým, opakovatelným a automatizovaným testováním celého softwarového balíčku v každé fázi procesu vývoje softwaru. Regresní testování se provádí po dokončení funkčního testování pro ověření, že ostatní funkcionality jsou stále funkční.
Ve firemním světě je regresní testování tradičně prováděno týmem zajištění kvality softwaru na závěr práce vývojového týmu. Závady odhalené v této fázi bývá drahé opravit, proto se přistupuje k rozšiřování unit testingu. Vývojáři často vytvářeli testovací případy jako část vývojového cyklu, ale většinou se jednalo o funkční testy nebo unit testy, které verifikují pouze určené výsledky. Testování nutí vývojáře, aby se zaměřili na unit testy a aby zahrnuli kladné i záporné testovací případy.[9]
K technikám regresního testování patří:
Při této technice se provádějí všechny testovací případy na aktuálním programu, aby se zkontrolovala jeho integrita. Přestože je nákladné, protože je nutné znovu spustit všechny testovací případy, zaručuje, že změny v kódu nezanesly žádné chyby.[10]
Na rozdíl testování všeho se při této technice spouští pouze část sady testů (kvůli ceně opakovaného testování všeho), jestliže cena výběru části testů ze sady je menší než kompletní provedení všech testů.[10]
Prioritizuje testovací případy, aby se zvýšila rychlost s jakou sada testů detekuje chyby. Techniky prioritizace testovacích případů plánuje pořadí provádění testovacích případů tak, že testovací případy, které mají vyšší prioritu, se provádějí před testovacími případy, které mají nižší prioritu.[10]
Kombinuje výběr a prioritizaci regresních testů.[10]
Regresní testování se provádí při provádění změn v existující funkčnosti softwaru nebo po opravě chyb v softwaru. Pro regresní testování se používají různé přístupy. Při opakovaném testování všeho je jistota, že změny provedené v softwaru neovlivní existující funkcionality, které nebyly měněny.[11]
Při agilním vývoji softwaru, kdy životní cykly vývoje softwaru jsou velmi krátké, prostředky jsou omezené a změny softwaru jsou velmi časté, může regresní testování vnášet do vývojového procesu příliš velkou režii.[11]
V prostředí vývoje softwaru, kde se často používají komponenty třetích stran, které fungují jako černá skříňka, může být provádění regresních testů obtížné, protože jakákoli změna v komponentech třetích stran může narušovat zbytek systému (a regresní testování komponentů třetích stran je obtížné, protože se jedná o neznámé entity).[11]
Regresní testování lze používat nejen pro testování korektnosti programu, ale často také pro sledování kvality jeho výstupů.[12] Například při návrhu překladače může regresní testování sledovat velikost kódu a dobu, kterou překlad trvá, a provádět sadu testovacích případů.
„ | V důsledku zavádění nových chyb vyžaduje údržba programu mnohem více testování systému na každý napsaný příkaz než při jakémkoli jiném programování. Teoreticky je nutné po každé opravě spustit celou dávku testovacích případů, aby se zajistilo, že systém nebyl nějakým obskurním způsobem poškozen. V praxi musí takové regresní testování skutečně aproximovat tuto teoretickou myšlenku, což způsobuje, že je velmi drahé. | “ |
Regresní testy lze zhruba rozdělit na funkční testy a unit testy. Zatímco funkční testy aplikují různé vstupy na kompletní program, unit testy zkoušejí jednotlivé funkce, podprogramy a metody objektů. Nástroje pro funkční testování a pro unit testing jsou obvykle automatizovány a často se jedná o výrobky třetích stran, které nejsou součástí nástrojů dodávaných s překladačem. Funkční testy obvykle pomocí skriptů testují chování pro různé vstupy programu, mohou dokonce obsahovat automatizovaný mechanismus pro řízení pohybu myši a klikání. Unit testy bývají realizovány jako sada zvláštních funkcí v samotném kódu nebo ve vrstvě ovladačů, které se připojují k testovanému kódu bez jeho modifikací.
V tomto článku byl použit překlad textu z článku Regression testing na anglické Wikipedii.