Proč nelze v kontextu automatizace testů používat klíčové slovo 'this'?
sobes.tech AI
Odpověď od AI
V kontextu automatizace testů v JavaScriptu se nedoporučuje používat klíčové slovo this pro ukládání nebo přenos dat o stavu testu (například aktuální uživatel, stav autorizace, informace o stránce), protože:
-
Nepředvídatelný kontext: Hodnota
thisje určena tím, jak je funkce volána, nikoli tím, kde je deklarována. V asynchronním kódu (Promises,async/await, callbacky) nebo při použití šipkových funkcí může být hodnotathisjiná, než očekáváte. To ztěžuje ladění a údržbu kódu. -
Závislost na prostředí: V různých testovacích rámcích (
Mocha,Jest,Cypress) a podle nastavení (strict mode) se může chováníthislišit. To komplikuje přenositelnost kódu. -
Složitost paralelního provádění: Při paralelním běhu testů se stejným instancím třídy nebo objektu může být
thispřepsáno jiným vláknem, což vede ke stavu závodu a nesprávným výsledkům.
Namísto používání this je vhodnější:
- Lokální proměnné uvnitř testovacích případů.
- Proměnné předávané jako argumenty helper funkcím.
- Specializované objekty nebo třídy pro uchovávání stavu (například Page Objects).
- Globální proměnné nebo singletony (s opatrností, pouze pokud je to nutné).
Příklad problému s this v asynchronním kódu:
// Příklad s Mocha
describe('Test autorizace', function() {
this.currentUser = null; // Stav je uložen v `this`
it('má se autorizovat', async function() {
await login('testUser', 'password');
this.currentUser = 'testUser'; // `this` odkazuje na kontext testu
});
it('má zkontrolovat profil', async function() {
// Zde `this` NEBUDE obsahovat currentUser,
// pokud test 'má se autorizovat' proběhl asynchronně
// nebo pokud se změnil kontext funkce
console.log(this.currentUser); // Může být null nebo undefined
});
});
Lepší přístup: předávat data jako argumenty nebo používat Page Objects:
// Helper funkce
async function checkUserProfile(userName) {
// Logika kontroly profilu pro konkrétního uživatele
}
describe('Test autorizace', function() {
it('má se autorizovat a zkontrolovat profil', async function() {
const user = 'testUser';
await login(user, 'password');
// Předání uživatele jako argumentu
await checkUserProfile(user);
});
});