C++과 TDD
NHN NEXT 이선협
TDD (Test-Driven Development)
 테스트 주도 개발
 소프트웨어 개발 방법 중 하나
 반복 테스트를 이용하여 소프트웨어를 개발한다.
코딩
/
리팩토링
테스트 실패
성공
TDD의 목표
Clean code that works
TDD의 목표
TDD의 목표를 이루기 위해서는?
TDD의 목표를 이루기 위해서는?
1. 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다.
TDD의 목표를 이루기 위해서는?
1. 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다.
2. 중복을 제거한다.
TDD의 목표를 이루기 위해서는?
1. 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다.
2. 중복을 제거한다.
3. 즉 불필요한 기능 구현을 하지 않는다.
TDD의 목표를 이루기 위해서는?
1. 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다.
2. 중복을 제거한다.
3. 즉 불필요한 기능 구현을 하지 않는다.
Clean code that works!!!
TDD 개발법
1. 빨강 - 실패하는 작은 테스트 케이스를 작성한다.
2. 초록 - 테스트를 통과하는 코드를 작성한다.
3. 리팩토링 - 테스트를 통과하기 위해 만든 코드의 모든 중복을 제거하고,
불명확한 것을 명확히 한다.
TDD 개발법
1. 빨강 - 실패하는 작은 테스트 케이스를 작성한다.
2. 초록 - 테스트를 통과하는 코드를 작성한다.
3. 리팩토링 - 테스트를 통과하기 위해 만든 코드의 모든 중복을 제거하고,
불명확한 것을 명확히 한다.
코딩
/
리팩토링
테스트 실패
성공
TDD란 xUnit과 같은 프레임워크를 사용하지 않아도 상관없다!
TDD란 xUnit과 같은 프레임워크를 사용하지 않아도 상관없다!
로직의 완성상태를 검증할 수 있는
코드가 존재하면 충분하다
TDD란 xUnit과 같은 프레임워크를 사용하지 않아도 상관없다!
로직의 완성상태를 검증할 수 있는
코드가 존재하면 충분하다
True
True
False
True
TDD란 xUnit과 같은 프레임워크를 사용하지 않아도 상관없다!
로직의 완성상태를 검증할 수 있는
코드가 존재하면 충분하다
True
True
False
True
CppUnit에 대해 알아봅시다!
CppUnit
 xUnit으로 통칭되는 테스트 프레임워크에서 파생됨.
 실제 존재하는 프레임워크는 아님.
 C++언어에서 사용되는 테스트 프레임워크
CppUnit
 환경
 Visual Studio 2013
CppUnit – 예제 1
 간단한 클래스를 작성한다.
 오른쪽의 클래스는 잡다한 기능을 가지고 있는 정체성이 없는
클래스이다.
 이 클래스가 잘 동작하는지 테스트 해보도록 한다.
CppUnit – 예제 2
CppUnit – 예제 3
 테스트 프로젝트를 생성하면 다음 예제가
생성된다.
CppUnit – 예제 4
 예제 코드를 ‘MyClass’ 클래스를 테스트 하도록 수정하자
CppUnit – 결과
 위 메뉴에서 `테스트 -> 창 -> 테스트 탐색기`를 선택하여 테스트 항목을 볼 수 있다.
 테스트를 실행하면 실패, 성공 여부를 확인 할 수 있다.
CppUnit – 마치며
 예제에서는 미리 Class를 설계한 후 테스트 코드를 실행하였지만
미리 테스트를 만들어 둔 후 클래스를 만드는 것이 좋다.
테스트 `주도` 개발이기 때문이다.
그래요 다 좋아요 
그런데...
아까 굳이 사용하지 않아도 된다면서...
왜 사용하지?
 테스트 코드와 로직 부분을 분리하기 편하다.
 클릭 한 번으로 테스트 실행이 가능하다.
 단위 테스트와 인수 테스트로 나누어서 테스트가 가능하다.
프로그램에서 중요한 것
프로그램에서 중요한 것
Flow
A 클래스 B 클래스 C 클래스 D 클래스
A 클래스 B 클래스 C 클래스 D 클래스
테스트 성공 테스트 성공 테스트 성공 테스트 성공
A 클래스 B 클래스 C 클래스 D 클래스
테스트 성공 테스트 성공 테스트 성공 테스트 성공
이것이 단위 테스트 (Unit Test)
A 클래스 B 클래스 C 클래스 D 클래스
테스트 성공 테스트 성공 테스트 성공 테스트 성공
하지만 정작 프로세스를 진행하면?
A 클래스 B 클래스 C 클래스 D 클래스
프로세스 1
/
A, B 클래스
프로세스 2
/
A, B, C
클래스
프로세스 3
/
A, D 클래스
A 클래스 B 클래스 C 클래스 D 클래스
프로세스 1
/
A, B 클래스
프로세스 2
/
A, B, C
클래스
프로세스 3
/
A, D 클래스
동작 에러
A 클래스 B 클래스 C 클래스 D 클래스
프로세스 1
/
A, B 클래스
프로세스 2
/
A, B, C
클래스
프로세스 3
/
A, D 클래스
동작 에러 유닛 테스트 만으로는 동작을 안하네?
A 클래스 B 클래스 C 클래스 D 클래스
프로세스 1
/
A, B 클래스
프로세스 2
/
A, B, C
클래스
프로세스 3
/
A, D 클래스
테스트 테스트
A 클래스 B 클래스 C 클래스 D 클래스
프로세스 1
/
A, B 클래스
프로세스 2
/
A, B, C
클래스
프로세스 3
/
A, D 클래스
테스트 성공 테스트 성공
A 클래스 B 클래스 C 클래스 D 클래스
프로세스 1
/
A, B 클래스
프로세스 2
/
A, B, C
클래스
프로세스 3
/
A, D 클래스
테스트 성공 테스트 성공
이것을 인수 테스트(Acceptance Test)라 한다.
단위 테스트 + 인수 테스트
단위 테스트 + 인수 테스트
품질 높고 테스트한 항목에 대해서
버그 없는 제품 완성
단위 테스트 + 인수 테스트
품질 높고 테스트한 항목에 대해서
버그 없는 제품 완성
테스트한 항목은
개발자들에게 좋은 문서가됨
단위 테스트 + 인수 테스트
품질 높고 테스트한 항목에 대해서
버그 없는 제품 완성
테스트한 항목은
개발자들에게 좋은 문서가됨
테스트 코드를 성공하면
자신감이 상승한다
TDD의 단점
 코드를 변경할 때마다 유닛 테스트를 변경해줘야한다.
 데이터가 많고, 크고, 다양하면 테스트를 작성하기 힘들다.
 유닛 테스트가 실패했는데도 동작할 경우가 있다.
 하나의 유닛을 수정하면 다른 메소드에 문제가 생길 수 있다.
 테스트 코드가 추가 되기 때문에 관리해야 하는 코드가 많아진다.
TDD의 단점
 코드를 변경할 때마다 유닛 테스트를 변경해줘야한다.
 데이터가 많고, 크고, 다양하면 테스트를 작성하기 힘들다.
 유닛 테스트가 실패했는데도 동작할 경우가 있다.
 하나의 유닛을 수정하면 다른 메소드에 문제가 생길 수 있다.
결국 귀찮고 시간이 오래걸린다...
TDD의 단점
 코드를 변경할 때마다 유닛 테스트를 변경해줘야한다.
 데이터가 많고, 크고, 다양하면 테스트를 작성하기 힘들다.
 유닛 테스트가 실패했는데도 동작할 경우가 있다.
 하나의 유닛을 수정하면 다른 메소드에 문제가 생길 수 있다.
결국 귀찮고 시간이 오래걸린다...
즉 비용이 많이듬!!!!
TDD의 단점
 코드를 변경할 때마다 유닛 테스트를 변경해줘야한다.
 데이터가 많고, 크고, 다양하면 테스트를 작성하기 힘들다.
 유닛 테스트가 실패했는데도 동작할 경우가 있다.
 하나의 유닛을 수정하면 다른 메소드에 문제가 생길 수 있다.
결국 귀찮고 시간이 오래걸린다...
즉 비용이 많이듬!!!!
하지만 이것은 일반적인 단점이고
단점이 느껴지지 않는 개발자가 있을 수도 있다
결국 자신에게 맞는 개발 방법이 최고다

감사합니다
참고 자료
 http://soulpark.wordpress.com/2012/09/12/test-driven-development/
 http://www.slideshare.net/doortts/tdd-testable-design-and-tdd
 http://ko.wikipedia.org/wiki/%ED%85%8C%EC%8A%A4%ED%8A%B8_%EC%A3%BC%EB%8F%
84_%EA%B0%9C%EB%B0%9C
 http://ko.wikipedia.org/wiki/XUnit
 http://nyolong.egloos.com/viewer/2250020
 http://gusspia.egloos.com/509710
 http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/SoftWare_engineering/TDD

C++과 TDD

  • 1.
  • 2.
    TDD (Test-Driven Development) 테스트 주도 개발  소프트웨어 개발 방법 중 하나  반복 테스트를 이용하여 소프트웨어를 개발한다. 코딩 / 리팩토링 테스트 실패 성공
  • 3.
  • 4.
    Clean code thatworks TDD의 목표
  • 5.
  • 6.
    TDD의 목표를 이루기위해서는? 1. 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다.
  • 7.
    TDD의 목표를 이루기위해서는? 1. 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다. 2. 중복을 제거한다.
  • 8.
    TDD의 목표를 이루기위해서는? 1. 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다. 2. 중복을 제거한다. 3. 즉 불필요한 기능 구현을 하지 않는다.
  • 9.
    TDD의 목표를 이루기위해서는? 1. 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다. 2. 중복을 제거한다. 3. 즉 불필요한 기능 구현을 하지 않는다. Clean code that works!!!
  • 11.
    TDD 개발법 1. 빨강- 실패하는 작은 테스트 케이스를 작성한다. 2. 초록 - 테스트를 통과하는 코드를 작성한다. 3. 리팩토링 - 테스트를 통과하기 위해 만든 코드의 모든 중복을 제거하고, 불명확한 것을 명확히 한다.
  • 12.
    TDD 개발법 1. 빨강- 실패하는 작은 테스트 케이스를 작성한다. 2. 초록 - 테스트를 통과하는 코드를 작성한다. 3. 리팩토링 - 테스트를 통과하기 위해 만든 코드의 모든 중복을 제거하고, 불명확한 것을 명확히 한다. 코딩 / 리팩토링 테스트 실패 성공
  • 13.
    TDD란 xUnit과 같은프레임워크를 사용하지 않아도 상관없다!
  • 14.
    TDD란 xUnit과 같은프레임워크를 사용하지 않아도 상관없다! 로직의 완성상태를 검증할 수 있는 코드가 존재하면 충분하다
  • 15.
    TDD란 xUnit과 같은프레임워크를 사용하지 않아도 상관없다! 로직의 완성상태를 검증할 수 있는 코드가 존재하면 충분하다 True True False True
  • 16.
    TDD란 xUnit과 같은프레임워크를 사용하지 않아도 상관없다! 로직의 완성상태를 검증할 수 있는 코드가 존재하면 충분하다 True True False True
  • 17.
  • 18.
    CppUnit  xUnit으로 통칭되는테스트 프레임워크에서 파생됨.  실제 존재하는 프레임워크는 아님.  C++언어에서 사용되는 테스트 프레임워크
  • 19.
  • 20.
    CppUnit – 예제1  간단한 클래스를 작성한다.  오른쪽의 클래스는 잡다한 기능을 가지고 있는 정체성이 없는 클래스이다.  이 클래스가 잘 동작하는지 테스트 해보도록 한다.
  • 21.
  • 22.
    CppUnit – 예제3  테스트 프로젝트를 생성하면 다음 예제가 생성된다.
  • 23.
    CppUnit – 예제4  예제 코드를 ‘MyClass’ 클래스를 테스트 하도록 수정하자
  • 24.
    CppUnit – 결과 위 메뉴에서 `테스트 -> 창 -> 테스트 탐색기`를 선택하여 테스트 항목을 볼 수 있다.  테스트를 실행하면 실패, 성공 여부를 확인 할 수 있다.
  • 25.
    CppUnit – 마치며 예제에서는 미리 Class를 설계한 후 테스트 코드를 실행하였지만 미리 테스트를 만들어 둔 후 클래스를 만드는 것이 좋다. 테스트 `주도` 개발이기 때문이다.
  • 26.
    그래요 다 좋아요 그런데...
  • 27.
    아까 굳이 사용하지않아도 된다면서...
  • 28.
    왜 사용하지?  테스트코드와 로직 부분을 분리하기 편하다.  클릭 한 번으로 테스트 실행이 가능하다.  단위 테스트와 인수 테스트로 나누어서 테스트가 가능하다.
  • 29.
  • 30.
  • 31.
    A 클래스 B클래스 C 클래스 D 클래스
  • 32.
    A 클래스 B클래스 C 클래스 D 클래스 테스트 성공 테스트 성공 테스트 성공 테스트 성공
  • 33.
    A 클래스 B클래스 C 클래스 D 클래스 테스트 성공 테스트 성공 테스트 성공 테스트 성공 이것이 단위 테스트 (Unit Test)
  • 34.
    A 클래스 B클래스 C 클래스 D 클래스 테스트 성공 테스트 성공 테스트 성공 테스트 성공 하지만 정작 프로세스를 진행하면?
  • 35.
    A 클래스 B클래스 C 클래스 D 클래스 프로세스 1 / A, B 클래스 프로세스 2 / A, B, C 클래스 프로세스 3 / A, D 클래스
  • 36.
    A 클래스 B클래스 C 클래스 D 클래스 프로세스 1 / A, B 클래스 프로세스 2 / A, B, C 클래스 프로세스 3 / A, D 클래스 동작 에러
  • 37.
    A 클래스 B클래스 C 클래스 D 클래스 프로세스 1 / A, B 클래스 프로세스 2 / A, B, C 클래스 프로세스 3 / A, D 클래스 동작 에러 유닛 테스트 만으로는 동작을 안하네?
  • 38.
    A 클래스 B클래스 C 클래스 D 클래스 프로세스 1 / A, B 클래스 프로세스 2 / A, B, C 클래스 프로세스 3 / A, D 클래스 테스트 테스트
  • 39.
    A 클래스 B클래스 C 클래스 D 클래스 프로세스 1 / A, B 클래스 프로세스 2 / A, B, C 클래스 프로세스 3 / A, D 클래스 테스트 성공 테스트 성공
  • 40.
    A 클래스 B클래스 C 클래스 D 클래스 프로세스 1 / A, B 클래스 프로세스 2 / A, B, C 클래스 프로세스 3 / A, D 클래스 테스트 성공 테스트 성공 이것을 인수 테스트(Acceptance Test)라 한다.
  • 41.
    단위 테스트 +인수 테스트
  • 42.
    단위 테스트 +인수 테스트 품질 높고 테스트한 항목에 대해서 버그 없는 제품 완성
  • 43.
    단위 테스트 +인수 테스트 품질 높고 테스트한 항목에 대해서 버그 없는 제품 완성 테스트한 항목은 개발자들에게 좋은 문서가됨
  • 44.
    단위 테스트 +인수 테스트 품질 높고 테스트한 항목에 대해서 버그 없는 제품 완성 테스트한 항목은 개발자들에게 좋은 문서가됨 테스트 코드를 성공하면 자신감이 상승한다
  • 45.
    TDD의 단점  코드를변경할 때마다 유닛 테스트를 변경해줘야한다.  데이터가 많고, 크고, 다양하면 테스트를 작성하기 힘들다.  유닛 테스트가 실패했는데도 동작할 경우가 있다.  하나의 유닛을 수정하면 다른 메소드에 문제가 생길 수 있다.  테스트 코드가 추가 되기 때문에 관리해야 하는 코드가 많아진다.
  • 46.
    TDD의 단점  코드를변경할 때마다 유닛 테스트를 변경해줘야한다.  데이터가 많고, 크고, 다양하면 테스트를 작성하기 힘들다.  유닛 테스트가 실패했는데도 동작할 경우가 있다.  하나의 유닛을 수정하면 다른 메소드에 문제가 생길 수 있다. 결국 귀찮고 시간이 오래걸린다...
  • 47.
    TDD의 단점  코드를변경할 때마다 유닛 테스트를 변경해줘야한다.  데이터가 많고, 크고, 다양하면 테스트를 작성하기 힘들다.  유닛 테스트가 실패했는데도 동작할 경우가 있다.  하나의 유닛을 수정하면 다른 메소드에 문제가 생길 수 있다. 결국 귀찮고 시간이 오래걸린다... 즉 비용이 많이듬!!!!
  • 48.
    TDD의 단점  코드를변경할 때마다 유닛 테스트를 변경해줘야한다.  데이터가 많고, 크고, 다양하면 테스트를 작성하기 힘들다.  유닛 테스트가 실패했는데도 동작할 경우가 있다.  하나의 유닛을 수정하면 다른 메소드에 문제가 생길 수 있다. 결국 귀찮고 시간이 오래걸린다... 즉 비용이 많이듬!!!! 하지만 이것은 일반적인 단점이고 단점이 느껴지지 않는 개발자가 있을 수도 있다 결국 자신에게 맞는 개발 방법이 최고다 
  • 49.
  • 50.
    참고 자료  http://soulpark.wordpress.com/2012/09/12/test-driven-development/ http://www.slideshare.net/doortts/tdd-testable-design-and-tdd  http://ko.wikipedia.org/wiki/%ED%85%8C%EC%8A%A4%ED%8A%B8_%EC%A3%BC%EB%8F% 84_%EA%B0%9C%EB%B0%9C  http://ko.wikipedia.org/wiki/XUnit  http://nyolong.egloos.com/viewer/2250020  http://gusspia.egloos.com/509710  http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/SoftWare_engineering/TDD