Тех собес на middle-senior QA Тестировщик в ****

Доступно с премиум-подпиской

Оформите премиум-подписку, чтобы получить доступ к:

  • Фильтрации по компаниям
  • Названиям компаний в интервью
  • Видеозаписям собеседований в категории QA Тестировщик

Посмотреть видео в категории

(2024-07-04)

Опыт и задачи

  • Опыт и самые интересные задачи которые доводилось делать

Тестирование запроса c cURL

  • Протестировать запрос посредством курла (курл скинули просто в гугл мите). Необходимо было рассказать как бы я это тестил, плюс рассказать какие баги вижу, и как бы я их локализовывал (Там было пару проблем, что некоторые поля не возвращались)
POST http://shop.bugred.ru/api/items/create/
body : {
"section":"Платья",
"description":"345",
"color": "RED",
"size": 44,
"price": ,
"params": "dress",
"name": "asd"
}

Ревью и рефакторинг функции

  • Провести ревью кода функции и переписать ее
//Review
// 1
function calc(numbers) {
    if (numbers === undefined  numbers === null  numbers.length === 0) {
        return 0;
    } else if (typeof numbers !== 'object' || !Array.isArray(numbers)) {
        throw new Error('Input must be an array of numbers');
    } else {
        let sum = 0;
        for (let i = 0; i < numbers.length; i++) {
            if (typeof numbers[i] !== 'number') {
                throw new Error('Array must contain only numbers');
            }
            sum += numbers[i];
        }
        return sum;
    }
}

Мой переписанный код:

const calc = (numbers) => Array.isArray(numbers) && numbers.reduce((acc, cum) => acc + cum)

Event Loop

  • Объяснить как работает евент луп
  • Что в какой последовательности выведется
console.log('Start');
setTimeout(() => {
    console.log('Timeout');
}, 0);
Promise.resolve()
    .then(() => {
        console.log('Promise 1');
    })
    .then(() => {
        console.log('Promise 2');
    });
console.log('End');

Ревью системного теста

  • Ревью написанного теста (надо было рассказать про то что ненужные части нужно декомпозировать и ввынести в отдельную утилиту)
// tests
// system
Scenario(
  'Попытка авторизация сотрудника несколько раз по невалидным кодам',
  async () => {
    const phone = dataGenerator.generatePhoneNumber();
    const email = dataGenerator.generateRandomEmail();
    const user = await employeeCreateService.registerDefaultUser(phone, email);

    const code = await authService.getAuthCode(user);

    try {
      const authByCodePromiseArr = [];
      for (let i = 0; i < AUTH_TRY_COUNT; i += 1) {
        const fakeCode = dataGenerator.generateRandomCode();
        authByCodePromiseArr.push(authService.authByCode(user, fakeCode));
      }

      const results = await Promise.allSettled(authByCodePromiseArr);
      const errors = results.filter(
        (result): result is PromiseRejectedResult =>
          result.status === 'rejected'
      );
      errors.forEach((error) => {
        const { response } = error.reason;

        if (response.data.code !== 'invalid_code') {
          throw new Error(
            'Unexpected response data code. Should be invalid_code'
          );
        }
      });
      await authService.authByCode(user, code);
    } catch (error) {
      const { response } = error;
      expect(response.status).toEqual(httpStatus.BAD_REQUEST);
      expect(response.data.code).toBe('auth_locked');
    } finally {
      await employeeRemoveService.removeEmployee(user?.id);
    }
  }
);

Ревью юнит теста

  • Ревью юнит теста
//unit

jest.mock('#Libs/blocker', () => ({
    del: jest.fn(),
}));

jest.mock('#Libs/redis', () => ({
    del: jest.fn(),
}));

jest.mock('#Libs/redisSub', () => ({
    del: jest.fn(),
}));

const run = async (body: Request): Promise<Response> => {
    return CancelManualInventoryBacks(body);
};

beforeAll(async () => {
    await Database.waitMongooseConnection();
    await Database.checkDbIsConnected();
    await Inventories.Model.insertMany(Fixtures.Inventories());
});

afterAll(async () => {
    await Database.waitMongooseDisconnection();
    sinon.restore();
});

afterEach(async () => {
    sinon.resetHistory();
    Slogger.resetCollectedLogs();
});

beforeEach(async () => {
    await Remnants.Model.deleteMany();
});

it('ошибка, инвентаризация не найдена', async () => {
    await run({
        event: PickerInventoryEventTypes.inventory_cancelled,
        inventory_id: '620e39332cce3291f90e25f3',
        data: {},
    });
});