Sobes.tech
Middle

Test avtomatlaşdırması kontekstində niyə 'this' açar sözündən istifadə etmək olmaz?

sobes.tech Süni İntellekt

AI-dan cavab

JavaScript-də test avtomatlaşdırması kontekstində, this açar sözü testin vəziyyəti haqqında məlumat saxlamaq və ya ötürmək üçün tövsiyə edilmir (məsələn, cari istifadəçi, autentifikasiya statusu, səhifə haqqında məlumat), çünki:

  1. Qeyri-müəyyən kontekst: this dəyəri, funksiyanın necə çağırıldığına görə müəyyən edilir, onun elan olunduğu yerə deyil. Asinxron kodda (Promises, async/await, callbacklər) və ya ox funksiyalarından istifadə edildikdə, this dəyəri gözlədiyiniz kimi olmaya bilər. Bu, debug və kodun saxlanmasını çətinləşdirir.

  2. Ətraf mühitə bağlılıq: Müxtəlif test çərçivələrində (Mocha, Jest, Cypress) və tənzimləmələrdə (strict mode) this konteksti fərqli davranış göstərə bilər. Bu, kodun köçürülməsini çətinləşdirir.

  3. Paralel icranın mürəkkəbliyi: Eyni test sinfi və ya obyekt nümunəsindən istifadə edərək paralel testlərin icrası zamanı, this başqa bir icra axışı tərəfindən yenidən yazıla bilər, bu da yarış vəziyyətlərinə və düzgün olmayan nəticələrə səbəb olur.

this yerinə, aşağıdakı yanaşmalar üstün tutulmalıdır:

  • Test hallarında yerli dəyişənlər.
  • Köməkçi funksiyalara arqument kimi ötürülən dəyişənlər.
  • Vəziyyəti saxlamaq üçün xüsusi obyektlər və ya siniflər (məsələn, Page Objects).
  • Qlobal dəyişənlər və ya singletonlar (diqqətli olun, yalnız lazım olduqda).

Asinxron kodda this ilə bağlı problem nümunəsi:

// Mocha ilə nümunə
describe('Autentifikasiya testi', function() {
  this.currentUser = null; // Vəziyyət `this` daxilində saxlanılır

  it('giriş etməlidir', async function() {
    await login('testUser', 'password');
    this.currentUser = 'testUser'; // `this`, test kontekstinə istinad edir
  });

  it('profil yoxlamalıdır', async function() {
    // Burada, `this` `currentUser`-i içerməyəcək,
    // əgər 'giriş etməlidir' testi asinxron olaraq icra olunubsa
    // və ya funksiyanın konteksti dəyişibsə
    console.log(this.currentUser); // null və ya undefined ola bilər
  });
});

Daha yaxşı yanaşma: məlumatları arqument kimi ötürmək və ya Page Objects istifadə etmək:

// Köməkçi funksiya
async function checkUserProfile(userName) {
  // Müəyyən istifadəçi üçün profil yoxlama loqikası
}

describe('Autentifikasiya testi', function() {
  it('giriş etməli və profil yoxlamalıdır', async function() {
    const user = 'testUser';
    await login(user, 'password');
    // İstifadəçini arqument kimi ötürmək
    await checkUserProfile(user);
  });
});