GoogleTest: Bagaimana cara melewati tes?


121

Menggunakan Google Test 1.6 (Windows 7, Visual Studio C ++). Bagaimana cara mematikan tes yang diberikan? (alias bagaimana cara mencegah pengujian berjalan). Apakah ada yang bisa saya lakukan selain berkomentar di seluruh tes?

Jawaban:


179

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) { ... }

1
baru saja menemukannya juga dan memfilter
Pengguna

@Bill, saya menemukannya sebelum Anda memposting komentar Anda ... (dan saya juga memasangnya sebagai jawaban). Saya kemudian menghapus komentar saya, menganggapnya sudah usang ... tapi itu info yang sangat bagus! +1
Kiril

67

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.


24

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.


Fitur ini belum dirilis. Tidak mungkin itu akan disertakan dalam cabang 1.8.x, karena hanya perbaikan yang diterima di sana. 1.9 belum tersedia, bahkan belum diumumkan saat ini.
ocroquette

2
GTEST_SKIP()tersedia dari 1.10.0.
mattdibi

Sayangnya dokumentasi tentang hal ini masih langka. Tampaknya ada juga GTEST_SKIP_("some message")(perhatikan garis bawah)
Matthäus Brandl

19

Berikut ekspresi untuk menyertakan pengujian yang namanya memiliki string foo1 atau foo2 di dalamnya dan mengecualikan pengujian yang namanya memiliki string bar1 atau bar2 di dalamnya:

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

10

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 *".


Ini adalah solusi yang bagus. Saya menggunakannya untuk mengecualikan beberapa tes secara default jika filternya kosong. Mereka dapat diaktifkan dengan export GTEST_FILTER='*'.
Timmmm

Sebenarnya itu tidak berhasil karena defaultnya adalah " *" tidak "". Sebaliknya saya hanya akan menggunakan variabel lingkungan lain yang menggantikan filter.
Timmmm

Di mana Anda mendefinisikan "filter"? Apakah itu string?
beasone

Saya tidak mendefinisikannya jadi saya pikir itu harus termasuk global dari gtest / gtest.h?
pilkch

6

Jika lebih dari satu tes diperlukan dilewati

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

5

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.


4

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();

Bagaimana Anda mendefinisikan "filter" di std :: string str = :: testing :: GTEST_FLAG (filter) ;?
beasone
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.