GoogleTest: Bir test nasıl atlanır?


120

Google Test 1.6'yı (Windows 7, Visual Studio C ++) kullanma. Belirli bir testi nasıl kapatabilirim? (aka bir testin çalışmasını nasıl engelleyebilirim). Tüm testi yorumlamaktan başka yapabileceğim bir şey var mı?

Yanıtlar:


179

Docs , Google Testi 1.7 için önermek :

"Hemen düzeltemeyeceğiniz bozuk bir testiniz varsa, DISABLED_ önekini adına ekleyebilirsiniz. Bu, onu yürütme dışında bırakacaktır."

Örnekler:

// 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
sadece buldum ve filtreler
Kullanıcı

@ Bill, yorumunu göndermeden hemen önce buldum ... (ve ben de bir cevap olarak koydum). Daha sonra eski olduğunu düşünerek yorumumu kaldırdım ... ama bu gerçekten iyi bir bilgi! +1
Kiril

67

Belgelere göre bir test alt kümesi de çalıştırabilirsiniz :

Testlerin Alt Kümesini Çalıştırma

Varsayılan olarak, bir Google Test programı kullanıcının tanımladığı tüm testleri çalıştırır. Bazen, testlerin yalnızca bir alt kümesini çalıştırmak istersiniz (örneğin, hata ayıklamak veya bir değişikliği hızlı bir şekilde doğrulamak için). GTEST_FILTER ortam değişkenini veya --gtest_filter bayrağını bir filtre dizesine ayarlarsanız, Google Test yalnızca tam adları (TestCaseName.TestName biçiminde) filtreyle eşleşen testleri çalıştırır.

Bir filtrenin biçimi, isteğe bağlı olarak bir '-' ve başka bir ':' ile ayrılmış kalıp listesinin (negatif kalıplar olarak adlandırılır) izlediği ':' ile ayrılmış joker karakter kalıpları listesidir (pozitif kalıplar olarak adlandırılır). Bir test filtreyle ancak ve ancak pozitif modellerden herhangi biriyle eşleşiyor, ancak negatif modellerin hiçbiriyle eşleşmiyorsa eşleşir.

Bir kalıp "*" (herhangi bir dizeyle eşleşir) veya "?" İçerebilir. (herhangi bir tek karakterle eşleşir). Kolaylık sağlamak için, '* -NegativePatterns' filtresi, '-NegativePatterns' olarak da yazılabilir.

Örneğin:

./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. 

En güzel çözüm değil ama işe yarıyor.


24

Artık GTEST_SKIP()çalışma zamanında bir testi koşullu olarak atlamak için makroyu kullanabilirsiniz . Örneğin:

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

    ...
}

Bunun çok yeni bir özellik olduğunu, bu nedenle kullanmak için GoogleTest kitaplığınızı güncellemeniz gerekebileceğini unutmayın.


Bu özellik henüz yayınlanmadı. 1.8.x şubesine dahil edilmesi olası değildir, çünkü orada yalnızca düzeltmeler kabul edilir. 1.9 henüz mevcut değil, şu anda açıklanmadı bile.
ocroquette

2
GTEST_SKIP()1.10.0'dan itibaren mevcuttur.
mattdibi

Ne yazık ki, bu konuda hala belge yok. Görünüşe göre GTEST_SKIP_("some message")(sondaki alt çizgiye dikkat edin)
Matthäus Brandl

19

Adlarında foo1 veya foo2 dizeleri bulunan testleri içerecek ve adlarında bar1 veya bar2 dizeleri bulunan testleri hariç tutacak ifade şu şekildedir:

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

10

Kodla yapmayı tercih ederim:

// 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

Tüm testleri çalıştırmak için her iki satırı da yorumlayabilir, araştırdığım / üzerinde çalıştığım tek bir özelliği test etmek için ilk satırın açıklamasını kaldırabilir veya bir test başarısız olursa ikinci satırın açıklamasını kaldırabilirim ancak diğer her şeyi test etmek istiyorum.
Ayrıca, joker karakterler kullanarak ve bir liste yazarak, "MyLibrary.TestNetwork *" veya "-MyLibrary.TestFileSystem *" bir özellik grubunu test edebilir / hariç tutabilirsiniz.


Bu harika bir çözüm. Filtre boşsa varsayılan olarak bazı testleri dışlamak için kullanıyorum. İle etkinleştirilebilirler export GTEST_FILTER='*'.
Timmmm

Aslında bu işe yaramaz çünkü varsayılan " *" değil "" dir. Bunun yerine, filtreyi geçersiz kılan başka bir ortam değişkeni kullanacağım.
Timmmm

"Filtre" yi nerede tanımladınız? Bu bir ip mi?
beasone

Tanımlamadığım için gtest / gtest.h'den global olarak dahil edilmesi gerektiğini düşünüyorum.
pilkch

6

Birden fazla test gerekiyorsa atlanmalıdır

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

5

Başka bir yaklaşım için, testlerinizi bir işleve sarabilir ve çalışma zamanında normal koşullu kontrolleri kullanarak yalnızca isterseniz bunları yürütebilirsiniz.

#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);
   }
}

Bu benim için yararlı, çünkü yalnızca bir sistem çift yığın IPv6'yı desteklediğinde bazı testler yapmaya çalışıyorum.

Teknik olarak bu dualstack şeyler, sisteme bağlı olduğu için gerçekten bir birim testi olmamalıdır. Ancak yine de çalıştıklarını test edene kadar herhangi bir entegrasyon testi yapamam ve bu, kod hatası olmadığında hataları rapor etmemesini sağlar.

Bunun test edilmesine gelince, sahte soketler oluşturarak bir sistemin ikili yığın (veya eksiklik) desteğini simüle eden saplama nesnelerim var.

Tek dezavantajı, test çıktısının ve test sayısının değişmesi ve bu da başarılı testlerin sayısını izleyen bir şeyde sorunlara neden olabilir.

EQUAL_ * yerine ASSERT_ * de kullanabilirsiniz. Başarısız olursa, testin geri kalanı hakkında Will'i iddia edin. Bir çok gereksiz şeyin konsola atılmasını önler.


4

Aynı şartlı testlere ihtiyacım vardı ve iyi bir çözüm buldum. TEST_F makrosu gibi çalışan bir TEST_C makrosu tanımladım, ancak boole ifadesi olan üçüncü bir parametresi var, testler başlamadan ÖNCE main.cpp'de çalışma zamanı değerlendirildi. Yanlışı değerlendiren testler yürütülmez. Makro çirkin ama şöyle görünüyor:

#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)

Ek olarak, main.cpp'nizde, yanlış değerlendiren testleri hariç tutmak için bu döngüye ihtiyacınız vardır:

// 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); içinde "filtre" yi nasıl tanımladınız?
beasone
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.