...
before / after
테스트를 작성하다보면 모든 테스트 함수에서 공통적인 로직이 필요할 때가 있다.
기본적으로 테스트 mock 함수는 상태가 유지되는 속성이 있기 때문에,
테스트에 쓰인 데이터가 그대로 남아있다. 따라서 다음 테스트를 진행할때 이전에 쓰였던 mock 함수를 또 쓴다고 하면, 기존의 데이터때문에 결과가 이상해 질 수 있다.
before / after 이라는 말은, 테스트 하기 전 / 한 후에 데이터 설정 혹은 정리를 위해 쓰인다는 개념에서 비롯된 것이다.
beforeAll() / afterAll()
beforeAll() , afterAll() 은 맨 처음과 맨 끝에 딱 한 번씩만 호출 하게 설정한다.
대표적인 사용 사례로, 데이터베이스에 접속할 필요한 연결(Connection) 객체를 생각해볼 수 있다.
테스트 함수 마다 매번 Connection을 맺고 끊는 것 보다는 맨 처음에 한 번 Connection을 맺어 놓고, 테스트에 여러 함수에 걸쳐서 사용 한 후 마지막에 Connection을 종료하는 것이 효율적 이기 때문이다.
let connection;
// 테스트 실행하기전에 미리 전역 설정
beforeAll(() => {
conection = openConnection({ host: "...", port: "..." });
});
... 여러개의 test 코드들
... 여러 테스트 함수 내에서 connection 객체를 많이 사용한다.
// 테스트 완료후 해체
afterAll(() => {
conection.close();
});
beforeEach() / afterEach()
beforeAll() 이 전역으로 초기에 한번 호출되는 것이라면,
beforeEach() 는 여러 테스트함수 들이 각각 실행될때마다 매번 불러와주는(each) 개념이다.
// test() 함수들이 돌아갈때마다 beforeEach()에서 설정한, 여러 객체들을 push한 data.users 데이터를 사용하게 된다.
beforeEach(() => {
data.users.push(
{ id: 1, email: "user1@test.com" },
{ id: 2, email: "user2@test.com" },
{ id: 3, email: "user3@test.com" }
);
});
test("find all users", () => {
// ... 테스트하면서 data.users의 데이터들을 가져와 사용한다.
});
test("destory a user", () => {
// ... 테스트하면서 data.users의 데이터들을 가져와 사용한다.
});
test("modify a user", () => {
// ... 테스트하면서 data.users의 데이터들을 가져와 사용한다.
});
물론 각 test() 함수 마다 내에 data.user.push() 를 넣고 사용해도 된다.
하지만 이는 곧 프로그래밍에서 피해야할 중복이 생기게 된다. 중복을 피하기 위해 모듈화가 필요한거고 beforeEach() 가 그 개념이다.
// beforeEach()를 안쓸경우 각 test() 함수내에 일일히 data.users 데이터를 구현해야 한다.
test("find all users", () => {
data.users.push(
{ id: 1, email: "user1@test.com" },
{ id: 2, email: "user2@test.com" },
{ id: 3, email: "user3@test.com" }
);
// ... 테스트하면서 data.users의 데이터들을 가져와 사용한다.
});
test("destory a user", () => {
data.users.push(
{ id: 1, email: "user1@test.com" },
{ id: 2, email: "user2@test.com" },
{ id: 3, email: "user3@test.com" }
);
// ... 테스트하면서 data.users의 데이터들을 가져와 사용한다.
});
test("modify a user", () => {
data.users.push(
{ id: 1, email: "user1@test.com" },
{ id: 2, email: "user2@test.com" },
{ id: 3, email: "user3@test.com" }
);
// ... 테스트하면서 data.users의 데이터들을 가져와 사용한다.
});
Reference
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.