在http://cppunit.sourceforge.net/doc/lastest/cppunit_cookbook.html
他们提供了一个简单的 TestCase 但没有展示如何运行它(没有main
功能)。我查看了他们的文档,但找不到如何运行测试并获取有关它是否成功的文本输出。我不想组装一个固定装置或使用注册表或任何东西。
如何运行单个测试用例?IEmain
附带的功能是什么?
在http://cppunit.sourceforge.net/doc/lastest/cppunit_cookbook.html
他们提供了一个简单的 TestCase 但没有展示如何运行它(没有main
功能)。我查看了他们的文档,但找不到如何运行测试并获取有关它是否成功的文本输出。我不想组装一个固定装置或使用注册表或任何东西。
如何运行单个测试用例?IEmain
附带的功能是什么?
我猜你要的是 CppUnit 的 SSCCE。由于 CppUnit 是一个框架,所以一个最小的例子必须放置最小的测试结构——比如一个 TestFixture,否则一个人可以不用整个 CppUnit 而只使用std::assert
. 所有这些都可以在一个文件中完成,例如Main.cpp
以下形式:
//Declaration file: MTest.h
#ifndef MTEST_H
#define MTEST_H
#include <cppunit/extensions/HelperMacros.h>
class MTest : public CPPUNIT_NS::TestFixture
{
CPPUNIT_TEST_SUITE(MTest);
CPPUNIT_TEST(simpleTest);
CPPUNIT_TEST_SUITE_END();
public:
void simpleTest();
};
#endif // MTEST_H
//////////////////////////////////////
// Implementation file, e.g. MTest.cpp
#include <cppunit/config/SourcePrefix.h>
//#include "MTest.h"
// Registers the fixture into the 'registry'
CPPUNIT_TEST_SUITE_REGISTRATION(MTest);
// Some code to be tested.
void MTest::simpleTest() {
CPPUNIT_ASSERT_EQUAL(1, 2);
}
/////////////////////////////////////
// Main file, Main.cpp
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
int main(int argc, char* argv[])
{
CPPUNIT_NS::TextUi::TestRunner runner; //the runner
// Get the top level suite from the registry
CPPUNIT_NS::Test* suite =
CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest();
// Adds the test to the list of test to run
runner.addTest(suite);
// Run the test.
bool wasSucessful = runner.run();
// Return error code 1 if the one of test failed.
return wasSucessful ? 0 : 1;
}
这将需要与cppunit
库进行编译/链接,例如g++ Main.cpp ../../src/cppunit/.libs/libcppunit.a
(如果您碰巧在库的主目录下启动 2 个级别 [libcppunit
根据您的环境的需要插入库的静态或动态版本])。
“更干净”的示例会将代码拆分为单独的MTest
(.h
和.cpp
,如所示) 和Main.cpp
. 在这种情况下,来自文件Main.cpp
中 CppUnit 辅助宏提供的调用方法的CppUnit 方法MTest
。因此,它们应该连接在一起,例如通过g++ MTest.o Main.o ../../src/cppunit/.libs/libcppunit.a
。
您所指的页面描述了整个过程,包括很多关于如何在 TestFixtures 中手动编写代码、如何在 TestSuites 中注册这些代码以及如何使用宏编写代码的额外内容并注册它们,它非常罗嗦。有时向人们展示一个简单的例子会更好。他们在页面的最底部有这个:
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
int main( int argc, char **argv)
{
CppUnit::TextUi::TestRunner runner;
CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry();
runner.addTest( registry.makeTest() );
bool wasSuccessful = runner.run( "", false );
return wasSuccessful;
}
基础设施非常简单,真的。您创建一个测试运行程序,然后检索已注册测试的列表,将它们添加到运行程序,让运行程序运行测试,然后向您报告。但是,是的,让事情变得简单总是最好的。人们不想做艰难的事情。
所有测试类的基类是CppUnit::TestFixture
,您可以重写一些函数setUp
,例如tearDown
初始化测试对象并删除它们。
假设您有一个名为 的测试类MyFirstTest
,要使用 Cpp 框架注册测试函数,您必须执行以下操作:
CPPUNIT_TEST_SUITE(MyFirstTest);
CPPUNIT_TEST(myTestFunction);
... //any other function you want to register with appropriate macros
CPPUNIT_TEST_SUITE_END();
您还必须注册每个测试类(在它们各自的头文件或 cpp 文件中)
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(MyFirstTest, "YouTestName");
一旦你的测试类设置好了,你就可以运行它了。主要功能将如下所示:
bool wasSuccessful = false;
try
{
CppUnit::TextUi::TestRunner runner;
runner.setOutputter( new CppUnit::CompilerOutputter(&runner.result(), std::cerr));
CppUnit::TestFactoryRegistry ®istry = CppUnit::TestFactoryRegistry::getRegistry("YouTestName");
runner.addTest(registry.makeTest());
wasSuccessful = runner.run("", false);
}
catch(const std::exception& e)
{
std::cerr << e.what() << std::endl;
wasSuccessful = false;
}
如果您希望添加更多测试类,主要功能将保持不变。您只需创建测试类(从该类派生CppUnit::TestFixture
),注册您的方法,重要的步骤是使用CPPUNIT_TEST_SUITE_NAMED_REGISTRATION
. getRegistry
函数中使用的方法将获取您在框架中注册的所有测试类,并执行您使用或任何其他适当宏main
注册的那些类的所有方法。CPPUNIT_TEST