0

私のアプリケーションにいくつかのテストを追加しようとしていますが、これを行う方法と必要なものがわかりません。テスト自体を作成するだけで基本的なテストを実行できましたが、プロジェクトに追加しても実行できません。テスト用に独自のプロジェクトを作成した場合に機能したテストを次に示します。

Test1.h

#pragma once
#include <C:\cppunit-1.12.1\cppunit-1.12.1\include\cppunit\extensions\HelperMacros.h>
class Test1 : public CPPUNIT_NS::TestCase
{
        CPPUNIT_TEST_SUITE(Test1);
        CPPUNIT_TEST(testStringAssert);
        CPPUNIT_TEST_SUITE_END();

public:

    Test1(void);
    ~Test1(void);

    void testStringAssert ();
};

Test1.cpp

#include "Test1.h"
#include "string"

CPPUNIT_TEST_SUITE_REGISTRATION(Test1);

Test1::Test1(void)
{
}

Test1::~Test1(void)
{
}
void Test1::testStringAssert(){
    std::string s1 = "1234567";
    std::string s2 = "1234567";
    CPPUNIT_ASSERT_EQUAL(s1, s2);

}

CPPUnitMain.cpp (CPPUnit のサンプル フォルダーから取得)

#include <cppunit/CompilerOutputter.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/TestRunner.h>
#include <cppunit/TextTestProgressListener.h>
#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/XmlOutputter.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <stdexcept>
#include <fstream>


int 
main( int argc, char* argv[] )
{
  // Retreive test path from command line first argument. Default to "" which resolve
  // to the top level suite.
  std::string testPath = (argc > 1) ? std::string(argv[1]) : std::string("");

  // Create the event manager and test controller
  CPPUNIT_NS::TestResult controller;

  // Add a listener that colllects test result
  CPPUNIT_NS::TestResultCollector result;
  controller.addListener( &result );        

  // Add a listener that print dots as test run.
#ifdef WIN32
  CPPUNIT_NS::TextTestProgressListener progress;
#else
  CPPUNIT_NS::BriefTestProgressListener progress;
#endif
  controller.addListener( &progress );      

  // Add the top suite to the test runner
  CPPUNIT_NS::TestRunner runner;
  runner.addTest( CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest() );   
  try
  {
    CPPUNIT_NS::stdCOut() << "Running "  <<  testPath;
    runner.run( controller, testPath );

    CPPUNIT_NS::stdCOut() << "\n";

    // Print test in a compiler compatible format.
    CPPUNIT_NS::CompilerOutputter outputter( &result, CPPUNIT_NS::stdCOut() );
    outputter.write(); 

// Uncomment this for XML output
    std::ofstream file( "tests.xml" );
    CPPUNIT_NS::XmlOutputter xml( &result, file );
    xml.setStyleSheet( "report.xsl" );
    xml.write();
    file.close();
  }
  catch ( std::invalid_argument &e )  // Test path not resolved
  {
    CPPUNIT_NS::stdCOut()  <<  "\n"  
                            <<  "ERROR: "  <<  e.what()
                            << "\n";
    return 0;
  }

  return result.wasSuccessful() ? 0 : 1;
}
4

1 に答える 1

2

始めるのは少し複雑です。私が使用した最善の方法は、元の実際のプロジェクト (これを RealProject と呼びます) とテスト プロジェクト (これを TestProject と呼びます) という 2 つのプロジェクト間の関係を確立することです。実際のコードは引き続き有効です。 RealProject.vcproj に追加しますが、テスト コードを格納するために 2 番目のプロジェクトを追加する必要があります。

RealProject を含むソリューション ファイルを開きます。ソリューションに新しいプロジェクトを作成し、TestProject という名前を付けます。テスト プロジェクトでは、CppUnit テスト コードとメイン関数を (上記のように) 追加します。今ビルドすると、失敗するはずです。リンクするために必要なプロパティを追加します。TestProject プロパティを開き、Linker/Input 画面で、Additional Dependencies フィールドを編集します。CppUnit から適切な .LIB ファイル (TestRunner.lib など) を追加します。先に進む前に、正しくビルドおよびリンクされた上記のサンプル コードを取得してください。小さなステップで考えてください。

次に、TestProject のプロパティを再度開き、[リンカー/入力] 画面で [追加の依存関係] の値を編集します。このリストに、テストするコードを含む実際のプロジェクトのオブジェクト ファイルを追加します。たとえば、テストしたいいくつかのメソッドを含む Foo.cpp が RealProject にある場合は、$(SolutionDir)RealProject\Debug\obj\Foo.obj を追加します。もちろん、それがオブジェクト ファイルへの正しい相対パスであると仮定しています。リリース、x64 など、ビルドごとにパスが異なる場合があります。最初に 1 つのバージョンを動作させてから、新たに発見した知識を適用して、他のバージョンを適切にビルドします。

ここで、テスト スイート クラスを TestProject (FooTest.cpp と呼びます) に追加して、Foo.cpp モジュールのメソッドをテストします。ビルド、リンク、および実行を確認してください。これで、最初のコードのユニット テストが開始されました。おめでとう!

ソース コードが変更されたときに、おそらくテストを再構築したいと思うでしょう。TestProject プロジェクト フォルダーを右クリックし、[プロジェクトの依存関係] を選択します。RealProject の前にチェックマークを追加します。ここで、TestProject を選択してビルドすると、RealProject が最初にビルドされます。

これを一度行って忘れてしまいたい場合は、次のようにオブジェクト ファイル フォルダー全体をワイルドカード化できます。

$(SolutionDir)RealProject\Debug\obj\*.obj

そうすることで、RealProject に追加するすべてのモジュールで、プロジェクトの設定を変更することなく単体テストを作成できます。

これの利点の 1 つは、実際の実際のコンパイル済みコードを常にテストしていることです。コンパイラを「偽造」したり、テスト目的でソース コードを 2 回コンパイルしたりする必要はありません。これは、ライブ コードの有効なテストです。もう 1 つの利点は、テスト コードを別のプロジェクトに保持することで、ユニット テストを誤って出荷することがなくなることです。それらは、パッケージ化して顧客に提供しない、完全に別のフォルダーにコンパイルされます。

正直なところ、これよりずっと簡単だったらいいのにと思います。これが IDE に組み込まれていて、すべての簿記と参照などを自動的に管理することを望みます。テストを簡単にすることは、開発者が実際にそれを使用する可能性を高めます。

于 2012-01-16T23:25:43.107 に答える