13
Effective Unit Testing (좋은 테스트) 최용은

Effective unit testing - 좋은테스트 요약

Embed Size (px)

Citation preview

Page 1: Effective unit testing - 좋은테스트 요약

Effective Unit Testing(좋은 테스트)

최용은

Page 2: Effective unit testing - 좋은테스트 요약

좋은 테스트의 가치● (좋은) 테스트 작성은(의)

○ 실수를 바로잡아준다.

○ 실사용에 적합한 설계를 끌어내준다.

○ 원하는 동작을 명확히 알려주어 군더더기를 없애준

다.

○ 가장 큰 수확은 작성 과정에서 얻은 깨달음이다.

Page 3: Effective unit testing - 좋은테스트 요약

좋은 테스트 란?

1. 읽기 쉬운 코드가 유지보수가 쉽다.2. 구조화가 잘 되어 있다면 이해하기 쉽다.3. 엉뚱한 걸 검사하는 건 좋지 않다.4. 독립적인 테스트는 혼자서도 잘 실행된다. 5. 믿음직한 테스트라야 기댈 수 있다.6. 모든 일이 그렇듯 테스트에도 도구가 쓰인다.

Page 4: Effective unit testing - 좋은테스트 요약

읽기 쉬운 코드가 유지보수도 쉽다.

● 가독성

○ 읽기 어려운 코드는 검증하기도 어렵다.

■ 결과적으로 테스트를 조금만 작성하는 사태로까지 이어짐

Page 5: Effective unit testing - 좋은테스트 요약

읽기 쉬운 코드가 유지보수도 쉽다.

@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);}

예: 복잡하지는 않지만 가독성이 떨어지는 코드

Page 6: Effective unit testing - 좋은테스트 요약

구조화가 잘 되어 있다면 이해하기 쉽다.● 구조화 되지 않은 코드

○ 간단한 개념을 수정할때 조차 어디부터 손대야 할지 찾기 어려움○ 분할정복 불가능

출처 : Effective Unit Testing

Page 7: Effective unit testing - 좋은테스트 요약

구조화가 잘 되어 있다면 이해하기 쉽다.● 구조화 잘된 코드

○ 읽기 쉽고, 찾기 쉽고, 이해하기 쉽도록 한 가지 기능에 충실한 테스트○ 이점

■ 현재 작업과 관련된 테스트 클래스를 찾을 수 있다.■ 클래스에서 적절한 테스트 메서드를 고를 수 있다.■ 메서드에서 사용하는 객체의 생명주기를 이해할 수 있다.

● 좋은 구조로 만든다는 게 말 처럼 쉬운 일이 아니다, 고로 공부해야한다^^;

Page 8: 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());

}}

Page 9: Effective unit testing - 좋은테스트 요약

독립적인 테스트는 혼자서도 잘 실행된다. ● 테스트코드가 “얼마나 독립적인가”를 잘 살펴야 함

● 제어 할 수 없는 것들 (아키텍처의 경계)

○ 시간(Time)

○ 임의성(Randomness)

○ 동시성(Concurrency)

○ 인프라(Infrastructure)

○ 기존 데이터(Pre-existing Data)

○ 영속성(Persistency)

○ 네트워킹(Networking)

Page 10: Effective unit testing - 좋은테스트 요약

독립적인 테스트는 혼자서도 잘 실행된다. ● 독립적인 테스트를 만들기 위해서는 ?

1. 비결정적이 요소들과의 종속성을 피하는게 가장 좋음

2. 테스트 더블로 교체하거나 원하는 대로 동작하는 환경에 코드를

고립

Page 11: Effective unit testing - 좋은테스트 요약

믿음직한 테스트라야 기댈 수 있다. ● 믿을 수 없는 테스트

○ 행복한 테스트■ 아무것도 검사하지 않은 테스트

○ 절대 실패하지 않거나 항상 실패하는 테스트는 있으나 마나(짐

덩어리)

● 신뢰 할 수 있는 테스트 만드는 핵심 비법○ 비동기적 요소, 현재 시각에 종속된 코드 포함된 코드라면

■ 인터페이스로 감싸서 격리

Page 12: Effective unit testing - 좋은테스트 요약

모든 일이 그렇듯 테스트에도 도구가 쓰인다.

● 테스트 도구○ 테스트 더블(스텁, 가짜 객체, Mock 객체..)

○ 테스트 프레임워크 (JUnit과 같은)

○ 빌드 도구 (Ant, Maven, Gradle..)

Page 13: Effective unit testing - 좋은테스트 요약

Thank U