Sobes.tech
Middle

Зашто се у контексту аутоматизације тестирања не може користити кључна реч 'this'?

sobes.tech АИ

Одговор од АИ

У контексту аутоматизације тестова у JavaScript-у, кључна реч this се не препоручује за чување или пренос података о стању теста (на пример, тренутни корисник, статус ауторизације, информације о страници), јер:

  1. Непредвидив контекст: Вредност this се одређује начином на који је позвана функција, а не местом где је објављена. У асинхроном коду (Promis'и, async/await, колбекови) или при коришћењу стреличних функција, вредност this може бити другачија од очекиване. Ово доводи до тешкоћа у дебаговању и одржавању кода.

  2. Зависност од окружења: У различитим тест оквирима (Mocha, Jest, Cypress) и у зависности од подешавања (strict mode), контекст this може да се понаша различито. Ово отежава преносивост кода.

  3. Компликованост паралелног извршавања: При паралелном извршавању тестова са коришћењем истог примерака тест класе или објекта, this може бити преписан од стране другог тока извршења, што доводи до race conditions и некоректних резултата.

Уместо коришћења this, препоручује се:

  • Локалне променљиве унутар тест случајева.
  • Променљиве које се преносе као аргументи помоћним функцијама.
  • Специјализовани објекти или класе за чување стања (на пример, Page Objects).
  • Глобалне променљиве или синглтони (са опрезом, само ако је потребно).

Пример проблема са 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);
  });
});