Отображение пользовательского сообщения об ошибке в UnitTest ++? - PullRequest
2 голосов
/ 05 февраля 2012

У меня есть тестовый класс 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

Ответы [ 2 ]

1 голос
/ 12 ноября 2012

Я не скомпилировал и не протестировал следующее, но суть его в том, чтобы скопировать макрос 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)
1 голос
/ 03 марта 2012

Если в вашем классе есть оператор равенства, вы можете вместо

CHECK(something == something_else);

использовать

CHECK_EQUAL( something, something_else);

Тот факт, что ваши классы допускают ==, делаетЯ, что вы можете сделать это.Если тест не пройден, вы должны получить что-то вроде «Ожидается что-то, но есть что-то другое».

Если вам нужна дополнительная информация, вы можете сделать еще пару вещей.

Один из них - добавить свой собственный вывод в тест.Если вам необходимо знать значение i, вы можете добавить распечатку i перед каждым CHECK.Однако этот вывод может быть слишком длинным для больших циклов, поэтому вы можете добавить свою проверку еще раз.

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, чтобы он был более читабельным.

...