Sobes.tech
Middle

Proč nelze v kontextu automatizace testů používat klíčové slovo 'this'?

sobes.tech AI

Odpověď od AI

V kontextu automatizace testů v JavaScriptu se nedoporučuje používat klíčové slovo this pro ukládání nebo přenos dat o stavu testu (například aktuální uživatel, stav autorizace, informace o stránce), protože:

  1. Nepředvídatelný kontext: Hodnota this je určena tím, jak je funkce volána, nikoli tím, kde je deklarována. V asynchronním kódu (Promises, async/await, callbacky) nebo při použití šipkových funkcí může být hodnota this jiná, než očekáváte. To ztěžuje ladění a údržbu kódu.

  2. Závislost na prostředí: V různých testovacích rámcích (Mocha, Jest, Cypress) a podle nastavení (strict mode) se může chování this lišit. To komplikuje přenositelnost kódu.

  3. Složitost paralelního provádění: Při paralelním běhu testů se stejným instancím třídy nebo objektu může být this přepsáno jiným vláknem, což vede ke stavu závodu a nesprávným výsledkům.

Namísto používání this je vhodnější:

  • Lokální proměnné uvnitř testovacích případů.
  • Proměnné předávané jako argumenty helper funkcím.
  • Specializované objekty nebo třídy pro uchovávání stavu (například Page Objects).
  • Globální proměnné nebo singletony (s opatrností, pouze pokud je to nutné).

Příklad problému s this v asynchronním kódu:

// Příklad s Mocha
describe('Test autorizace', function() {
  this.currentUser = null; // Stav je uložen v `this`

  it('má se autorizovat', async function() {
    await login('testUser', 'password');
    this.currentUser = 'testUser'; // `this` odkazuje na kontext testu
  });

  it('má zkontrolovat profil', async function() {
    // Zde `this` NEBUDE obsahovat currentUser,
    // pokud test 'má se autorizovat' proběhl asynchronně
    // nebo pokud se změnil kontext funkce
    console.log(this.currentUser); // Může být null nebo undefined
  });
});

Lepší přístup: předávat data jako argumenty nebo používat Page Objects:

// Helper funkce
async function checkUserProfile(userName) {
  // Logika kontroly profilu pro konkrétního uživatele
}

describe('Test autorizace', function() {
  it('má se autorizovat a zkontrolovat profil', async function() {
    const user = 'testUser';
    await login(user, 'password');
    // Předání uživatele jako argumentu
    await checkUserProfile(user);
  });
});