【问题标题】:Displaying custom failure message in UnitTest++?在 UnitTest++ 中显示自定义失败消息?
【发布时间】:2012-02-27 05:38:51
【问题描述】:

我有一个 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

【问题讨论】:

    标签: unit-testing loops fixture unittest++


    【解决方案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 的输出,使其更具可读性。

    【讨论】:

      【解决方案2】:

      我没有编译或测试以下内容,但它的要点是复制 UnitTest++ CHECK 宏并将其展开以获取消息参数 std::string 并将其与表示字符串化版本的字符串结合起来 value .

      #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)
      

      【讨论】:

        猜你喜欢
        • 2011-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多