7

GoogleTestで関数をテストしようとしています。

すべてが正しく設定されているようで、gtestがなくても正常にビルドおよび実行されます...(コードが少し複雑なので、ここにすべてのソースファイルを一覧表示することはできませんが、gtestを追加しないと、ファイルはリンクされます適切に実行され、正常に実行されます)。

アプリケーションタイプのプロジェクトです。ライブラリの依存関係がいくつかあります...無関係です。

テストプロジェクトは、別のプロジェクトとしてソリューションに追加されます。テストされたプロジェクトが依存関係としてあります。テストプロジェクトの.hファイルはgtestのみを指します....cpp(メインではなく、標準のInitGoogleTestメインです)は、テストされたプロジェクトのヘッダーファイルである独自のヘッダーファイルを追加し、以下に示すテストがあります。 。

アプリケーションであっても、プロジェクトのビルド時に自動的に作成されるTestedProject.libがあります。TestedProject.libをライブラリ依存関係としてTestProject(リンク内)に追加しました。

Class x
{
public:
  x(){}    // I didn't really need this, I only added the class so I have access to 
  ~x(){};  // non-class methods with gtest - but it still doesn't work
  bool myFunction(std::string a, double b, bool c);  
};

実装:

bool x::myFunction(std::string a, double b, bool c)
{
  // implementation
  return false;
}

somewhere_else
{
  x x_instance;
  y = x_instance.myFunction("a", 1, false);   // works, all builds, executes, life is great
}

単体テストを追加します。

class TheTest : public ::testing::Test
{
protected:
    x x_instance;
};

TEST_F(TheTest, Fail)
{
    EXPECT_FALSE(x_instance.myFunction("a", 1, false));     
}

ビルドしません。リンクエラー(上記のサンプルコードのように、名前を簡略化して変更しました。コンテンツを台無しにしないでください)

Error   2   error LNK2019: unresolved external symbol 
"public: bool __thiscall x::myFunction(class std::basic_string<char,struct std::char_traits<char>,double,bool)" 
(?myFunction@x@@QAE_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@00000NNNN_N1@Z) 
referenced in function "private: virtual void __thiscall TheTest_Fail_Test::TestBody(void)" 
(?TestBody@TheTest_Fail_Test@@EAEXXZ)   C:\path\file.obj

私は以前にこれを行ったことがあります-リンクエラーを解決しました-Googleテストでいくつかのテストを書きました-しかし私は何も欠けているのを見ることができません。

テストとして、私は少し書いた

ヘッダーファイルのクラス宣言のinttest(){return 4;} .. ..

次に、テストをEXPECT_EQ(x.test()、4);に置き換えました。

機能した。素晴らしい。しかし、それは、テストされたすべてのコードを単一のファイル、cppなどに含めることを意味します...これは単に不合理です。このアプリケーションプロジェクトにはいくつかのファイルがあります。

この問題を解決するにはどうすればよいですか?Google Testリンクを作成し、ヘッダーと実装ファイルを含むクラスでテストするにはどうすればよいですか?そのヘッダー/実装が別のプロジェクトにある場合、「アプリケーション」タイプですか?

これまでに私が見つけた唯一の同様の問題:同じソリューションで異なるプロジェクトをクロスリンクするときのVisualStudio2008でのC++リンクの問題

解決策を見つけるのを手伝ってください。

4

3 に答える 3

9

別の解決策があります。これは、メインプロジェクトの変更を回避できることを意味するためです。

まったく同じソースファイルの静的ライブラリを作成するために、メインプロジェクトに「ビルド後のアクション」を追加します。次に、この依存関係をgtestプロジェクトに追加するだけです。

メインプロジェクトをコンパイルするたびに、アプリケーションと静的ライブラリがビルドされます。

このようにして、3番目のプロジェクトを作成し、構成の同期を維持する必要はありません。

それが役に立てば幸い。

于 2013-10-31T14:50:54.923 に答える
2

だから私は答えがあります:

私の質問には2つの解決策があります:

1)アプリケーションプロジェクトを2つのプロジェクトに分割します。1つはライブラリになり、ほとんどのコードが含まれます。もう1つは、実際のコードのエントリポイントを呼び出す小さなmain()を含むアプリケーションです(パラメーター解析メソッドなど)。

次に、単体テストプロジェクトを追加して、ライブラリをテストできます。

2)プロジェクトを分割しないでください。gtestプロジェクトを追加し、依存関係を作成しないでください。テストするファイルをgtestプロジェクトに追加します。gtestプロジェクトは、別の実行可能ファイルになります...すべてが満足する必要があります。(利点:テストの依存関係がありません)

私は最初のバージョンが好きです。

于 2013-03-28T16:19:36.033 に答える
0

これには別の解決策があります。

GoogleTestFrameworkの新しいプロジェクトを作成するだけです。(もちろん、既存のアプリケーションソリューションの下で)。

次に、すべてのGoogleTestFrameworkが正しく設定されていることを確認した後。(新しく作成したソリューションでテストできます)

メインプロジェクトからテストしたいコードを手動で含め([追加]-> [既存のアイテム]を使用)、追加のライブラリを生成せずにコードをテストできます。

これの良い部分は、WindowsからDLLを必要とするアプリケーションをテストするときに、アプリケーションがマルチスレッドデバッグDLLを使用する必要があることです。(プロジェクトのプロパティ設定で、[C / C ++]->[コード生成]->[ランタイムライブラリ]に移動して、取得したものを確認します)

また、Google Test Frameworkは、非常に異なるランタイムライブラリ(マルチスレッドデバッグ(/ MTd))を使用します。

リンクの段階で、コンパイラは、アプリケーションから生成されたlibをマルチスレッドDLLおよびGoogleフレームワークのlib(マルチスレッド)にリンクするのが難しいと叫びます。

このようにして、両方のプロジェクトの依存関係の問題を回避できます。(1つは/ Mtd用、もう1つは/ Md用)

于 2017-01-17T03:24:36.240 に答える