GoogleTest: jak pominąć test?

Za Pomocą Google Test 1.6 (Windows 7, Visual Studio C++). Jak Mogę wyłączyć dany test? (aka Jak mogę zapobiec uruchomieniu testu). Czy jest coś, co mogę zrobić poza komentowaniem całego testu?

 80
Author: User, 2011-08-26

7 answers

Docs for Google Test 1.7 suggest :

"Jeśli masz zepsuty test, którego nie możesz od razu naprawić, możesz dodać prefiks DISABLED_ do jego nazwy. To wykluczy go z wykonania."

Przykłady:

// 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) { ... }
 111
Author: Bill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-16 18:49:35

Możesz również uruchomić podzbiór testów , zgodnie z dokumentacją:

Uruchamianie podzbioru testów

Domyślnie program Google Test uruchamia wszystkie testy zdefiniowane przez użytkownika. Czasami chcemy uruchomić tylko podzbiór testów (np. dla debugowania lub szybkiej weryfikacji zmiany). Jeśli ustawisz GTEST_FILTER zmienna środowiskowa lub znacznik --gtest_filter do łańcucha filtrów, Google Test uruchomi tylko te testy, których pełne nazwy (w forma Nazwa testu.TestName) dopasuj filtr.

Format filtra to oddzielona od': 'lista wzorców wieloznacznych (tzw. wzorce dodatnie), po których następuje " - " i kolejna': '- oddzielona lista wzorców (tzw. ujemne wzorce). A test pasuje do filtra wtedy i tylko wtedy, gdy pasuje do któregokolwiek z dodatnich wzorce, ale nie pasuje do żadnego z negatywnych wzorców.

Wzorzec może zawierać ' * '(pasuje do dowolnego ciągu znaków) lub '?"(pasuje do dowolnych single charakter). Dla wygody filtr "* - NegativePatterns" można również zapisać jako '- NegativePatterns'.

Na przykład:

./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. 
Nie najładniejsze rozwiązanie, ale działa.
 54
Author: Kiril,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-20 11:03:25

Oto wyrażenie zawierające testy, których nazwy zawierają ciągi znaków foo1 lub foo2 oraz wykluczające testy, których nazwy zawierają ciągi znaków bar1 lub bar2:

--gtest_filter=*foo1*:*foo2*-*bar1*:*bar2*
 14
Author: ashutosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-04 06:20:55

Wolę to robić w kodzie:

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

Mogę albo skomentować obie linie, aby uruchomić wszystkie testy, odkomentować pierwszą linię, aby przetestować pojedynczą funkcję, nad którą badam/pracuję, lub odkomentować drugą linię, jeśli test jest zepsuty, ale chcę przetestować wszystko inne.
Możesz również przetestować/wykluczyć zestaw funkcji, używając symboli wieloznacznych i pisząc listę " MyLibrary.TestNetwork * " lub " - MyLibrary.TestFileSystem*".

 6
Author: pilkch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-03 01:30:00

Jeśli potrzebne jest więcej niż jeden test należy pominąć

--gtest_filter=-TestName.*:TestName.*TestCase
 5
Author: Vijay C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-20 12:06:35

W przypadku innego podejścia, możesz zawinąć testy w funkcję i użyć normalnych warunkowych testów w czasie wykonywania, aby wykonać je tylko, jeśli chcesz.

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

Jest to przydatne dla mnie, ponieważ próbuję uruchomić kilka testów tylko wtedy, gdy system obsługuje podwójny stos IPv6.

Technicznie rzecz biorąc, dualstack nie powinien być testem jednostkowym, ponieważ zależy od systemu. Ale tak naprawdę nie mogę wykonać żadnych testów integracyjnych, dopóki nie przetestuję, że i tak działają, a to zapewnia, że nie zgłosi błędów kiedy to nie jest wina kodów.

Jeśli chodzi o test to mam obiekty stub, które symulują wsparcie systemu dla dualstack (lub jego brak) poprzez konstruowanie fałszywych gniazd.

Jedynym minusem jest to, że wynik testu i liczba testów ulegną zmianie, co może powodować problemy z czymś, co monitoruje liczbę udanych testów.

Możesz również użyć ASSERT_ * zamiast EQUAL_*. Assert will o pozostałej części testu, jeśli się nie powiedzie. Zapobiega powstawaniu wielu zbędnych rzeczy wrzucony do konsoli.

 4
Author: David C. Bishop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-30 05:31:04

Miałem takie samo zapotrzebowanie na testy warunkowe i wymyśliłem dobre obejście. Zdefiniowałem makro TEST_C, które działa jak makro TEST_F, ale ma trzeci parametr, który jest wyrażeniem logicznym, ocenianym w trybie runtime W main.cpp przed rozpoczęciem testów. Testy, które oceniają false, nie są wykonywane. Makro jest brzydkie, ale wygląda tak:

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

Dodatkowo, w Twoim głównym.cpp, potrzebujesz tej pętli, aby wykluczyć testy, które oceniają 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();
 2
Author: Jiri Zbranek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-28 18:31:47