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;

}

所以基本上有两种解决方案供您使用。

  1. Link 将所有内容放在一起并使用 CPPUNIT_TEST_SUITE_REGISTRATION 注册您的测试套件并开心。这需要将测试代码和您的 AllTest.cpp link 编辑在一起。

  2. 在 运行 时间内动态加载您的测试并使用 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