Prečo by sa kľúčové slovo 'this' nemalo používať v kontexte automatizácie testovania?
sobes.tech AI
Odpoveď od AI
V kontexte automatizácie testovania v JavaScript-e sa kľúčové slovo this neodporúča používať na uloženie alebo odovzdanie údajov o stave testu (napríklad aktuálny používateľ, stav autorizácie, informácie o stránke), pretože:
-
Nepredvídateľný kontext: Hodnota
thisje určená spôsobom, akým je funkcia volaná, nie miestom, kde je deklarovaná. V asynchrónnom kóde (Promis'och,async/await, callbackoch) alebo pri použití šípových funkcií môže byť hodnotathisiná, než očakávate. To spôsobuje ťažkosti pri ladení a údržbe kódu. -
Závislosť od prostredia: V rôznych testovacích rámcoch (
Mocha,Jest,Cypress) a v závislosti od nastavení (strict mode) sa môže správať kontextthisodlišne. To sťažuje prenosnosť kódu. -
Zložitosť paralelného vykonávania: Pri paralelnom spúšťaní testov s použitím rovnakého inštancie testovacieho triedy alebo objektu môže byť
thisprepísaný iným vláknom vykonávania, čo vedie k race conditions a nesprávnym výsledkom.
Namiesto použitia this je vhodnejšie:
- Lokálne premenné v rámci testovacích prípadov.
- Premenné odovzdávané ako argumenty pomocným funkciám.
- Špecializované objekty alebo triedy na uchovávanie stavu (napríklad Page Objects).
- Globálne premenné alebo singletony (s opatrnosťou, iba ak je to nevyhnutné).
Príklad problému s this v asynchrónnom kóde:
// Príklad s Mocha
describe('Test autorizácie', function() {
this.currentUser = null; // Stav sa uchováva v 'this'
it('by mal byť autorizovaný', async function() {
await login('testUser', 'password');
this.currentUser = 'testUser'; // 'this' odkazuje na kontext testu
});
it('by mal skontrolovať profil', async function() {
// Tu 'this' NE BUDE obsahovať currentUser,
// ak test 'by mal byť autorizovaný' bol vykonaný asynchrónne
// alebo ak sa kontext funkcie zmenil
console.log(this.currentUser); // Môže byť null alebo undefined
});
});
Príklad lepšieho prístupu: odovzdanie dát ako argumentov alebo použitie Page Objects:
// Pomocná funkcia
async function checkUserProfile(userName) {
// Logika kontroly profilu pre konkrétneho používateľa
}
describe('Test autorizácie', function() {
it('by mal byť autorizovaný a skontrolovať profil', async function() {
const user = 'testUser';
await login(user, 'password');
// Odovzdanie používateľa ako argument
await checkUserProfile(user);
});
});