CppUnit - 注册多个套件,可在单个主函数中运行

时间:2016-12-06 13:03:26

标签: c++ cppunit

我开始使用CppUnit进行C ++单元测试。我想要实现的目标是在一个主文件(和函数)上运行我的所有测试套件。让我解释一下:

假设我们有两个类测试我设计的两个C ++类:

#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

让其他班级相似:

#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
}

在这些文件(单独正常工作)之后,我想创建一个唯一的文件来运行我所有注册的套件。假设我的主要测试运行者是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。

任何帮助将不胜感激。 欢呼声。

解决方案编辑:最后,感谢@ {moggi提供的examples和建议,我已经能够解决我的问题了。我从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;

}

1 个答案:

答案 0 :(得分:2)

因此,您基本上使用了两种解决方案。

  1. 将所有内容链接在一起并使用CPPUNIT_TEST_SUITE_REGISTRATION注册您的测试套件并感到高兴。这需要将测试代码和AllTest.cpp链接在一起。

  2. 在运行时动态加载测试并使用CPPUNIT_PLUGIN_IMPLEMENT并注册CPPUNIT_TEST_SUITE_REGISTRATION

  3. 第一种方法的优点是它很简单,你不必太担心。当然,这种简单性带来的代价是,如果你想使用AllTest.cpp中的代码进行几个不在单独的二进制文件/库中的独立测试,你需要将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