Sobes.tech
Middle

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:

  1. Nepredvídateľný kontext: Hodnota this je 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ť hodnota this iná, než očakávate. To spôsobuje ťažkosti pri ladení a údržbe kódu.

  2. 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ť kontext this odlišne. To sťažuje prenosnosť kódu.

  3. 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ť this prepí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);
  });
});