CppUnit:运行一个测试用例

时间:2011-12-13 00:07:24

标签: cppunit

http://cppunit.sourceforge.net/doc/lastest/cppunit_cookbook.html

他们提供了一个简单的TestCase,但没有说明如何运行它(没有main函数)。我查看了他们的文档,但无法找到如何运行测试并获得有关是否成功的文本输出。我不想把一个夹具或使用注册表或任何东西。

如何运行该单个测试用例? I.E.什么是main函数会与之相关?

3 个答案:

答案 0 :(得分:2)

我认为你要求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方法调用MTest文件中的CppUnit辅助宏提供的方法。因此,它们应该连接在一起,例如g++ MTest.o Main.o ../../src/cppunit/.libs/libcppunit.a

答案 1 :(得分:0)

所有测试类的基类都是CppUnit::TestFixture,您可以覆盖某些函数,例如setUptearDown来初始化测试对象并删除它们。

考虑你有一个名为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 &registry = 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方法将获取您使用framwork注册的所有测试类,并执行使用CPPUNIT_TEST注册的那些类的所有方法或任何其他适当的宏。

答案 2 :(得分:0)

您所引用的页面描述了整个过程,包括如何在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 &registry = CppUnit::TestFactoryRegistry::getRegistry();
  runner.addTest( registry.makeTest() );
  bool wasSuccessful = runner.run( "", false );
  return wasSuccessful;
}

基础设施很简单,真的。您创建一个测试运行器,然后检索已注册测试的列表,将它们添加到运行器,让运行器运行测试,并向您报告。但是,是的,最好是让事情变得简单。人们不想做艰难的事情。