test 전후

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에 커넥션을 얻고 해제하는 경우가 그렇다.

만약 beforeEachafterEach 같은 것을 사용하면 각 테스트마다 커넥션을 얻고 해제하는것을 반복하기 때문에 시간이 테스트 수 곱하기로 들것이다. 이러때는 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("", () => {});
});

순서는 다음과 같다 :

  1. 밖 beforeAll
  2. 밖 beforeEach
  3. 밖 test
  4. 밖 afterEach
  5.    안 beforeAll
    
  6. 밖 beforeEach
  7.    안 beforeEach
    
  8. 안 test
  9. 안 afterEach
  10. 밖 afterEach
  11. 안 afterAll
    
  12. 밖 afterAll

test 시 순서에 유의하도록 한다.

skip only

skip 은 지정한 test를 스킵할때, only 는 지정한 test만 실행할때 사용할 수 있다.

test 가 실패햇다면 다음과 같은 순서로 작업을 진행할 수 있다.

  1. 어떤 test1 실패
  2. test1 만 only로 실행
  3. test1 수정 -> 통과 확인
  4. 영향 주는 test0 찾음
  5. 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);
});