Kāpēc testu automatizācijas kontekstā nevar izmantot atslēgvārdu 'this'?
sobes.tech AI
Atbilde no AI
Testu automatizācijas kontekstā ar JavaScript, vārds this nav ieteicams lietot, lai glabātu vai nodotu testa stāvokļa datus (piemēram, pašreizējo lietotāju, autorizācijas statusu, lapas informāciju), jo:
-
Neprognozējams konteksts:
thisvērtība tiek noteikta atbilstoši tam, kā tiek izsaukta funkcija, nevis vietai, kur tā ir deklarēta. Asinhronā kodā (Promis'os,async/await, atpakaļzvaniem) vai izmantojot bultfunkcijas,thisvērtība var būt cita, nekā gaidīts. Tas rada grūtības kļūdu labošana un koda uzturēšanā. -
Vides atkarība: Dažādos testēšanas ietvaros (
Mocha,Jest,Cypress) un atkarībā no iestatījumiem (strict mode)thiskonteksts var uzvesties dažādi. Tas apgrūtina koda pārvietojamību. -
Paralēla izpildes sarežģītība: Izpildot testus paralēli ar vienu un to pašu testu klases vai objekta instanci,
thisvar tikt pārrakstīts ar cita izpildes pavediena palīdzību, kas noved pie sacensības apstākļiem un nepareiziem rezultātiem.
Tā vietā, lai izmantotu this, ieteicams:
- Vietējos mainīgos testu gadījumos.
- Mainīgos, kas nodoti kā argumenti palīgfunkcijām.
- Specializētus objektus vai klases stāvokļa glabāšanai (piemēram, Page Objects).
- Globālos mainīgos vai singletonus (ar piesardzību, tikai nepieciešamības gadījumā).
Asinhronā koda piemērs ar this:
// Ar Mocha piemēru
describe('Autorizācijas tests', function() {
this.currentUser = null; // Stāvoklis tiek glabāts `this`
it('jāautorizējas', async function() {
await login('testUser', 'password');
this.currentUser = 'testUser'; // `this` attiecas uz testa kontekstu
});
it('jāparbauda profils', async function() {
// Šeit `this` NEBŪS saturējis currentUser,
// ja tests 'jāautorizējas' ir izpildīts asinhroni
// vai ja funkcijas konteksts ir mainījies
console.log(this.currentUser); // Var būt null vai undefined
});
});
Labāka pieeja — datu nodošana kā argumenti vai Page Objects izmantošana:
// Palīdzības funkcija
async function checkUserProfile(userName) {
// konkrēta lietotāja profila pārbaudes loģika
}
describe('Autorizācijas tests', function() {
it('jāautorizējas un jāparbauda profils', async function() {
const user = 'testUser';
await login(user, 'password');
// Lietotāja nodošana kā arguments
await checkUserProfile(user);
});
});