Хуки · Pest
Хуки в Pest схожі на кроки, які ви робите, коли готуєте страву: спочатку збираєте й готуєте інгредієнти, потім готуєте саму страву, а наприкінці прибираєте за собою. Так само хуки дозволяють виконувати певні дії до та після кожного тесту або файлу: наприклад, готувати тестові дані, ініціалізувати тестове середовище чи звільняти ресурси після завершення тестів.
За допомогою хуків у Pest ви впорядковуєте процес тестування й автоматизуєте повторювані дії. Незалежно від того, чи пишете ви unit-тести для невеликого проєкту, чи будуєте складний набір тестів для великого застосунку, хуки допоможуть зекономити час і підвищити якість тестів.
Крім того, якщо ви хочете виконати хук лише для певної групи тестів, можете розмістити його всередині функції describe().
beforeEach(function () {
//
});
describe('something', function () {
beforeEach(function () {
//
});
//
describe('something else', function () {
beforeEach(function () {
//
});
//
});
});
test('something', function () {
//
});
Ось список хуків, доступних у Pest:
beforeEach()
Виконує передане замикання перед кожним тестом у поточному файлі, гарантуючи, що вся потрібна підготовка й конфігурація завершені до початку кожного тесту.
beforeEach(function () {
// Підготувати щось перед кожним запуском тесту...
});
У хуку beforeEach() можна ініціалізувати властивості, які будуть спільними для всіх тестів у поточному файлі. Наприклад, через beforeEach() можна ініціалізувати властивість $repository перед кожним тестом, щоб вона була доступна в наступних тестах файлу.
beforeEach(function () {
$this->userRepository = new UserRepository();
});
it('may be created', function () {
$user = $this->userRepository->create();
expect($user)->toBeInstanceOf(User::class);
});
afterEach()
Виконує передане замикання після кожного тесту в поточному файлі, даючи змогу прибрати ресурси або стан, які могли змінитися під час тестування.
afterEach(function () {
// Очистити тестові дані після кожного запуску тесту...
});
Отже, у прикладі вище хук beforeEach() ініціалізує властивість $userRepository, а хук afterEach() за потреби «прибирає» її після кожного тесту. Так ресурси, які використовує обʼєкт, звільняються або скидаються між тестами, що запобігає взаємному впливу тестів і небажаній поведінці.
afterEach(function () {
$this->userRepository->reset();
});
За бажанням для прибирання після конкретного тесту можна скористатися методом after(). Це зручно, коли потрібно звільнити ресурси, специфічні для одного тесту, а не спільні для всіх тестів у файлі.
it('may be created', function () {
$this->userRepository->create();
expect($user)->toBeInstanceOf(User::class);
})->after(function () {
$this->userRepository->reset();
});
beforeAll()
Виконує передане замикання один раз перед запуском будь-яких тестів у поточному файлі, даючи змогу зробити підготовку чи ініціалізацію, спільну для всіх тестів.
beforeAll(function () {
// Підготувати щось один раз перед запуском тестів цього файлу...
});
Зверніть увагу: на відміну від хука beforeEach(), у хуку beforeAll() змінна $this недоступна. Хук виконується до запуску будь-яких тестів, тому ще немає екземпляра тестового класу чи обʼєкта, на який ця змінна могла б посилатися.
afterAll()
Виконує передане замикання один раз після завершення всіх тестів у поточному файлі, даючи змогу виконати потрібне прибирання або завершальні дії.
afterAll(function () {
// Очистити тестові дані після виконання всіх тестів...
});
Як і в методі beforeAll(), у хуку afterAll() змінна $this недоступна. Хук afterAll() зазвичай виконується після того, як усі тести у файлі завершилися, тому тестового екземпляра чи обʼєкта, на який могла б посилатися змінна, вже не існує.
Коли ви опануєте хуки для налаштування передумов і прибирання після тестів, можна переходити до «Наборів даних», які дозволяють запускати той самий тест із різними вхідними даними чи параметрами. Набори даних дають змогу ретельно перевірити код у різних умовах і граничних випадках, щоб знайти й виправити помилки, які не завжди помітні відразу: Набори даних →
Перекладаємо з офіційної документації, розділ за розділом, і не ховаємо недоперекладене. Помітили неточність у терміні чи реченні: напишіть, виправимо.