JavaScript/Basics

[JavaScript] 테스트 자동화

Sonny Cucumber 2022. 3. 10. 23:19

테스트는 왜 해야 하는가?

함수를 하나 만들었다 치고 대부분 매개변수-결과 관계를 중심으로 어떻게 작성할지 구상할건데

개발 중엔 콘솔 등을 이용해 실행 결과가 기대했던 것과 같은지 비교하면서

원하는 기능이 잘 구현되어있는지 확인할 겁니다.

 

하지만 이렇게 수동으로 '재실행'하면서 테스트를 하면 놓치기 쉽다.

f(1)가 있고 f(2)를 테스트해볼 때, 이렇게 수동으로 하면 에러를 발생할 여지가 있다.

무언가 만들 때 수많은 유스 케이스를 생각하며 코드를 작성하는데

코드를 변경해야 할 때 모든 케이스를 상기하면서 코드를 작성하는건 거의 불가능.

 

테스팅 자동화는 테스트 코드가 실제 동작에 관여하는 코드와 별개로 작성되었을 때 가능.

테스트 코드를 이용하면 함수를 다양한 조건에서 실행해볼 수 있는데 이때 결과와 기댓값을 비교 가능

 

Behavior Driven Development

BDD라 불리는 방법론에 대해 알아보자.

이는 테스트(test), 문서(Document), 예시(example)를 한데 모아놓은 개념이다.

 

거듭제곱 함수와 명세서

x를 n번 곱해주는 함수, pow(x,n)를 구현한다고 가정해보자

 

사실 JS엔 거듭제곱 연산자 **가 있다. 그럼에도 함수를 직접 구현하는 이유는

구현 과정에 초점을 두면서 BDD를 직접 적용해 보기 위해서인데 기능이 간단한

함수를 구현하면서 BDD를 직접 적용해보면 큰 문제에 BDD를 적용하는 건 쉬울거다.

 

일단 코드가 무슨 일을 하는지 상상한 후 이를 자연어로 표현해야한다

이때, 만들어진 산출물을 BDD에선 명세서(specification) 또는 짧게 스펙(spec) 라고 한다.

명세서엔 아래와 같이 유스 케이스에 대한 자세한 설명과 테스트가 담겨있다.

 

describe("pow", function() {

  it("주어진 숫자의 n 제곱", function() {
    assert.equal(pow(2, 3), 8);
  });

});

스펙은 세가지로 이루어져있다.

  • describe("title", function() {...})
    구현하고자 하느 기능에 대한 설명. it블록을 한데 모아주는 역할도 한다.
  • it("유스 케이스 설명", function() {...})
    첫번째 인수엔 설명이 들어가고 두번째엔 유스케이스 테스트 함수가 들어간다.
  • asser.equal(value1, value2)
    it블록내의 코드 assert.equal(value1, value2)가 에러 없이 실행된다.
    이 함수는 인수끼리 동등 비교했을 때 다르다고 판단되면 에러 반환.
    스펙은 실행 가능하고 실행하면 it블록 안의 테스트가 실행된다.