Takéregresní testy, regression testsPokročilý
Definice
Regresní testování je ověřování, že nová změna softwaru neporušila funkce, které už dříve fungovaly. Používá se po opravách chyb, refaktoringu, změnách závislostí i před vydáním verze a typicky kombinuje automatizované testy s cílenou ruční kontrolou rizikových scénářů. Smyslem je rychle odhalit návrat staré chyby nebo nečekaný vedlejší efekt.
Proč regresní testování chrání hotové chování
Regresní testování vychází z jednoduché zkušenosti: i malá úprava může změnit chování na místě, kterého se autor změny přímo nedotkl. Nová validace formuláře rozbije starý import, oprava zaokrouhlení změní fakturaci, aktualizace knihovny posune chování API. Regresní sada proto nezkoumá jen novou funkci, ale vrací se k důležitým scénářům, které musí zůstat stabilní.
Co patří do regresní sady
Regresní sada není kopie všech testů v projektu. Smysl má vybírat scénáře podle rizika: tok peněz, přihlášení, oprávnění, migrace dat, veřejné API, hlavní uživatelské cesty a chyby, které se už jednou objevily. Dobrým kandidátem je test, který by při selhání zabránil vydání. Slabým kandidátem je test detailu implementace, který často padá při bezpečné refaktorizaci.
Unit test může hlídat malou část logiky, integrační test ověří spolupráci komponent a end-to-end test projde systém podobně jako uživatel. Regresní testování je průřezový účel, nikoli jeden konkrétní druh testu. Stejný scénář může být regresní, pokud chrání dříve platné chování.
Regrese není totéž co retest opravy
Retest ověřuje, že konkrétní chyba byla opravena. Regresní testování ověřuje širší okolí změny a hledá vedlejší následky. Po opravě nefunkčního tlačítka Zaplatit může retest potvrdit, že tlačítko znovu odešle objednávku. Regresní kontrola navíc projde slevový kupón, změnu dopravy, potvrzovací e-mail a stav objednávky v administraci, protože právě tam může nová úprava narušit dříve funkční tok.
Kdy regresní testy spouštět
Regresní testy se spouštějí na různých úrovních. Rychlá část běží při každém commitu nebo pull requestu, protože má dát zpětnou vazbu během minut. Širší sada běží v CI/CD před releasem, po změně databázového schématu, po aktualizaci frameworku nebo při opravě kritické chyby. Některé týmy drží ještě noční běh, který zahrnuje pomalejší scénáře, prohlížeče, mobilní zařízení nebo testovací data podobná produkci.
Cena falešného klidu
Regresní testování nedává jistotu, že systém nemá žádnou chybu. Regresní sada pouze zvyšuje šanci, že se odhalí rozbití známého chování. Riziko vzniká, když testy kontrolují nepodstatné detaily, ignorují reálná data, náhodně padají nebo se dlouho nespouštějí. Taková sada budí důvěru, ale vývojáři ji přestanou respektovat.
Údržba regresních testů je součástí zdravého vývoje. Po změně požadavku se musí změnit i očekávání testu, po odstranění funkce se test smaže a po opakovaném výskytu chyby se přidá nový scénář. Zanedbaná sada se rychle mění v technický dluh: běhy trvají dlouho, výsledky jsou hlučné a tým začne chyby obcházet místo jejich opravování.
Příklady z praxe
Oprava výpočtu slevy v e-shopu
Vývojář opraví zaokrouhlování slev u košíku a tím se může nechtěně změnit výpočet pro běžné slevy. Regresní testy ověří, že nulová sleva nechá cenu beze změny a desetiprocentní sleva pořád vrací očekávaný výsledek. Pokud pozdější úprava logiky cenu rozbije, test selže ještě před nasazením.
def apply_discount(price, percent): return round(price * (1 - percent / 100), 2) def test_zero_discount_keeps_original_price(): assert apply_discount(1299, 0) == 1299 def test_ten_percent_discount_still_works(): assert apply_discount(1000, 10) == 900Přepracovaný přihlašovací formulář
Tým přepracuje vzhled přihlašovací stránky a přesune pole do nové komponenty. Regresní test projde scénář špatného hesla a ověří, že aplikace pořád zobrazí chybovou hlášku místo tichého selhání. Chyba v napojení formuláře se tak objeví v CI, ne až u uživatele.
import { test, expect } from '@playwright/test'; test('login keeps showing an error for a wrong password', async ({ page }) => { await page.goto('/login'); await page.getByLabel('E-mail').fill('user@example.com'); await page.getByLabel('Password').fill('bad-password'); await page.getByRole('button', { name: 'Sign in' }).click(); await expect(page.getByText('Invalid credentials')).toBeVisible(); });
Časté omyly
- MýtusKdyž máme unit testy, regresní testování už nepotřebujeme.
- Ve skutečnostiUnit testy mohou být součástí regresní sady, ale samy o sobě obvykle nepokrývají spolupráci komponent, databázi, UI ani hlavní uživatelské toky. Regresní testování je účel kontroly, ne jeden konkrétní typ testu.
- MýtusRegresní testování se dělá až těsně před releasem.
- Ve skutečnostiRegresní testování těsně před releasem zachytí část problémů, ale zpětná vazba přichází pozdě. Rychlé regresní kontroly dávají větší hodnotu už během vývoje, například v pull requestu nebo CI.
- MýtusKaždý nalezený bug musí hned dostat regresní test.
- Ve skutečnostiRegresní test má největší smysl u chyby, která se může vrátit a má reálný dopad. Jednorázová chyba v nepoužívané části systému může být levnější opravit bez rozšiřování trvalé testovací sady.
Časté dotazy
- Kolik regresních testů má projekt udržovat?
- Počet regresních testů má odpovídat riziku projektu, ne snaze o co nejvyšší číslo. Kritické finanční toky, autentizace, oprávnění, migrace dat a často měněné části aplikace si obvykle zaslouží silnější pokrytí. Méně důležité scénáře mohou stačit ve smoke testech nebo v ruční kontrole před vydáním. Praktickým pravidlem je přidat regresní test tam, kde by opakování chyby bylo drahé nebo viditelné pro uživatele.
- Patří regresní testování do každého pull requestu?
- Regresní testování v pull requestu má být dost rychlé na to, aby vývojář dostal výsledek v rozumném čase. Typicky se spouští unit testy, vybrané integrační testy a malá sada nejdůležitějších end-to-end scénářů. Úplná regresní sada může běžet později, například před releasem nebo v nočním běhu. Příliš pomalá kontrola v pull requestu vede k obcházení pravidel a ztrácí hodnotu.
- Kdy má být regresní test ruční místo automatický?
- Ruční regresní test má smysl u scénářů, které se automatizují obtížně, mění se málo často nebo vyžadují lidské posouzení vzhledu, srozumitelnosti a pocitu z ovládání. Automatizace je vhodnější pro opakovatelné kontroly s jasným očekávaným výsledkem. Dobrý proces často kombinuje obě možnosti: stroje hlídají stabilní pravidla a tester se soustředí na oblasti, kde může najít nečekané souvislosti.
- Proč regresní testy někdy zpomalují vývoj?
- Regresní testy zpomalují vývoj hlavně tehdy, když jsou nespolehlivé, příliš závislé na detailech implementace nebo běží všechny při každé malé změně. Užitečná regresní sada bývá vrstvená: rychlá část běží často, pomalá část jen v důležitých bodech procesu. Zrychlení obvykle znamená odstranit flaky testy, paralelizovat běh, lépe připravit testovací data a pravidelně mazat testy, které už nechrání skutečné riziko.
Zdroje
- Regression testing(otevře se v novém okně)
- unittest(otevře se v novém okně)
- Unit testing in .NET(otevře se v novém okně)
- Web Security Testing Guide(otevře se v novém okně)