web-dev-qa-db-ja.com

Googleテストで複数のファイルにまたがるテストケースを分離する

私はグーグルテストC++フレームワークの新人です。使い方はとても簡単ですが、ケースを複数のテストファイルに分割する方法を考えています。最良の方法は何ですか?

.cppファイルを直接含めることはオプションです。ヘッダーを使用しても何も起こらないようです...

どんな助けでも大歓迎です

30
Killrazor

テストを実行するためのメインのみを含む1つのファイルを作成します。

// AllTests.cpp
#include "gtest/gtest.h"

int main(int argc, char **argv)
{
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

次に、テストを他のファイルに入れます。ファイルにはいくつでもテストを入れることができます。クラスごとまたはソースファイルごとに1つのファイルを作成するとうまくいく可能性があります。

// SubtractTest.cpp
#include "subtract.h"
#include "gtest/gtest.h"

TEST(SubtractTest, SubtractTwoNumbers)
{
    EXPECT_EQ(5, subtract(6, 1));
}

これには、すべてのテストが同じメインを共有できる必要があります。そこで何か特別なことをしなければならない場合は、複数のビルドターゲットが必要になります。

33
Wayne Johnston

他の答えの主な欠落点は、テストファイルを#includeする必要があるということだと思います。

テストを分割する私の方法は次のとおりです。

  1. 注意が必要な場合は必要ありませんが、潜在的にヘッダーガードを使用して.hファイルにテストを配置します。
  2. テストヘッダーを含む、以下に定義されている1つのメインプログラムがあります
  3. メインのテストプログラムをコンパイルしてリンクするMakefile。

すべてのファイルで同じ名前を2回テストに使用しないでください。

// main_test.cc
#include <gtest/gtest.h>

#include "test_a.h"
#include "test_b.h"
#include "test_c.h"

int main(int argc, char **argv) {
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

Googletestの Makefile を使用して、ルールを追加します。

#  compiles main test program
main_test.o : main_test.cc test_a.h test_b.h test_c.h $(GTEST_HEADERS)
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
# links test program
main_test : main_test.o
    $(CXX) $(LDFLAGS) -L$(GTEST_LIB_DIR) $^ -lgtest_main -lpthread -o $@

命名規則を使用して、テストをアルファベット順に並べます。

// test_a.h
#include "some_class.h"

TEST(SomeClass, aName)
{
  library::SomeClass a("v", {5,4});
  EXPECT_EQ(a.name(), "v");
}

TEST(SomeClass, bSize)
{
  library::SomeClass a("v", {5,4});
  EXPECT_EQ(a.size(0), 5);
  EXPECT_EQ(a.size(1), 4);
}

次に、で個々のテストを実行できます

./main_test --gtest_filter=SomeClass.a*
1
Jonas

私は最近同じ問題に直面しました。

Test_cases.oとmain.oを静的ライブラリ(test_main.a)にアーカイブしてから、他のライブラリとリンクして最終的な実行可能ファイルにしました。

Test_main.aをリンクすると、テストケースが見つからないことに気付きました。

g++ -o test test_main.a -lgtest -lpthread -lXXX

ただし、オブジェクトを個別にリンクすると機能します。

g++ -o test test_cases.o main.o -lgtest -lpthread -lXXX

そして私はこの投稿で答えを見つけました なぜ静的リンクのために.oから.aファイルを作成するのですか?

最後のリンクステップには1つの重要な違いがあります。リンクしたオブジェクトファイルはすべて、最終的なプログラムに含まれます。ライブラリにあるオブジェクトファイルは、他のオブジェクトファイル内の未定義のシンボルを解決するのに役立つ場合にのみ含まれます。そうでない場合、それらは最終的な実行可能ファイルにリンクされません。

グーグルテストのデザインに関係しているのではないかと思いました。

RUN_ALL_TESTS()マクロは、テストクラスのすべてのインスタンスを動的に実行します。つまり、実行時にテストケースを取得します。

その結果、テストクラスのインスタンスをリンクする必要がないため、リンカーはtest_case.oをリンクしません。

0
Tzu Yang Chien