0. 들어가며

step 6-3 arrayParser를 만들때 tdd기반으로 코드를 작성했는데 너무너무 짜증이 났다;;;; 그 이유는 테스트코드를 짜는게 처음이었기때문에 테스트코드를 만드는게 불편했는데, 불편할 뿐만아니라 굉장히 지루했기 때문이었다. ( 특히 parser의 input-ouput은 굉장히 길어 output과 input을 생각하는것도 힘들었고 , 적는것도 힘들었다 ) 대체 왜 tdd를 하라는거지? 그래서 tdd를 공부해보기로 했다.

1. tdd란?

tdd는 테스트 주도 개발로, 테스트 코드를 먼저 짜고 그 테스트 코드를 통과하는 코드를 만들고, 리팩토링해나가는 과정을 말한다.

프론트앤드개발자의 프로그래밍은 그림을 그리는 과정이고, 프로그래밍과 같은 창작활동은 건축, 자동차생산과도 비슷하다. 적절한 비유를 하기가 힘든데 ㅠㅠ 이런 건축과 생산과도 같은 프로그래밍에서 테스트코드는 품질검수와도 같고, tdd는 초상화를 그릴때 구도를 잡고 눈코입을 그리는, 마치 그림을 그리는 방법론중 하나인것같다.

2. 테스트코드는 루틴이다.

테스트코드를 짜는것은 매우 지루하다. 단위테스트를 해야하기때문이다. 테스트 코드를 짜는데는 특별한 로직이 들지 않기때문이기도 하다. 마치 공부하기전에 항상 정갈하게 책상을 정리하고, 자기전에 그날 배운것을 복습하고 자는, 하면 좋지만 의식적인 노력이 필요한 과정이다.

3. tdd의 장점

하지만 테스트 코드를 짜면 좋다. 무엇이 좋으냐하면, 장보기전에 상세하게 장을볼 리스트를 적는 것과도 같은데, 결국 프로그래밍도 사람이 짜는것이기때문에 의도가 들어가고 감정이 들어가게된다. 그런데 테스트코드를 짜면 input과 output에 맞춰야하고 어떤 함수를 불러야할지 생각을 다 하기때문에 1)설계를 잘 하게된다. 2) 100개의 테스트 결과를 한꺼번에 볼 수 있다. 3) 설계를 잘 하게된다와 연관이 있는데, 또한 테스트코드를 짜기위해서는 should에 무엇을 하는건지 명시를 한다. 즉 함수를 짜기전에 tdd로 개발을 하면 목적을 생각하게 된다. 테스트 코드를 짜면 목적을 생각헤게된다

4. tdd의 단점

귀찮다. 지루하다. 단위테스트를 해야한다. 예를 들어 조건에 따라 true,false를 리턴하는 함수를 테스트할경우 true 일때 결과와 false일때 결과 2번을 테스트해야한다.

5. 테스트 코드를 짤때 규칙

given , when , then을 맞추어서 짠다.

  describe("next()", () => {
    it("can return correct next panel", () => {
      // Given
      const currentPanel = flicking.getCurrentPanel();

      // When
      const nextPanel = currentPanel.next();

      // Then
      expect(nextPanel.getIndex()).equals(currentPanel.getIndex() + 1);
      expect(nextPanel.getPosition()).equals(currentPanel.getPosition() + currentPanel.getSize());
      expect(nextPanel).deep.equals(flicking.getPanel(currentPanel.getIndex() + 1));
    });

위의 코드는 egjs 라이브러리의 테스트코드의 일부이다.

6. 현업에서 test code는 ?

  • 테스트 코드가 모든 테스트를 다 통과하는 테스트 코드임을 장담할 수 있는가?
    • 그게 안된다. 그것을 위해 QA 팀이 존재한다.
    • 틀린 테스트코드를 깨진다라고 표현하는데, 버그가 생겼는데 테스트코드를 다시 짜고, 개발할수있겠는가? 현업에서 tdd는 쉽지 않다.
  • 상위함수를 테스트할때는 하위함수는 단위테스트가 잘 통과했을것이므로, 하위함수를 잘 호출하는지만 테스트하기도 한다.

7. 마무리하며

tdd는 지루하지만 대부분의 회사가 요구하는 능력이기도 하다.
프로그래밍은 창작활동인데, 요리,그림과 같은 창작활동에서는 무언가를 만들때 어느정도 메뉴얼은 필요하다. 규칙속에서 창의성이 발휘되기 때문이다.
그러므로 지루한과정이지만 최대한 tdd방식으로 앞으로 테스트코드를 짜고 프로그래밍을 하고자한다!