Jawaban:
The docs untuk Google Uji 1,7 sarankan :
"Jika Anda memiliki pengujian yang rusak yang tidak dapat Anda perbaiki dengan segera, Anda dapat menambahkan awalan DISABLED_ ke namanya. Ini akan mengecualikannya dari eksekusi."
Contoh:
// 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) { ... }
Anda juga dapat menjalankan subset pengujian , menurut dokumentasinya:
Menjalankan Subset dari Tes
Secara default, program Google Test menjalankan semua tes yang telah ditentukan pengguna. Kadang-kadang, Anda ingin menjalankan hanya sebagian dari pengujian (misalnya untuk debugging atau dengan cepat memverifikasi perubahan). Jika Anda menyetel variabel lingkungan GTEST_FILTER atau tanda --gtest_filter ke string filter, Google Test hanya akan menjalankan pengujian yang nama lengkapnya (dalam bentuk TestCaseName.TestName) cocok dengan filter.
Format filter adalah ':' - daftar pola karakter pengganti yang dipisahkan (disebut pola positif) secara opsional diikuti dengan '-' dan daftar pola yang dipisahkan ':' - (disebut pola negatif). Pengujian cocok dengan filter jika dan hanya jika cocok dengan salah satu pola positif tetapi tidak cocok dengan pola negatif mana pun.
Sebuah pola mungkin berisi '*' (cocok dengan sembarang string) atau '?' (cocok dengan salah satu karakter). Untuk kenyamanan, filter '* -NegativePatterns' juga dapat ditulis sebagai '-NegativePatterns'.
Sebagai contoh:
./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.
Bukan solusi tercantik, tapi berhasil.
Anda sekarang dapat menggunakan GTEST_SKIP()
makro untuk melewati pengujian secara bersyarat pada waktu proses. Sebagai contoh:
TEST(Foo, Bar)
{
if (blah)
GTEST_SKIP();
...
}
Perhatikan bahwa ini adalah fitur yang sangat baru sehingga Anda mungkin perlu memperbarui perpustakaan GoogleTest Anda untuk menggunakannya.
GTEST_SKIP()
tersedia dari 1.10.0.
GTEST_SKIP_("some message")
(perhatikan garis bawah)
Saya lebih suka melakukannya dalam kode:
// 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
Saya dapat mengomentari kedua baris untuk menjalankan semua tes, menghapus komentar pada baris pertama untuk menguji satu fitur yang sedang saya selidiki / kerjakan, atau hapus komentar pada baris kedua jika tes rusak tetapi saya ingin menguji yang lainnya.
Anda juga dapat menguji / mengecualikan rangkaian fitur dengan menggunakan wildcard dan menulis daftar, "MyLibrary.TestNetwork *" atau "-MyLibrary.TestFileSystem *".
export GTEST_FILTER='*'
.
*
" tidak "". Sebaliknya saya hanya akan menggunakan variabel lingkungan lain yang menggantikan filter.
Untuk pendekatan lain, Anda bisa menggabungkan pengujian Anda dalam sebuah fungsi dan menggunakan pemeriksaan bersyarat normal pada waktu proses untuk hanya mengeksekusinya jika Anda mau.
#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);
}
}
Ini berguna bagi saya karena saya mencoba menjalankan beberapa pengujian hanya jika sistem mendukung dual stack IPv6.
Secara teknis, barang dualstack seharusnya tidak menjadi pengujian unit karena bergantung pada sistem. Tetapi saya tidak dapat benar-benar membuat tes integrasi apa pun sampai saya mengujinya tetap berfungsi dan ini memastikan bahwa itu tidak akan melaporkan kegagalan ketika itu bukan kesalahan kode.
Adapun pengujiannya saya memiliki objek rintisan yang mensimulasikan dukungan sistem untuk dualstack (atau kekurangan) dengan membangun soket palsu.
Satu-satunya downside adalah bahwa hasil tes dan jumlah tes akan berubah yang dapat menyebabkan masalah dengan sesuatu yang memantau jumlah tes yang berhasil.
Anda juga dapat menggunakan ASSERT_ * daripada EQUAL_ *. Tegaskan tentang sisa pengujian jika gagal. Mencegah banyak hal yang berlebihan dibuang ke konsol.
Saya memiliki kebutuhan yang sama untuk tes bersyarat, dan saya menemukan solusi yang bagus. Saya mendefinisikan makro TEST_C yang bekerja seperti makro TEST_F, tetapi memiliki parameter ketiga, yang merupakan ekspresi boolean, runtime yang dievaluasi di main.cpp SEBELUM pengujian dimulai. Pengujian yang mengevaluasi salah tidak dijalankan. Makro itu jelek, tetapi terlihat seperti:
#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)
Selain itu, di main.cpp Anda, Anda memerlukan loop ini untuk mengecualikan pengujian yang mengevaluasi 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();