Google Test 1.6(Windows 7、Visual Studio C++)を使用します。特定のテストをオフにするにはどうすればよいですか? (別名、テストの実行を防ぐ方法)。テスト全体をコメントアウトする以外にできることはありますか?
ドキュメントによると テストのサブセットを実行する もできます:
テストのサブセットの実行
デフォルトでは、Google Testプログラムはユーザーが定義したすべてのテストを実行します。テストのサブセットのみを実行したい場合があります(たとえば、デバッグや変更の迅速な検証のため)。 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.
最もきれいなソリューションではありませんが、機能します。
以下に、名前に文字列foo1またはfoo2が含まれるテストを含め、名前に文字列bar1またはbar2が含まれるテストを除外する式を示します。
--gtest_filter=*foo1*:*foo2*-*bar1*:*bar2*
私はコードでそれをすることを好む:
// 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 *」を記述することにより、一連の機能をテスト/除外することもできます。
GTEST_SKIP()
マクロを使用して、実行時にテストを条件付きでスキップできるようになりました。例えば:
TEST(Foo, Bar)
{
if (blah)
GTEST_SKIP();
...
}
これは非常に 最近の機能 なので、使用するにはGoogleTestライブラリを更新する必要があるかもしれないことに注意してください。
複数のテストが必要な場合はスキップします
--gtest_filter=-TestName.*:TestName.*TestCase
別のアプローチとして、テストを関数でラップし、実行時に通常の条件チェックを使用して、必要な場合にのみ実行できます。
#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_ *を使用することもできます。テストが失敗した場合、残りのテストについてアサートします。多くの冗長なものがコンソールにダンプされるのを防ぎます。
条件付きテストについても同じニーズがあり、適切な回避策を見つけました。 TEST_Fマクロと同様に機能するマクロTEST_Cを定義しましたが、テストが開始される前にmain.cppでランタイムを評価するブール式である3番目のパラメーターがあります。 falseを評価するテストは実行されません。マクロはTheいですが、次のようになります。
#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();