Effective Unit Testing(좋은 테스트)
최용은
좋은 테스트의 가치● (좋은) 테스트 작성은(의)
○ 실수를 바로잡아준다.
○ 실사용에 적합한 설계를 끌어내준다.
○ 원하는 동작을 명확히 알려주어 군더더기를 없애준
다.
○ 가장 큰 수확은 작성 과정에서 얻은 깨달음이다.
좋은 테스트 란?
1. 읽기 쉬운 코드가 유지보수가 쉽다.2. 구조화가 잘 되어 있다면 이해하기 쉽다.3. 엉뚱한 걸 검사하는 건 좋지 않다.4. 독립적인 테스트는 혼자서도 잘 실행된다. 5. 믿음직한 테스트라야 기댈 수 있다.6. 모든 일이 그렇듯 테스트에도 도구가 쓰인다.
읽기 쉬운 코드가 유지보수도 쉽다.
● 가독성
○ 읽기 어려운 코드는 검증하기도 어렵다.
■ 결과적으로 테스트를 조금만 작성하는 사태로까지 이어짐
읽기 쉬운 코드가 유지보수도 쉽다.
@Test public void flatten() throws Exception {Env e = Env.getInstance();Structure k = e.newStructure();Structure v = e.newStructure();//int n =10;int n = 10000;for ( int i = 0; i<n ; ++i ) {
k.append(e.newFixnum(i));k.append(e.newFixnum(i));
}Structure t = (Structure) k.zip(e.getCurrentContext(), new IObject[]{v}, Block.NULL_BLOCK);v = (Structure) t.flatten(e.getCurrentContext());
assertNotNull(v);}
예: 복잡하지는 않지만 가독성이 떨어지는 코드
구조화가 잘 되어 있다면 이해하기 쉽다.● 구조화 되지 않은 코드
○ 간단한 개념을 수정할때 조차 어디부터 손대야 할지 찾기 어려움○ 분할정복 불가능
출처 : Effective Unit Testing
구조화가 잘 되어 있다면 이해하기 쉽다.● 구조화 잘된 코드
○ 읽기 쉽고, 찾기 쉽고, 이해하기 쉽도록 한 가지 기능에 충실한 테스트○ 이점
■ 현재 작업과 관련된 테스트 클래스를 찾을 수 있다.■ 클래스에서 적절한 테스트 메서드를 고를 수 있다.■ 메서드에서 사용하는 객체의 생명주기를 이해할 수 있다.
● 좋은 구조로 만든다는 게 말 처럼 쉬운 일이 아니다, 고로 공부해야한다^^;
엉뚱한 걸 검사하는 건 좋지 않다.
● 테스트의 이름과 검사내용이 다르면 좋치 않다.
public class TestBmap {@Test public void mask() {
Bmap bmap = new Bmap();bmap.addParameter(IPSEC_CERT_NAME);bmap.addParameter(IPSEC_ACTION_START_DAYS, 0);bmap.addParameter(IPSEC_ACTION_START_HOURS, 23);bmap.addParameter(IPSEC_CERT_NAME);assertTrue(bmap.validate());
}}
독립적인 테스트는 혼자서도 잘 실행된다. ● 테스트코드가 “얼마나 독립적인가”를 잘 살펴야 함
● 제어 할 수 없는 것들 (아키텍처의 경계)
○ 시간(Time)
○ 임의성(Randomness)
○ 동시성(Concurrency)
○ 인프라(Infrastructure)
○ 기존 데이터(Pre-existing Data)
○ 영속성(Persistency)
○ 네트워킹(Networking)
독립적인 테스트는 혼자서도 잘 실행된다. ● 독립적인 테스트를 만들기 위해서는 ?
1. 비결정적이 요소들과의 종속성을 피하는게 가장 좋음
2. 테스트 더블로 교체하거나 원하는 대로 동작하는 환경에 코드를
고립
믿음직한 테스트라야 기댈 수 있다. ● 믿을 수 없는 테스트
○ 행복한 테스트■ 아무것도 검사하지 않은 테스트
○ 절대 실패하지 않거나 항상 실패하는 테스트는 있으나 마나(짐
덩어리)
● 신뢰 할 수 있는 테스트 만드는 핵심 비법○ 비동기적 요소, 현재 시각에 종속된 코드 포함된 코드라면
■ 인터페이스로 감싸서 격리
모든 일이 그렇듯 테스트에도 도구가 쓰인다.
● 테스트 도구○ 테스트 더블(스텁, 가짜 객체, Mock 객체..)
○ 테스트 프레임워크 (JUnit과 같은)
○ 빌드 도구 (Ant, Maven, Gradle..)
Thank U