클린 코드(Clean Code) - 9장 단위 테스트

Muzi·2023년 1월 17일
0

Clean Code

목록 보기
9/14

단위 테스트

유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다. 즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다. - Wikipedia

1. TDD 법칙 세 가지

1) 실패하는 단위 테스트 를 작성할 때까지 실제 코드를 작성하지 않는다.
2) 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다.
3) 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.

위 3가지 법칙을 따르면 개발과 테스트를 빠르게 수행할 수 있다. 단 이렇게하면 테스트 케이스가 너무 많이 나와서 관리가 힘들 수 있다.

2. 깨끗한 테스트 코드 유지하기

테스트 코드가 복잡할수록 실제 코드를 짜는 시간보다 테스트 케이스를 추가하는 시간이 더 걸린다

테스트는 유연성, 유지보수성, 재사용성을 제공한다.

  • 테스트 코드가 지저분하면 코드를 변경하는 능력이 떨어지며 코드 구조를 개선하는 능력도 떨어진다
  • 테스트 케이스가 없으면 모든 변경이 잠정적인 버그

3. 깨끗한 테스트 코드

가독성은 실제 코드보다 테스트 코드에 더더욱 중요하다. 가독성을 높이려면 명료성, 단순성, 풍부한 표현력이 필요하다

BUILD-OPERATE-CHECK 패턴

  • BUILD : 테스트 자료를 만든다.
  • OPERATE : 테스트 자료를 조작한다.
  • CHECK : 조작한 결과가 올바른지 확인한다.

4. 테스트 당 assert 하나

// given-when-then이라는 관례를 사용해서 테스트 코드를 더 읽기 쉽게 만든 것을 볼 수 있다.


public void testGetPageHierarchyAsXml() throws Exception { 
	givenPages("PageOne", "PageOne.ChildOne", "PageTwo");

	whenRequestIsIssued("root", "type:pages");

	thenResponseShouldBeXML(); 
}

public void testGetPageHierarchyHasRightTags() throws Exception { 
	givenPages("PageOne", "PageOne.ChildOne", "PageTwo");

	whenRequestIsIssued("root", "type:pages");

	thenResponseShouldContain(
		"<name>PageOne</name>", "<name>PageTwo</name>", "<name>ChildOne</name>"
	); 
}

고려사항

  • 1개의 assert문을 주도록 강제할 경우에는 중복되는 코드가 많아질 위험
    • TEMPLATE METHOD 패턴을 사용하여 해결 할 수 있다.
      • given/when 부분을 부모 클래스에 두고
      • then 부분을 자식 클래스에 두는 방식으로
  • 하지만 공통 부분을 별도의 method로 끄집어 내는데 들어가는 노력이 더 클 수 있다

결국, 필요한 경우에는 assert를 여러개를 두되 assert 문 개수는 최대한 줄이려고 노력하는 것이 좋다

테스트 당 개념 하나

  • 개념 당 assert문 수를 최소로 줄여라
  • 테스트 함수 하나는 개념 하나만 테스트하라

F.I.R.S.T

  • Fast : 테스트는 빨라야 한다. 테스트는 자주 돌려야 하기 때문에 느리면 안 된다.

  • Independent : 각 테스트는 서로 의존하면 안 된다. 의존 되어있으면 테스트가 연달아 실패하기 때문에 원인을 진단하기 어렵다.

  • Repeatable : 어떤 환경에서든 반복가능해야 한다. local, QA, Staging, 운영 환경 어디서든 테스트가 돌아가야 한다. 반드시

  • self-vaildating : 테스트는 성공 아니면 실패다. 통과 여부를 알려고 뭔가 읽게 만들어선 안된다.

  • Timely : 테스트는 적시에 작성해야 한다. 단위 테스트는 테스트하려는 실제 코드를 구현하기 직전에 구현한다.

마치며

9장을 읽으며 프로젝트를 할때 시간에 맞춰 기능하나하나를 만드는데 급급해 테스트를 소홀히 하던 나의 모습이 머리속에 계속 떠올라 많이 뜨끔했다.. 반성한다.. 테스트 코드가 방치되어 망가지면 실제 코드도 망가진다. 테스트 코드를 깨끗하게 유지하자라는 말대로 테스트코드 작성에 더 주의를 기울이자..

profile
좋아하는걸 열심히

0개의 댓글