1

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

彼らは簡単な TestCase を提供しますが、それを実行する方法を示していません (main関数はありません)。私は彼らのドキュメントを調べましたが、テストを実行して、成功したかどうかに関するテキスト出力を取得する方法を見つけることができません。フィクスチャをまとめたり、レジストリなどを使用したりしたくありません。

その単一のテスト ケースを実行するにはどうすればよいですか? IEそれに付随するmain機能は何ですか?

4

3 に答える 3

2

CppUnit の SSCCE を求めていたと思います。CppUnit はフレームワークであるため、TestFixture のように、最小の例では最小限のテスト構造を配置する必要があります。そうしないと、CppUnit 全体がなくてもstd::assert. Main.cppこれはすべて、たとえば次の形式の1 つのファイルで実行できます。

//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

于 2012-10-23T13:17:13.760 に答える
0

すべてのテスト クラスの基本クラスはです。 andCppUnit::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_REGISTRATIONgetRegistry関数で使用されるメソッドは、フレームワークに登録したすべてのテスト クラスを取得し、または他の適切なマクロmainを使用して登録したクラスのすべてのメソッドを実行します。CPPUNIT_TEST

于 2011-12-13T00:19:26.093 に答える
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;
}

インフラストラクチャは非常にシンプルです。テスト ランナーを作成し、登録されたテストのリストを取得してランナーに追加し、ランナーにテストを実行させて、レポートを返します。しかし、ええ、物事を簡単にすることが常に最善です。人は難しいことをしたくありません。

于 2012-02-15T22:11:53.807 に答える