test 전후
beforEach, afterEach
각 테스트 전에 먼저 실행되어야 할 코드 가 있을 수 있다. 예를 들어서 어떤 테스트가 다음 번에 테스트에 영향을 끼치는 변수를 변경하고 있다면 변수를 초기화 해주는 코드가 필요하다.
해당 작업은 beforeEach
를 통해서 할 수 있다.
예시 코드는 각 test 전에 num 값을 0으로 초기화 해서 다음 test에 주는 영향을 없앤다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| const fn = require("./fn");
let num = 0;
beforeEach(() => { num = 0; });
test("0 더하기 1은 1이야", () => { num = fn.add(num, 1); expect(num).toBe(1); }); test("0 더하기 2은 2이야", () => { num = fn.add(num, 2); expect(num).toBe(2); }); test("0 더하기 3은 3이야", () => { num = fn.add(num, 3); expect(num).toBe(3); }); test("0 더하기 4은 4이야", () => { num = fn.add(num, 4); expect(num).toBe(4); }); test("0 더하기 5은 5이야", () => { num = fn.add(num, 5); expect(num).toBe(5); });
|
afterEach
는 각 테스트 이후에 실행될 함수이다.
beforeAll, afterAll
어떤 테스트는 처음 테스트가 시행되기전에 한번 사전 작업을 하고, 모든 테스트가 끝나고 난 뒤에 수행해야 할 작업이 있을 수 있다. 예를들어 db에 커넥션을 얻고 해제하는 경우가 그렇다.
만약 beforeEach
나 afterEach
같은 것을 사용하면 각 테스트마다 커넥션을 얻고 해제하는것을 반복하기 때문에 시간이 테스트 수 곱하기로 들것이다. 이러때는 All
을 사용해서 한번씩만 호출되도록 할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| beforeAll(async () => { user = await fn.connectUserDb(); }); afterAll(async () => { user = await fn.disconnectUserDb(); });
test("이름은 KOO 야", () => { expect(user.name).toBe("KOO"); }); test("나이는 27 야", () => { expect(user.age).toBe(27); }); test("성별은 남자야", () => { expect(user.gender).toBe("male"); });
|
describe
테스트를 묶어서 설명할 수 있다. 테스트는 한 스코프 안에서 실행되는데 여기에 선언한 before
, after
관련 함수는 해당 스코프를 범위로 실행된다.
car 스코프 안에서 커넥션을 얻고 해제하는 과정이 한번 일어난다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| const fn = require("./fn");
let user; beforeAll(async () => { user = await fn.connectUserDb(); }); afterAll(async () => { await fn.disconnectUserDb(); });
test("이름은 KOO 야", () => { expect(user.name).toBe("KOO"); }); test("나이는 27 야", () => { expect(user.age).toBe(27); }); test("성별은 남자야", () => { expect(user.gender).toBe("male"); });
describe("Car 관련 작업", () => { let car; beforeAll(async () => { car = await fn.connectCarrDb(); }); afterAll(async () => { await fn.disconnectUserDb(); }); test("이름은 sonata 야", () => { expect(car.name).toBe("sonata"); }); test("브랜드는 kia야", () => { expect(car.brand).toBe("kia"); }); });
|
순서?
describe 바깥과 안에 각각 beforeAll
, beforeEach
, afterEach
, afterAll
이 모두 정의 되어 있다면 어떤 순서로 진행 될까 ?
다음과 같은 경우이다 :
1 2 3 4 5 6 7 8 9 10 11 12 13
| beforeAll(() => {}); beforeEach(() => {}); afterEach(() => {}); afterAll(() => {}); test("", () => {});
describe("", () => { beforeAll(() => {}); beforeEach(() => {}); afterEach(() => {}); afterAll(() => {}); test("", () => {}); });
|
순서는 다음과 같다 :
- 밖 beforeAll
- 밖 beforeEach
- 밖 test
- 밖 afterEach
안 beforeAll
- 밖 beforeEach
안 beforeEach
- 안 test
- 안 afterEach
- 밖 afterEach
안 afterAll
- 밖 afterAll
test 시 순서에 유의하도록 한다.
skip only
skip 은 지정한 test를 스킵할때, only 는 지정한 test만 실행할때 사용할 수 있다.
test 가 실패햇다면 다음과 같은 순서로 작업을 진행할 수 있다.
- 어떤 test1 실패
- test1 만 only로 실행
- test1 수정 -> 통과 확인
- 영향 주는 test0 찾음
- test0을 수정하는것이 best지만 일단 test를 해야 한다면 test0을 skip 하고 실행
순서대로 하면 다음과 같다.
1 : 마지막 테스트 실패
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| test("0 더하기 1은 1이야", () => { expect(fn.add(num, 1)).toBe(1); }); test("0 더하기 2은 2이야", () => { expect(fn.add(num, 2)).toBe(2); }); test("0 더하기 3은 3이야", () => { expect(fn.add(num, 3)).toBe(3); }); test("0 더하기 4은 4이야", () => { expect(fn.add(num, 4)).toBe(4); num = 10; }); test("0 더하기 5은 5이야", () => { expect(fn.add(num, 5)).toBe(5); });
|
2 : 마지막 test만 only 로 실행
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| test("0 더하기 1은 1이야", () => { expect(fn.add(num, 1)).toBe(1); }); test("0 더하기 2은 2이야", () => { expect(fn.add(num, 2)).toBe(2); }); test("0 더하기 3은 3이야", () => { expect(fn.add(num, 3)).toBe(3); }); test("0 더하기 4은 4이야", () => { expect(fn.add(num, 4)).toBe(4); num = 10; }); test.only("0 더하기 5은 5이야", () => { expect(fn.add(num, 5)).toBe(5); });
|
3,4 : 수정후 영향을 주는 test 확인
5 : 문제되는 test skip 하고 진행
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| test("0 더하기 1은 1이야", () => { expect(fn.add(num, 1)).toBe(1); }); test("0 더하기 2은 2이야", () => { expect(fn.add(num, 2)).toBe(2); }); test("0 더하기 3은 3이야", () => { expect(fn.add(num, 3)).toBe(3); }); test.skip("0 더하기 4은 4이야", () => { expect(fn.add(num, 4)).toBe(4); num = 10; }); test("0 더하기 5은 5이야", () => { expect(fn.add(num, 5)).toBe(5); });
|