xUnit 테스트 패턴
7장
xUnit 기초
      ohyecloudyhttp://ohyecloudy.com
     아꿈사http://cafe.naver.com/architect1.cafe
                                 2010.07.31
xUnit?
최소한 알아야 할 것
 테스트 정의
 픽스처fixture?
 스위트suite 정의
 테스트 실행, 결과
xUnit 내부
 테스트 명령
 테스트 스위트 객체
젃차적 세상에서의 xUnit
테스트 자동 프레임워크
 다음 요구사항 4개를 만족
1. 테스트를 테스트 메소드로 명시
TEST(FactorialTest, Negative) {
  EXPECT_EQ(1, Factorial(-5));
  EXPECT_EQ(1, Factorial(-1));
  EXPECT_TRUE(Factorial(-10) > 0);
}
2. 단언 메소드assert method로 기대 값 명시
TEST(FactorialTest, Negative) {
  EXPECT_EQ(1, Factorial(-5));
  EXPECT_EQ(1, Factorial(-1));
  EXPECT_TRUE(Factorial(-10) > 0);
}


    기대 값        실제 계산된 값
3. 테스트 스위트에 모아두기
BOOST_AUTO_TEST_SUITE (stringtest)

BOOST_AUTO_TEST_CASE (test1)
{
  mystring s;                        stringtest 스위트를
  BOOST_CHECK(s.size() == 0);        실행하면
}
                                     test1, test2 테스트 케이스
BOOST_AUTO_TEST_CASE (test2)         실행.
{
  mystring s;
  s.setbuffer("hello world");
  BOOST_REQUIRE_EQUAL ('h', s[0]);
}

BOOST_AUTO_TEST_SUITE_END ()
4. 테스트 결과 보고 받기
int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
즉,
테스트 메소드를 사용해
테스트를 정의하고
단언 메소드를 기대 값을 정하며
테스트 스위트를 지원하고
테스트 결과를 보고 받을 수 있는
테스트 자동 프레임워크를 xUnit이라 한다.
xUnit?
최소한 알아야 할 것
  테스트 정의
  픽스처fixture?
  스위트suite 정의
  테스트 실행, 결과
xUnit 내부
  테스트 명령
  테스트 스위트 객체
젃차적 세상에서의 xUnit
struct F {
    F() : i( 0 ) { BOOST_TEST_MESSAGE( "setup fixture" ); }
    ~F()         { BOOST_TEST_MESSAGE( "teardown fixture" ); }

     int i;
};

BOOST_FIXTURE_TEST_CASE( test_case1, F ) {
    BOOST_CHECK( i == 1 );
    ++i;
}

BOOST_FIXTURE_TEST_CASE( test_case2, F ) {
    BOOST_CHECK_EQUAL( i, 1 );
}
                              이 소스코드를 예로 들어 설명
                                 테스트 픽스처 설치
                                 SUT 실행
                                 단언 메소드 호출
                                 테스트 픽스처 해체
struct F {
    F() : i( 0 ) { BOOST_TEST_MESSAGE( "setup fixture" ); }
    ~F()         { BOOST_TEST_MESSAGE( "teardown fixture" ); }

     int i;
};

BOOST_FIXTURE_TEST_CASE( test_case1, F ) {
    BOOST_CHECK( i == 1 );
    ++i;
}

BOOST_FIXTURE_TEST_CASE( test_case2, F ) {
    BOOST_CHECK_EQUAL( i, 1 );
}
                                  테스트 픽스처 설치
                                      인라인 설치 In-line Setup
                                      위임 설치 Delegated Setup
                                      암묵적 설치 Implicit Setup
struct F {
    F() : i( 0 ) { BOOST_TEST_MESSAGE( "setup fixture" ); }
    ~F()         { BOOST_TEST_MESSAGE( "teardown fixture" ); }

     int i;
};

BOOST_FIXTURE_TEST_CASE( test_case1, F ) {
    BOOST_CHECK( i == 1 );
    ++i;
}

BOOST_FIXTURE_TEST_CASE( test_case2, F ) {
    BOOST_CHECK_EQUAL( i, 1 );
}                                        SUT 실행
struct F {
    F() : i( 0 ) { BOOST_TEST_MESSAGE( "setup fixture" ); }
    ~F()         { BOOST_TEST_MESSAGE( "teardown fixture" ); }

     int i;
};

BOOST_FIXTURE_TEST_CASE( test_case1, F ) {
    BOOST_CHECK( i == 1 );
    ++i;
}

BOOST_FIXTURE_TEST_CASE( test_case2, F ) {
    BOOST_CHECK_EQUAL( i, 1 );
}

                      테스트 픽스처 해체
                          가비지 컬렉션 해체 Garbage-Collected Teardown
                          인라인 해체 In-line Teardown
                          암묵적 해체 Implicit Teardown
                          자동 해체 Automated Teardown
xUnit?
최소한 알아야 할 것
  테스트 정의
  픽스처fixture?
  스위트suite 정의
  테스트 실행, 결과
xUnit 내부
  테스트 명령
  테스트 스위트 객체
젃차적 세상에서의 xUnit
SUT를 실행하기 위해 준비해야 하는 모든 것
    설치, 해체를 책임진다.



class FooTest : public ::testing::Test {
protected:
   virtual void SetUp() { ... }
   virtual void TearDown() { ... }
};

TEST_F(FooTest, Test1) {
  ...
}

TEST_F(FooTest, Test2) {
  ...
}
xUnit?
최소한 알아야 할 것
  테스트 정의
  픽스처fixture?
  스위트suite 정의
  테스트 실행, 결과
xUnit 내부
  테스트 명령
  테스트 스위트 객체
젃차적 세상에서의 xUnit
테스트 스위트
 테스트 케이스 또는 테스트 스위트 컨테이너
xUnit?
최소한 알아야 할 것
  테스트 정의
  픽스처fixture?
  스위트suite 정의
  테스트 실행, 결과
xUnit 내부
  테스트 명령
  테스트 스위트 객체
젃차적 세상에서의 xUnit
xUnit?
최소한 알아야 할 것
 테스트 정의
 픽스처fixture?
 스위트suite 정의
 테스트 실행, 결과
xUnit 내부
 테스트 명령
 테스트 스위트 객체
젃차적 세상에서의 xUnit
테스트 실행기에서 테스트 메소드를 실행.
 각자 실행 함수가 다르다면?
 동일한 인터페이스로 테스트 메소드를 실행.


Command 패턴
 동일한 인터페이스로 실행
 ‘무엇을 어떻게’를 숨긴다
TEST(VectorTest, Clear) {
    // 어쩌고 저쩌고..
}




 class VectorTest_Clear_Test : public ::testing::Test {
    ...
 private:
    virtual void TestBody() {
        // 어쩌고 저쩌고..
    }
xUnit?
최소한 알아야 할 것
 테스트 정의
 픽스처fixture?
 스위트suite 정의
 테스트 실행, 결과
xUnit 내부
 테스트 명령
 테스트 스위트 객체
젃차적 세상에서의 xUnit
테스트 스위트에는
 테스트 케이스가 있을 수도
 테스트 스위트가 있을 수도


Composite 패턴
 같은 방식으로 취급
   컨테이너와 원소
xUnit?
최소한 알아야 할 것
 테스트 정의
 픽스처fixture?
 스위트suite 정의
 테스트 실행, 결과
xUnit 내부
 테스트 명령
 테스트 스위트 객체
젃차적 세상에서의 xUnit
젂역 프로시저인 테스트 메소드

테스트 스위트 프로시저
 테스트 메소드들의 배열을 인자로


더 자세한 내용은
 Working Effectively with Legacy Code : Chapter 19 참고
reference
• google test
   – http://code.google.com/p/googletest/
• boost
  – http://www.boost.org/
• 오픈 소스 C/C++ 유닛 테스트 도구, Part 1
  – http://www.ibm.com/developerworks/kr/library/au-ctools1_boost/
끝
xUnitTestPattern/chapter7

xUnitTestPattern/chapter7

  • 1.
    xUnit 테스트 패턴 7장 xUnit기초 ohyecloudyhttp://ohyecloudy.com 아꿈사http://cafe.naver.com/architect1.cafe 2010.07.31
  • 2.
    xUnit? 최소한 알아야 할것 테스트 정의 픽스처fixture? 스위트suite 정의 테스트 실행, 결과 xUnit 내부 테스트 명령 테스트 스위트 객체 젃차적 세상에서의 xUnit
  • 3.
    테스트 자동 프레임워크 다음 요구사항 4개를 만족
  • 4.
    1. 테스트를 테스트메소드로 명시 TEST(FactorialTest, Negative) { EXPECT_EQ(1, Factorial(-5)); EXPECT_EQ(1, Factorial(-1)); EXPECT_TRUE(Factorial(-10) > 0); }
  • 5.
    2. 단언 메소드assertmethod로 기대 값 명시 TEST(FactorialTest, Negative) { EXPECT_EQ(1, Factorial(-5)); EXPECT_EQ(1, Factorial(-1)); EXPECT_TRUE(Factorial(-10) > 0); } 기대 값 실제 계산된 값
  • 6.
    3. 테스트 스위트에모아두기 BOOST_AUTO_TEST_SUITE (stringtest) BOOST_AUTO_TEST_CASE (test1) { mystring s; stringtest 스위트를 BOOST_CHECK(s.size() == 0); 실행하면 } test1, test2 테스트 케이스 BOOST_AUTO_TEST_CASE (test2) 실행. { mystring s; s.setbuffer("hello world"); BOOST_REQUIRE_EQUAL ('h', s[0]); } BOOST_AUTO_TEST_SUITE_END ()
  • 7.
    4. 테스트 결과보고 받기 int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
  • 8.
    즉, 테스트 메소드를 사용해 테스트를정의하고 단언 메소드를 기대 값을 정하며 테스트 스위트를 지원하고 테스트 결과를 보고 받을 수 있는 테스트 자동 프레임워크를 xUnit이라 한다.
  • 9.
    xUnit? 최소한 알아야 할것 테스트 정의 픽스처fixture? 스위트suite 정의 테스트 실행, 결과 xUnit 내부 테스트 명령 테스트 스위트 객체 젃차적 세상에서의 xUnit
  • 10.
    struct F { F() : i( 0 ) { BOOST_TEST_MESSAGE( "setup fixture" ); } ~F() { BOOST_TEST_MESSAGE( "teardown fixture" ); } int i; }; BOOST_FIXTURE_TEST_CASE( test_case1, F ) { BOOST_CHECK( i == 1 ); ++i; } BOOST_FIXTURE_TEST_CASE( test_case2, F ) { BOOST_CHECK_EQUAL( i, 1 ); } 이 소스코드를 예로 들어 설명 테스트 픽스처 설치 SUT 실행 단언 메소드 호출 테스트 픽스처 해체
  • 11.
    struct F { F() : i( 0 ) { BOOST_TEST_MESSAGE( "setup fixture" ); } ~F() { BOOST_TEST_MESSAGE( "teardown fixture" ); } int i; }; BOOST_FIXTURE_TEST_CASE( test_case1, F ) { BOOST_CHECK( i == 1 ); ++i; } BOOST_FIXTURE_TEST_CASE( test_case2, F ) { BOOST_CHECK_EQUAL( i, 1 ); } 테스트 픽스처 설치 인라인 설치 In-line Setup 위임 설치 Delegated Setup 암묵적 설치 Implicit Setup
  • 12.
    struct F { F() : i( 0 ) { BOOST_TEST_MESSAGE( "setup fixture" ); } ~F() { BOOST_TEST_MESSAGE( "teardown fixture" ); } int i; }; BOOST_FIXTURE_TEST_CASE( test_case1, F ) { BOOST_CHECK( i == 1 ); ++i; } BOOST_FIXTURE_TEST_CASE( test_case2, F ) { BOOST_CHECK_EQUAL( i, 1 ); } SUT 실행
  • 13.
    struct F { F() : i( 0 ) { BOOST_TEST_MESSAGE( "setup fixture" ); } ~F() { BOOST_TEST_MESSAGE( "teardown fixture" ); } int i; }; BOOST_FIXTURE_TEST_CASE( test_case1, F ) { BOOST_CHECK( i == 1 ); ++i; } BOOST_FIXTURE_TEST_CASE( test_case2, F ) { BOOST_CHECK_EQUAL( i, 1 ); } 테스트 픽스처 해체 가비지 컬렉션 해체 Garbage-Collected Teardown 인라인 해체 In-line Teardown 암묵적 해체 Implicit Teardown 자동 해체 Automated Teardown
  • 14.
    xUnit? 최소한 알아야 할것 테스트 정의 픽스처fixture? 스위트suite 정의 테스트 실행, 결과 xUnit 내부 테스트 명령 테스트 스위트 객체 젃차적 세상에서의 xUnit
  • 15.
    SUT를 실행하기 위해준비해야 하는 모든 것 설치, 해체를 책임진다. class FooTest : public ::testing::Test { protected: virtual void SetUp() { ... } virtual void TearDown() { ... } }; TEST_F(FooTest, Test1) { ... } TEST_F(FooTest, Test2) { ... }
  • 16.
    xUnit? 최소한 알아야 할것 테스트 정의 픽스처fixture? 스위트suite 정의 테스트 실행, 결과 xUnit 내부 테스트 명령 테스트 스위트 객체 젃차적 세상에서의 xUnit
  • 17.
    테스트 스위트 테스트케이스 또는 테스트 스위트 컨테이너
  • 18.
    xUnit? 최소한 알아야 할것 테스트 정의 픽스처fixture? 스위트suite 정의 테스트 실행, 결과 xUnit 내부 테스트 명령 테스트 스위트 객체 젃차적 세상에서의 xUnit
  • 20.
    xUnit? 최소한 알아야 할것 테스트 정의 픽스처fixture? 스위트suite 정의 테스트 실행, 결과 xUnit 내부 테스트 명령 테스트 스위트 객체 젃차적 세상에서의 xUnit
  • 21.
    테스트 실행기에서 테스트메소드를 실행. 각자 실행 함수가 다르다면? 동일한 인터페이스로 테스트 메소드를 실행. Command 패턴 동일한 인터페이스로 실행 ‘무엇을 어떻게’를 숨긴다
  • 22.
    TEST(VectorTest, Clear) { // 어쩌고 저쩌고.. } class VectorTest_Clear_Test : public ::testing::Test { ... private: virtual void TestBody() { // 어쩌고 저쩌고.. }
  • 23.
    xUnit? 최소한 알아야 할것 테스트 정의 픽스처fixture? 스위트suite 정의 테스트 실행, 결과 xUnit 내부 테스트 명령 테스트 스위트 객체 젃차적 세상에서의 xUnit
  • 24.
    테스트 스위트에는 테스트케이스가 있을 수도 테스트 스위트가 있을 수도 Composite 패턴 같은 방식으로 취급 컨테이너와 원소
  • 25.
    xUnit? 최소한 알아야 할것 테스트 정의 픽스처fixture? 스위트suite 정의 테스트 실행, 결과 xUnit 내부 테스트 명령 테스트 스위트 객체 젃차적 세상에서의 xUnit
  • 26.
    젂역 프로시저인 테스트메소드 테스트 스위트 프로시저 테스트 메소드들의 배열을 인자로 더 자세한 내용은 Working Effectively with Legacy Code : Chapter 19 참고
  • 27.
    reference • google test – http://code.google.com/p/googletest/ • boost – http://www.boost.org/ • 오픈 소스 C/C++ 유닛 테스트 도구, Part 1 – http://www.ibm.com/developerworks/kr/library/au-ctools1_boost/
  • 28.