GoogleTest:テストをスキップする方法?


119

Google Test 1.6(Windows 7、Visual Studio C ++)を使用します。特定のテストをオフにするにはどうすればよいですか?(別名、テストの実行を防ぐにはどうすればよいですか)。テスト全体をコメント化する以外に何かできることはありますか?

回答:


177

Google Test 1.7 のドキュメントは以下提案します:

「すぐに修正できない壊れたテストがある場合は、その名前にDISABLED_プレフィックスを追加できます。これにより、実行から除外されます。」

例:

// Tests that Foo does Abc.
TEST(FooTest, DISABLED_DoesAbc) { ... }

class DISABLED_BarTest : public ::testing::Test { ... };

// Tests that Bar does Xyz.
TEST_F(DISABLED_BarTest, DoesXyz) { ... }

1
ちょうどそれを見つけてフィルターをかけた
ユーザー

@Bill、私はあなたがコメントを投稿する直前にそれを見つけました...(そして私も答えとしてそれを上げました)。その後、コメントを削除し、古くなっていると判断しました...しかし、それは本当に良い情報です!+1
キリル2011

67

ドキュメントに従って、テストのサブセットを実行することもできます。

テストのサブセットの実行

デフォルトでは、Googleテストプログラムはユーザーが定義したすべてのテストを実行します。場合によっては、テストのサブセットのみを実行する必要があります(たとえば、デバッグまたは変更をすばやく確認するため)。GTEST_FILTER環境変数または--gtest_filterフラグをフィルター文字列に設定した場合、Google Testはフルネーム(TestCaseName.TestNameの形式)がフィルターに一致するテストのみを実行します。

フィルターのフォーマットは、ワイルドカードパターン(ポジティブパターンと呼ばれる)の「:」で区切られたリストで、オプションで「-」と別の「:」で区切られたパターンリスト(ネガティブパターンと呼ばれる)が後に続きます。テストは、ポジティブパターンのいずれかに一致し、ネガティブパターンのいずれにも一致しない場合にのみ、フィルターに一致します。

パターンには「*」(任意の文字列に一致)または「?」を含めることができます (任意の1文字と一致します)。便宜上、フィルター「* -NegativePatterns」は「-NegativePatterns」と記述することもできます。

例えば:

./foo_test Has no flag, and thus runs all its tests.
./foo_test --gtest_filter=* Also runs everything, due to the single match-everything * value.
./foo_test --gtest_filter=FooTest.* Runs everything in test case FooTest.
./foo_test --gtest_filter=*Null*:*Constructor* Runs any test whose full name contains either "Null" or "Constructor".
./foo_test --gtest_filter=-*DeathTest.* Runs all non-death tests.
./foo_test --gtest_filter=FooTest.*-FooTest.Bar Runs everything in test case FooTest except FooTest.Bar. 

かわいらしいソリューションではありませんが、機能します。


24

GTEST_SKIP()マクロを使用して、実行時に条件付きでテストをスキップできるようになりました。例えば:

TEST(Foo, Bar)
{
    if (blah)
        GTEST_SKIP();

    ...
}

これはごく最近の機能であるため、使用するにはGoogleTestライブラリの更新が必要になる場合があります。


この機能はまだリリースされていません。修正のみが受け入れられるため、1.8.xブランチに含まれる可能性は低いです。1.9はまだ利用できず、現時点ではまだ発表されていません。
オコケット

2
GTEST_SKIP()1.10.0から利用可能です。
mattdibi

残念ながら、これについてはまだドキュメントが不足しています。それもあったようですGTEST_SKIP_("some message")(末尾のアンダースコアに注意)
マテウスブランドル

19

次の式は、名前に文字列foo1またはfoo2が含まれるテストを含め、名前に文字列bar1またはbar2が含まれるテストを除外する式です。

--gtest_filter=*foo1*:*foo2*-*bar1*:*bar2*

10

私はコードでそれを行うことを好みます:

// Run a specific test only
//testing::GTEST_FLAG(filter) = "MyLibrary.TestReading"; // I'm testing a new feature, run something quickly

// Exclude a specific test
testing::GTEST_FLAG(filter) = "-MyLibrary.TestWriting"; // The writing test is broken, so skip it

両方の行をコメント化してすべてのテストを実行するか、最初の行のコメントを外して調査中または作業中の単一の機能をテストするか、テストが失敗したが他のすべてをテストしたい場合は2行目のコメントを外します。
ワイルドカードを使用してリスト「MyLibrary.TestNetwork *」または「-MyLibrary.TestFileSystem *」を書き込むことにより、一連の機能をテスト/除外することもできます。


これは素晴らしいソリューションです。フィルターが空白の場合、デフォルトで一部のテストを除外するために使用します。これらはで有効にできますexport GTEST_FILTER='*'
Timmmm 2017

デフォルトは「*」ではないため、実際には機能しません。代わりに、フィルターをオーバーライドする別の環境変数を使用します。
Timmmm 2017

「フィルター」はどこで定義しましたか?文字列ですか?
beasone

私はそれを定義していないので、gtest / gtest.hに含まれているグローバルである必要があると思いますか?
ピルチ

6

複数のテストが必要な場合はスキップされます

--gtest_filter=-TestName.*:TestName.*TestCase

4

別のアプローチとして、テストを関数にラップし、実行時に通常の条件チェックを使用して、必要な場合にのみテストを実行することができます。

#include <gtest/gtest.h>

const bool skip_some_test = true;

bool some_test_was_run = false;

void someTest() {
   EXPECT_TRUE(!skip_some_test);
   some_test_was_run = true;
}

TEST(BasicTest, Sanity) {
   EXPECT_EQ(1, 1);
   if(!skip_some_test) {
      someTest();
      EXPECT_TRUE(some_test_was_run);
   }
}

システムがデュアルスタックIPv6をサポートしている場合にのみいくつかのテストを実行しようとしているので、これは私にとって便利です。

技術的には、そのデュアルスタックのものはシステムに依存するため、実際には単体テストであってはなりません。しかし、いずれにしても機能することをテストするまで、統合テストを実際に行うことはできません。これにより、コードの障害ではない場合にエラーが報告されなくなります。

それのテストに関しては、偽のソケットを構築することによってデュアルスタック(またはその欠如)に対するシステムのサポートをシミュレートするスタブオブジェクトがあります。

唯一の欠点は、テストの出力とテストの数が変化し、成功したテストの数を監視する何かで問題を引き起こす可能性があることです。

EQUAL_ *ではなくASSERT_ *を使用することもできます。テストが失敗した場合、残りのテストについてアサートします。多くの冗長なものがコンソールにダンプされるのを防ぎます。


4

条件テストも同様に必要でしたが、適切な回避策を見つけました。私はTEST_Fマクロのように機能するマクロTEST_Cを定義しましたが、これにはブール式である3番目のパラメーターがあり、テストが開始される前にmain.cppでランタイムを評価します。falseを評価するテストは実行されません。マクロは醜いですが、次のようになります。

#pragma once
extern std::map<std::string, std::function<bool()> >* m_conditionalTests;
#define TEST_C(test_fixture, test_name, test_condition)\
class test_fixture##_##test_name##_ConditionClass\
{\
    public:\
    test_fixture##_##test_name##_ConditionClass()\
    {\
        std::string name = std::string(#test_fixture) + "." + std::string(#test_name);\
        if (m_conditionalTests==NULL) {\
            m_conditionalTests = new std::map<std::string, std::function<bool()> >();\
        }\
        m_conditionalTests->insert(std::make_pair(name, []()\
        {\
            DeviceInfo device = Connection::Instance()->GetDeviceInfo();\
            return test_condition;\
        }));\
    }\
} test_fixture##_##test_name##_ConditionInstance;\
TEST_F(test_fixture, test_name)

さらに、main.cppで、falseと評価されるテストを除外するには、次のループが必要です。

// identify tests that cannot run on this device
std::string excludeTests;
for (const auto& exclusion : *m_conditionalTests)
{
    bool run = exclusion.second();
    if (!run)
    {
        excludeTests += ":" + exclusion.first;
    }
}

// add the exclusion list to gtest
std::string str = ::testing::GTEST_FLAG(filter);
::testing::GTEST_FLAG(filter) = str + ":-" + excludeTests;

// run all tests
int result = RUN_ALL_TESTS();

std :: string str = :: testing :: GTEST_FLAG(filter);で「filter」をどのように定義しましたか?
beasone
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.