我想用一组不同的输入和期望的输出对一个函数进行单元测试。以不同的测试运行重复的测试报告
我的功能是不相关的。因此我将改用一个例子功能,其对英语单词与下列候选人实现:
int countEnglishWords(const std::string& text)
{
return 5;
};
下面是一组测试数据。数据的结尾标有一个单词“END”。
struct TestData {
std::string text;
int englishWords;
};
struct TestData data[] = // Mark end with "END"
{
{ "The car is very fast", 5 },
{ "El coche es muy rapido", 0 },
{ "The rain in Spain stays mainly in the plain", 9},
{ "XXXXX OOOOO TTTT", 0},
{ "Yes Si No No", 3},
{ "I have a cheerful live", 5},
{ "END", 0}
};
我可以很容易地编写6个测试用例,我会得到我想要的结果。但这是不可维护的,因为任何进一步的测试添加到测试用例都不会被测试,所以需要编写另一个测试用例,这将只是锅炉板。因此,我写它通过这样的所有测试数据环路一个单独的测试案例:
#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/extensions/HelperMacros.h>
class cppUnit_test: public CppUnit::TestFixture
{
private:
CPPUNIT_TEST_SUITE (cppUnit_test);
CPPUNIT_TEST(myTest);
CPPUNIT_TEST_SUITE_END();
public:
void myTest();
};
void cppUnit_test::myTest()
{
TestData* p = data;
while (p->text != "END")
{
std::stringstream ss;
ss << "Text=\"" << p->text << "\" Counted=" <<
countEnglishWords(p->text) << " Expected=" << p->englishWords;
CPPUNIT_ASSERT_MESSAGE(ss.str().c_str(),
countEnglishWords(p->text) == p->englishWords);
++p;
}
}
int main()
{
CPPUNIT_TEST_SUITE_REGISTRATION (cppUnit_test);
CppUnit::Test *suite =
CppUnit::TestFactoryRegistry::getRegistry().makeTest();
CppUnit::TextUi::TestRunner runner;
runner.addTest(suite);
runner.run();
return 0;
}
的问题是,前面的代码通过第一个测试精细运行,还检测在第二测试,但后错误它停止测试。报告是:
!!!失败!!!
测试结果:
运行:1次失败:1个错误:0
虽然我希望得到的结果是:
!!! FAILURES!
测试结果:
运行:6次失败:4个错误:0
Cppunit 1.14为此功能提供支持。有CPPUNIT_TEST_PARAMETERIZED和TestCaller现在接受任何可以转换为std :: function的可调用函数。两者都可以用来实现所需的行为。 –
moggi