CppUnit - 注册多个套件以在单个主要功能中运行
CppUnit - Registry multiple suites to be runned in a single main function
我开始使用 CppUnit 进行 C++ 单元测试。我试图实现的目标是 运行 我所有的测试套件都在一个主文件(和函数)上。让我解释一下:
假设我们有两个 classes 测试我设计的两个 C++ classes:
#ifndef FIRSTCLASSTEST_H
#define FIRSTCLASSTEST_H
class FirstClassTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE( FirstClassTest );
CPPUNIT_TEST( testConstructor );
CPPUNIT_TEST_SUITE_END();
public:
void setUp(void);
void tearDown(void);
protected:
void testConstructor(void);
};
#endif
让另一个class相似:
#ifndef SECONDCLASSTEST_H
#define SECONDCLASSTEST_H
class SecondClassTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE( SecondClassTest );
CPPUNIT_TEST( testConstructor );
CPPUNIT_TEST_SUITE_END();
public:
void setUp(void);
void tearDown(void);
protected:
void testConstructor(void);
};
#endif
cpp 文件类似于:
#include "FirstClassTest.h"
CPPUNIT_REGISTRY_ADD_TO_DEFAULT( FirstClassTest );
void FirstClassTest::setUp(){
//setup...
}
void FirstClassTest::tearDown(){
//teardown...
}
void FirstClassTest::testConstructor(){
//some asserts
}
在这些文件(单独工作正常)之后,我想为 运行 我所有注册的套件创建一个唯一的文件。假设我的主要测试 运行ner 是 AllTest.cpp:
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/TestRunner.h>
#include <cppunit/CompilerOutputter.h>
#include <cppunit/extensions/HelperMacros.h>
//Include Test classes here
#include "FirstClassTest.cpp"
#include "SecondClassTest.cpp"
int main()
{
// informs test-listener about testresults
CPPUNIT_NS::TestResult testresult;
// register listener for collecting the test-results
CPPUNIT_NS::TestResultCollector collectedresults;
testresult.addListener (&collectedresults);
// register listener for per-test progress output
CPPUNIT_NS::BriefTestProgressListener progress;
testresult.addListener (&progress);
// insert test-suite at test-runner by registry
CPPUNIT_NS::TestRunner testrunner;
testrunner.addTest (CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest ());
testrunner.run(testresult);
// output results in compiler-format
CPPUNIT_NS::CompilerOutputter compileroutputter(&collectedresults, std::cerr);
compileroutputter.write ();
// return 0 if tests were successful
return collectedresults.wasSuccessful() ? 0 : 1;
}
但这不起作用。我怎样才能达到预期的行为?我检查了文档:http://cppunit.sourceforge.net/doc/cvs/class_auto_register_suite.html 但没有成功。
我怀疑主要问题出在 AllTests.cpp 并且我没有将套件正确添加到注册表或 testRunner。
如有任何帮助,我们将不胜感激。
干杯。
解决方案编辑: 最后,感谢 examples 和@moggi 提供的建议,我已经能够解决我的问题。我已经从我的 cpp 文件中删除了任何 CPP_UNIT_SUITE_REGISTRATION
并且我已经将 AllTest.cpp 主函数修改为如下所示:
int main()
{
// informs test-listener about testresults
CPPUNIT_NS::TestResult testresult;
// register listener for collecting the test-results
CPPUNIT_NS::TestResultCollector collectedresults;
testresult.addListener (&collectedresults);
// register listener for per-test progress output
CPPUNIT_NS::BriefTestProgressListener progress;
testresult.addListener (&progress);
// insert test-suite at test-runner by registry
CPPUNIT_NS::TestRunner testrunner;
// MODIFIED PART, TEST SUITES ADDED MANUALLY
testrunner.addTest( FirstClassTest::suite() );
testrunner.addTest( SecondClassTest::suite() );
testrunner.run(testresult);
// output results in compiler-format
CPPUNIT_NS::CompilerOutputter compileroutputter(&collectedresults, std::cerr);
compileroutputter.write ();
// return 0 if tests were successful
return collectedresults.wasSuccessful() ? 0 : 1;
}
所以基本上有两种解决方案供您使用。
Link 将所有内容放在一起并使用 CPPUNIT_TEST_SUITE_REGISTRATION
注册您的测试套件并开心。这需要将测试代码和您的 AllTest.cpp link 编辑在一起。
在 运行 时间内动态加载您的测试并使用 CPPUNIT_PLUGIN_IMPLEMENT
并注册 CPPUNIT_TEST_SUITE_REGISTRATION
。
第一种方法的优点是简单,不用太担心。当然,这种简单性是有代价的,如果你想使用 AllTest.cpp 中的代码进行几个不在单独 binaries/libraries 中的独立测试,你需要 link AllTest.cpp 到他们都。有关 CPPUNIT_TEST_SUITE_REGISTRATION 的更多信息,请访问 the Creating TestSuite page in the documentation
要在您的代码中实施此方法,请为每个测试套件将以下内容添加到您的 cpp 文件中:
CPPUNIT_TEST_SUITE_REGISTRATION(FirstClassTest);
显然将 FirstClassTest 替换为您在 CPPUNIT_TEST_SUITE
中使用的测试套件名称。
第二种方法有点复杂,但允许有一个测试二进制文件并在 运行 时间内使用测试代码动态加载库。这允许例如构建几个独立的测试,这些测试可以 运行 与共享的测试 运行 并行。有关此方法的更多信息,请访问 the cppunit documentation for the PluginIn approach
我开始使用 CppUnit 进行 C++ 单元测试。我试图实现的目标是 运行 我所有的测试套件都在一个主文件(和函数)上。让我解释一下:
假设我们有两个 classes 测试我设计的两个 C++ classes:
#ifndef FIRSTCLASSTEST_H
#define FIRSTCLASSTEST_H
class FirstClassTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE( FirstClassTest );
CPPUNIT_TEST( testConstructor );
CPPUNIT_TEST_SUITE_END();
public:
void setUp(void);
void tearDown(void);
protected:
void testConstructor(void);
};
#endif
让另一个class相似:
#ifndef SECONDCLASSTEST_H
#define SECONDCLASSTEST_H
class SecondClassTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE( SecondClassTest );
CPPUNIT_TEST( testConstructor );
CPPUNIT_TEST_SUITE_END();
public:
void setUp(void);
void tearDown(void);
protected:
void testConstructor(void);
};
#endif
cpp 文件类似于:
#include "FirstClassTest.h"
CPPUNIT_REGISTRY_ADD_TO_DEFAULT( FirstClassTest );
void FirstClassTest::setUp(){
//setup...
}
void FirstClassTest::tearDown(){
//teardown...
}
void FirstClassTest::testConstructor(){
//some asserts
}
在这些文件(单独工作正常)之后,我想为 运行 我所有注册的套件创建一个唯一的文件。假设我的主要测试 运行ner 是 AllTest.cpp:
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/TestRunner.h>
#include <cppunit/CompilerOutputter.h>
#include <cppunit/extensions/HelperMacros.h>
//Include Test classes here
#include "FirstClassTest.cpp"
#include "SecondClassTest.cpp"
int main()
{
// informs test-listener about testresults
CPPUNIT_NS::TestResult testresult;
// register listener for collecting the test-results
CPPUNIT_NS::TestResultCollector collectedresults;
testresult.addListener (&collectedresults);
// register listener for per-test progress output
CPPUNIT_NS::BriefTestProgressListener progress;
testresult.addListener (&progress);
// insert test-suite at test-runner by registry
CPPUNIT_NS::TestRunner testrunner;
testrunner.addTest (CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest ());
testrunner.run(testresult);
// output results in compiler-format
CPPUNIT_NS::CompilerOutputter compileroutputter(&collectedresults, std::cerr);
compileroutputter.write ();
// return 0 if tests were successful
return collectedresults.wasSuccessful() ? 0 : 1;
}
但这不起作用。我怎样才能达到预期的行为?我检查了文档:http://cppunit.sourceforge.net/doc/cvs/class_auto_register_suite.html 但没有成功。
我怀疑主要问题出在 AllTests.cpp 并且我没有将套件正确添加到注册表或 testRunner。
如有任何帮助,我们将不胜感激。 干杯。
解决方案编辑: 最后,感谢 examples 和@moggi 提供的建议,我已经能够解决我的问题。我已经从我的 cpp 文件中删除了任何 CPP_UNIT_SUITE_REGISTRATION
并且我已经将 AllTest.cpp 主函数修改为如下所示:
int main()
{
// informs test-listener about testresults
CPPUNIT_NS::TestResult testresult;
// register listener for collecting the test-results
CPPUNIT_NS::TestResultCollector collectedresults;
testresult.addListener (&collectedresults);
// register listener for per-test progress output
CPPUNIT_NS::BriefTestProgressListener progress;
testresult.addListener (&progress);
// insert test-suite at test-runner by registry
CPPUNIT_NS::TestRunner testrunner;
// MODIFIED PART, TEST SUITES ADDED MANUALLY
testrunner.addTest( FirstClassTest::suite() );
testrunner.addTest( SecondClassTest::suite() );
testrunner.run(testresult);
// output results in compiler-format
CPPUNIT_NS::CompilerOutputter compileroutputter(&collectedresults, std::cerr);
compileroutputter.write ();
// return 0 if tests were successful
return collectedresults.wasSuccessful() ? 0 : 1;
}
所以基本上有两种解决方案供您使用。
Link 将所有内容放在一起并使用
CPPUNIT_TEST_SUITE_REGISTRATION
注册您的测试套件并开心。这需要将测试代码和您的 AllTest.cpp link 编辑在一起。在 运行 时间内动态加载您的测试并使用
CPPUNIT_PLUGIN_IMPLEMENT
并注册CPPUNIT_TEST_SUITE_REGISTRATION
。
第一种方法的优点是简单,不用太担心。当然,这种简单性是有代价的,如果你想使用 AllTest.cpp 中的代码进行几个不在单独 binaries/libraries 中的独立测试,你需要 link AllTest.cpp 到他们都。有关 CPPUNIT_TEST_SUITE_REGISTRATION 的更多信息,请访问 the Creating TestSuite page in the documentation
要在您的代码中实施此方法,请为每个测试套件将以下内容添加到您的 cpp 文件中:
CPPUNIT_TEST_SUITE_REGISTRATION(FirstClassTest);
显然将 FirstClassTest 替换为您在 CPPUNIT_TEST_SUITE
中使用的测试套件名称。
第二种方法有点复杂,但允许有一个测试二进制文件并在 运行 时间内使用测试代码动态加载库。这允许例如构建几个独立的测试,这些测试可以 运行 与共享的测试 运行 并行。有关此方法的更多信息,请访问 the cppunit documentation for the PluginIn approach