2012-02-05 3 views
2

UnitTest ++ 테스트 클래스가있어서 클래스가 일부 문자열을 올바르게 파싱하는지 테스트 할 수 있습니다. 테스트를 실행하기 전에 여러 함수가 루프에서 테스트 할 여러 문자열을 포함하는 조명기를 만듭니다. 그것은 잘 작동하는 것,하지만 문제는, 오류의 경우 UnitTest ++ 항상 내게 같은 오류 줄을 줄 것이다, 그래서 어떤 문자열이 정확하게 문제를 일으키는 지 알 수 없습니다. 예를 들어UnitTest ++에 커스텀 실패 메시지를 표시 하시겠습니까?

, 그것은 출력 :

"[UnitTest++] ..\trunk\tests\Test_ChineseUtil.cpp(46): error: Failure in ParsePinyinT: ChineseUtil::parsePinyinT(pinyinT) == pinyinN" 

그러나이 올바르게 구문 분석되지 않은 문자열을 말하지 않습니다.

그래서 내가하고 싶은 것은 테스트가 실패 할 때 (어떤 경우에, 나는 그 배열의 첫번째 항목을 줄 것이다) 몇 가지 커스텀 에러 메시지를 설정하는 것이다. 기본적으로 다음과 같은 것이 필요합니다 :

CHECK(theTest, "my error message") 

UnitTest ++에는 이러한 기능이 있습니까? 아니면 내가하려는 일을하는 더 좋은 방법이 있을까요? 자세한 내용은

, 여기 내 클래스의 코드입니다 : 클래스가 평등 연산자를 가지고

#include <third_party/unittest++/UnitTest++.h> 

#include <Application.h> 
#include <ChineseUtil.h> 

using namespace hanzi; 

namespace chineseUtilTests { 

class PinyinFixture { 

public: 

    PinyinFixture() { 
     ChineseUtil::initialize(); 

     testData << "third tone" << QString::fromUtf8("wo3") << QString::fromUtf8("wǒ"); 
     testData << "no tone" << QString::fromUtf8("wo") << QString::fromUtf8("wo"); 
     testData << "second tone" << QString::fromUtf8("guo2") << QString::fromUtf8("guó"); 
     testData << "first tone" << QString::fromUtf8("jia1") << QString::fromUtf8("jiā"); 
     testData << "fifth tone" << QString::fromUtf8("jia5") << QString::fromUtf8("jia"); 
     testData << "two dots" << QString::fromUtf8("nu:") << QString::fromUtf8("nü"); 
     testData << "two dots and tone" << QString::fromUtf8("nu:3") << QString::fromUtf8("nǚ"); 
    } 

    ~PinyinFixture() { 

    } 

    QStringList testData; 

}; 

TEST_FIXTURE(PinyinFixture, ParsePinyinN) { 
    for (int i = 0; i < testData.size(); i++) { 
     QString pinyinN = testData[i][1]; 
     QString pinyinT = testData[i][2]; 
     CHECK(ChineseUtil::parsePinyinN(pinyinN) == pinyinT); 
    } 
} 

TEST_FIXTURE(PinyinFixture, ParsePinyinT) { 
    for (int i = 0; i < testData.size(); i++) { 
     QString pinyinN = testData[i][1]; 
     QString pinyinT = testData[i][2]; 
     CHECK(ChineseUtil::parsePinyinT(pinyinT) == pinyinN); 
    } 
} 

} // chineseUtilTests 

답변

1

경우 입력하는 대신, 할 수 있어야

CHECK(something == something_else); 

사용

CHECK_EQUAL(something, something_else); 

클래스에서 ==을 허용한다는 사실은 당신이 할 수있는 일이되도록합니다. 테스트가 실패하면 "예상 된 것이 있지만 다른 것을 얻었습니다"라는 라인을 따라 뭔가를 얻어야합니다.

자세한 정보가 필요하면 할 수있는 다른 몇 가지 사항이 있습니다.

하나는 테스트에 사용자 지정 출력을 추가하는 것입니다. i의 값을 구체적으로 알아야 할 경우 CHECK 앞에 i이라는 출력을 추가 할 수 있습니다. 그러나이 출력은 큰 루프의 경우 너무 길어서 수표를 두 번 추가 할 수 있습니다.

CHECK(ChineseUtil::parsePinyinN(pinyinN) == pinyinT); 
if (ChineseUtil::parsePinyinN(pinyinN) != pinyinT) 
{ 
    cout << "Your own custom message " << i << endl; 
} 

또 다른 가능성은 UnitTest ++ 자체의 소스 코드를 수정 한 다음 라이브러리를 다시 컴파일하는 것입니다. 원하는 작업을 수행하기위한 정확한 단계를 알 수는 없지만 UnitTest++/src/Checks.h을 수정하여 CHECK_ARRAY2D_CLOSE의 출력을 향상시켜보다 읽기 쉬워졌습니다.

1

다음을 컴파일하거나 테스트하지는 못했지만 UnitTest ++ CHECK 매크로를 복사하여 std :: string이라는 메시지 매개 변수를 가져 와서 문자열 화 된 버전을 나타내는 문자열과 결합하십시오. 값.

#define CHECK_MESSAGE(value, message) \ 
    do \ 
    { \ 
     try { \ 
      if (!UnitTest::Check(value)) \ 
       UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), (std::string(#value)+message).c_str()); \ 
     } \ 
     catch (...) { \ 
      UnitTest::CurrentTest::Results()->OnTestFailure(UnitTest::TestDetails(*UnitTest::CurrentTest::Details(), __LINE__), \ 
        (std::string("Unhandled exception in CHECK(" #value)+message+std::string(", ")+message+std::string(")")).c_str()); \ 
     } \ 
    } while (0) 
관련 문제