Sobes.tech
Middle

Ինչու չի կարելի օգտագործել 'this' բանալի բառը թեստավորման ավտոմատացման կոնտեքստում?

sobes.tech AI

Պատասխան AI-ից

Կոնտեքստում ավտոմատացման փորձարկումների JavaScript-ով, հիմնական բառը this չի խորհուրդվում օգտագործել փորձարկման վիճակի տվյալներ պահելու կամ փոխանցելու համար (օրինակ, ընթացիկ օգտվող, մուտքի կարգավիճակ, էջի տեղեկատվություն), քանի որ՝

  1. Անհայտ կոնտեքստ: this արժեքը որոշվում է այն կերպով, ինչպես է կանչվում ֆունկցիան, ոչ թե այն վայրով, որտեղ այն հայտարարված է: Ասինխրոնային կոդում (Promis'ներ, async/await, callback-ներ) կամ սլաքային ֆունկցիաների դեպքում, this արժեքը կարող է լինել այն, ինչ դուք սպասում եք: Սա բարդություններ է առաջացնում սխալների հայտնաբերման և կոդի պահպանման ժամանակ:

  2. Աշխատավայրի կախվածություն: Տարբեր թեստային ֆրեյմվորկներում (Mocha, Jest, Cypress) և կարգավորումների (strict mode) դեպքում, this կոնտեքստը կարող է տարբեր կերպ գործել: Սա բարդացնում է կոդի փոխանցելիությունը:

  3. Համաժամկետ կատարման բարդություն: Երբ միաժամանակյա փորձարկումներ են կատարվում նույն տիպի կամ օբյեկտի օրինակով, this կարող է վերագրանցվել այլ թոքերի կողմից, ինչը հանգեցնում է race conditions-ի և սխալ արդյունքների:

Փոխարեն this օգտագործելու, ավելի լավ է օգտագործել՝

  • Տեղական փոփոխականներ փորձարկման դեպքերում:
  • Փոփոխականներ, որոնք փոխանցվում են որպես արգումենտներ օգնական ֆունկցիաներին:
  • Մասնագիտացված օբյեկտներ կամ դասեր վիճակի պահպանում համար (օրինակ, Page Objects):
  • Գլոբալ փոփոխականներ կամ singleton-ներ (ուշադրություն դարձրեք, միայն անհրաժեշտության դեպքում):

Օրինակ this-ի հետ կապված խնդիրների մասին ասինխրոնային կոդում:

// Օրինակ Mocha-ի հետ
describe('Մուտքի փորձարկում', function() {
  this.currentUser = null; // Վիճակը պահվում է `this`-ում

  it('պետք է մուտք գործի', async function() {
    await login('testUser', 'password');
    this.currentUser = 'testUser'; // `this`-ը վերաբերում է փորձարկման կոնտեքստին
  });

  it('պետք է ստուգի պրոֆիլը', async function() {
    // Այստեղ `this` չի պարունակելու currentUser,
    // եթե փորձարկումը `պետք է մուտք գործի` կատարվի ասինխրոն
    // կամ ֆունկցիայի կոնտեքստը փոխվի
    console.log(this.currentUser); // Միգուցե null կամ undefined
  });
});

Լավագույն մոտեցում՝ տվյալների փոխանցում որպես արգումենտներ կամ Page Objects օգտագործելն է:

// Օգնակա ֆունկցիա
async function checkUserProfile(userName) {
  // Լոգիկա կոնկրետ օգտվողի պրոֆիլը ստուգելու համար
}

describe('Մուտքի փորձարկում', function() {
  it('պետք է մուտք գործի և ստուգի պրոֆիլը', async function() {
    const user = 'testUser';
    await login(user, 'password');
    // Օգտագործողի փոխանցում որպես արգումենտ
    await checkUserProfile(user);
  });
});