2016-08-31 11 views
6

NDAに違反する可能性のあるコード共有を可能な限り多くの人に適用できるだけの純粋な最小限の例にしようと考えています。これは大丈夫ですね!CppUTestユニットテストフレームワーク複数定義例外

Gitlab Continuous Integrationソフトウェアと組み合わせてCppUTestとCppUMock(gcc/g ++でコンパイルし、makefileで作成したもの)を使用して、今後のコミットとソフトウェアのリリース用の単体テスト環境を作成しています。しかし、私は少し問題に遭遇しました。のは、私は次のフォルダを設定しているとしましょう(私は/テストフォルダの内容以外に変更する最小限の能力を、持っていること):

+-- src 
    +-- driver1.c 
    +-- driver2.c 
+-- inc 
    +-- driver1.h 
    +-- driver2.h 
+-- tests 
    +-- test_driver1.cpp 
    +-- test_driver2.cpp 
    +-- main.cpp 
    +-- cmakelists.txt 

CMakeListsファイルがINCフォルダを含む含まれています、SRCのコンパイルフォルダ、およびtestsフォルダのコンパイルが含まれます。しかし、driver2.cがdriver1.cによって定義されたメソッドに依存しているとします。これは、正常にドライバ2のメソッドの呼び出しの結果をテストすることができるので、モック設定がない場合は正常です。しかし、driver2のmethod1を正しく呼び出すことができるように、driver1のmethod1関数をモックしたいとします(CppUMockを使用)。

void method1(int n) { 
    mock().actualCall("method1").withParameter("n", n); 
} 

は、リンカエラーなどでdriver1.cに実際の法1との衝突が発生します。test_driver2.cppファイルになるようDRIVER1はコンパイルが、のようなものを追加されていなかった場合、これは通常、大丈夫だと思いますそう:

driver1.c includes driver1.h (obviously) 
driver2.c includes driver2.h (obviously) 
driver2.h includes driver1.h (for calling method1) 
test cpp files include their respective .h files 
(test_driver1.cpp -> driver1.h and test_driver2.cpp -> driver2.h) 

method1にはdriver1.hで宣言され、driver1.cで定義されます。ここで

コメント投稿者の要求ごととして
CMakeFiles/Tests.dir/.../src/driver1.c:(.text+0x11d): multiple definition of 'method1' 
CMakeFiles/Tests.dir/.../src/test_driver2.cpp:(.text+0x0): first defined here 

には、構造がどのようなものであるかであります私はこれらのファイルを編集できません。

リクエストに応じて詳細を追加できます。

この問題を回避するにはどうすればよいでしょうか?

+0

method1を定義する部分と、さまざまなヘッダーをソースにどのように含めるかを(少なくとも抜粋して)表示する必要があります。 – TemplateRex

+0

@TemplateRex added includes。 method1は、driver1.hファイルの宣言を含む、driver1.cファイル内の古いメソッドです。 – Jeffrey

+0

driver2.cppに別の 'method1()'を追加してdriver2.cppと一緒にテストドライバにリンクすることはできません。あなたが馬鹿にしたいのであれば、CMakeにtest1driver2.cppの依存関係としてdriver1.cppをコンパイルしないように伝えてください。 – TemplateRex

答えて

3

あなたは自分のCMakeLists.txtで、その後別のmock_driver1.cppに嘲笑定義を追加して、driver1.hからmethod1を模擬する場合:

add_executable(target1 test_driver1.cpp driver1.cpp) 
add_executable(target2 test_driver2.cpp driver2.cpp mock_driver1.cpp) 

あなたがあざける完了したら、とmock_driver1.cpp依存関係を置き換えますdriver1.cpp

このすべては、テストドライバごとに個別の実行可能ファイルがあることを前提としています。

ただし、すべてのドライバがリンクされている1つの大きなメインプログラムを用意したい場合は、method1の実物と模擬のmethod1を一緒に共存させることはできません。そのためには、などの名前空間に嘲笑されたmethod1をラップし、test_driver2.cppでmock::test1とだけ呼び出すことをおすすめします。

+0

ありがとう!私はPythonビルドスクリプトの機能を追加して、tests.exeの代わりにディレクトリ内のすべての実行可能ファイルを実行するだけで、2501のような複数のビルドを作成することができます。この変更を取得できる場合、+1と返事が返されます。 – Jeffrey

+0

+1素晴らしい作品です!私が見逃していたことは、テストごとに複数のコンパイル単位を持つだけで、すべてを1つにまとめることよりもはるかに簡単でした。 – Jeffrey

+0

@Jeffreyが助けになったことは素晴らしい – TemplateRex

関連する問題