전(before)/후(after) 처리
테스트를 작성하다 보면 모든 테스트 함수에서 공통적으로 필요한 공통 로직이 필요할 때가 있는데,
그때 전후 처리인 before/after 메서드를 사용할 수 있다.
기본적인 건 [Jest] Jest 기초 문법에서 다뤘었는데, 전후처리에 대해 좀 더 알아보자.
beforeEach() / afterEach()
const globalDatabase = makeGlobalDatabase();
function cleanUpDatabase(db) {
db.cleanUp();
}
afterEach(() => {
cleanUpDatabase(globalDatabase);
});
beforeEach(() => {
return globalDatabase.insert({ testData: "foo" });
});
test("can find things", () => {
return globalDatabase.find("thing", {}, (results) => {
expect(results.length).toBeGreaterThan(0);
});
});
test("can insert a thing", () => {
return globalDatabase.insert("thing", makeThing(), (response) => {
expect(response.success).toBeTruthy();
});
});
beforeEach는 각 테스트가 실행되기 전에 실행되는 전처리기이다.
위 예제를 보면 각 test()가 실행하기 전에 beforeEach가 실행되며 각 테스트 케이스가 실행되기 전에 데이터를 삽입하는 로직이 실행된다.
afterEach는 각 테스트가 실행된 후에 실행되는 후처리기이다.
위 예제를 보면 각 test()가 실행한 후에는 beforeEach에서 사용한 데이터를 초기화시켜주는 역할을 한다.
자주 사용하는 메서드는 아니겠지만 일부 임시 상태를 정리하는데 유용하게 사용된다.
(참고: https://jestjs.io/docs/api#beforeeachfn-timeout / https://jestjs.io/docs/api#aftereachfn-timeout)
beforeAll() / afterAll()
beforeAll()과 afterAll()은 beforeEach()와 afterEach()를 보면 알겠지만 굳이 매번 실행할 필요 없이 단 한 번만 실행해놓고 테스트를 작성해도 상관없을 때 사용된다.
const globalDatabase = makeGlobalDatabase();
function cleanUpDatabase(db) {
db.cleanUp();
}
afterAll(() => {
cleanUpDatabase(globalDatabase);
});
beforeAll(() => {
return globalDatabase.insert({ testData: "foo" });
});
test("can find things", () => {
return globalDatabase.find("thing", {}, (results) => {
expect(results.length).toBeGreaterThan(0);
});
});
test("can insert a thing", () => {
return globalDatabase.insert("thing", makeThing(), (response) => {
expect(response.success).toBeTruthy();
});
});
beforeAll는 테스트가 실행되기 전에 실행되는 전처리기이다. (단 한번만 실행된다.)
해당 테스트들이 실행되기 전에 단 한번 실행되는 메서드이다. (DB 연결 같은 곳에 사용하면 좋다고 생각된다.)
afterAll는 테스트가 실행된 후에 실행되는 후처리기이다. (단 한 번만 실행된다.)
모든 테스트가 종료된 후에 실행되는 메서드이다.
(참고: https://jestjs.io/docs/api#beforeallfn-timeout / https://jestjs.io/docs/api#afterallfn-timeout)
상황에 맞춰 beforeEach/beforeAll/afterEach/afterAll 메서드를 골라서 사용해주면 되며,
하나 주의할 점은 before, after에서 실행되는 게 비동기 처리 같은 것이라면 기본 제한시간은 5초이라는 것이다.
댓글