GoogleTest: Як пропустити тест?


119

Використання Google Test 1.6 (Windows 7, Visual Studio C ++). Як я можу вимкнути даний тест? (також як я можу запобігти запуску тесту). Чи можу я щось зробити, окрім прокоментувати весь тест?

Відповіді:


177

У Документах для випробування Google 1.7 запропонувати :

"Якщо у вас зламаний тест, який ви не можете виправити відразу, ви можете додати до його імені префікс DISABLED_. Це виключить його з виконання."

Приклади:

// 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
просто знайшов це і фільтрує
Користувач

@Bill, я знайшов це безпосередньо перед тим, як ви опублікували свій коментар ... (і я поставив це як відповідь). Потім я видалив свій коментар, вважаючи, що це застаріле ... але це якась справді хороша інформація! +1
Кирило

67

Ви також можете запустити підмножину тестів відповідно до документації:

Запуск підмножини тестів

За замовчуванням програма Google Test запускає всі визначені користувачем тести. Іноді потрібно запустити лише підмножину тестів (наприклад, для налагодження або швидкої перевірки зміни). Якщо встановити змінну середовища GTEST_FILTER або прапор --gtest_filter на рядку фільтра, Google Test запустить лише тести, повні імена яких (у формі TestCaseName.TestName) відповідають фільтру.

Формат фільтра - ':' - відокремлений список шаблонів підстановок (називається позитивними візерунками), необов'язково слідує '-' та інший ':' - розділений список шаблонів (називається негативними візерунками). Тест відповідає фільтру, якщо і тільки якщо він відповідає будь-якому з позитивних зразків, але не відповідає жодному з негативних зразків.

Шаблон може містити "*" (відповідає будь-якому рядку) або "?" (відповідає будь-якому одному символу). Для зручності фільтр '* -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. 

Не найкрасивіше рішення, але воно працює.


24

Тепер ви можете використовувати GTEST_SKIP()макрос, щоб умовно пропустити тест під час виконання. Наприклад:

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

    ...
}

Зауважте, що це зовсім недавня функція, тому вам, можливо, знадобиться оновити бібліотеку GoogleTest, щоб користуватися нею.


Ця функція ще не випущена. Навряд чи він буде включений у гілку 1.8.x, оскільки там приймаються лише виправлення. 1.9 ще не доступний, наразі навіть не оголошено.
окрокет

2
GTEST_SKIP()доступний з 1.10.0.
mattdibi

На жаль, документації все ще мало. Здається, є також GTEST_SKIP_("some message")(зверніть увагу на останній підкреслення)
Matthäus Brandl

19

Ось у цьому виразі слід включити тести, назви яких містять рядки foo1 або foo2 і виключають тести, у назви яких є рядки bar1 або bar2:

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

10

Я вважаю за краще це робити в коді:

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

Я можу або прокоментувати обидва рядки для запуску всіх тестів, відмітити перший рядок для тестування однієї функції, яку я досліджую / працюю, або відмінити другий рядок, якщо тест зламаний, але я хочу перевірити все інше.
Ви також можете протестувати / виключити набір функцій, скориставшись символами та записавши список "MyLibrary.TestNetwork *" або "-MyLibrary.TestFileSystem *".


Це чудове рішення. Я використовую його для виключення деяких тестів за замовчуванням, якщо фільтр порожній. Їх можна ввімкнути за допомогою export GTEST_FILTER='*'.
Timmmm

Насправді це не працює, тому що за замовчуванням є " *" не "". Натомість я просто використаю іншу змінну середовища, яка перекриває фільтр.
Timmmm

Де ви визначили "фільтр"? Це струна?
beasone

Я не визначаю це, тому я думаю, що він повинен бути глобальним, включеним з gtest / gtest.h?
пікч

6

Якщо потрібно більше одного тесту, пропустіть

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

4

Для іншого підходу ви можете перетворити свої тести у функцію і використовувати звичайні умовні перевірки під час виконання, щоб виконати їх лише за бажанням.

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

Технічно те, що речі з двома стеками насправді не повинні бути тестовою одиницею, оскільки це залежить від системи. Але я не можу реально робити будь-які інтеграційні тести, поки я не перевіряю, що вони все одно працюють, і це гарантує, що він не повідомить про помилки, коли це не помилка коду.

Що стосується його тестування, у мене є об'єкти-заглушки, які імітують підтримку системи для dualstack (або її відсутність), будуючи підроблені сокети.

Єдиним недоліком є ​​те, що результат тесту та кількість тестів зміниться, що може спричинити проблеми з чимось, що відстежує кількість успішних тестів.

Ви також можете використовувати ASSERT_ *, а не EQUAL_ *. Затвердити буде про решту тесту, якщо він не вдався. Запобігає відсипанню великої кількості зайвих речей на консоль.


4

У мене була така ж потреба в умовних тестах, і я з'ясував хороший спосіб вирішення. Я визначив макрос TEST_C, який працює як макрос TEST_F, але він має третій параметр, який є булевим виразом, оцінюється під час виконання в main.cpp перед тим, як починати тести. Тести, що оцінюють помилковість, не виконуються. Макрос некрасивий, але виглядає так:

#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 вам потрібна ця петля, щоб виключити тести, які оцінюють помилкові:

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

Як ви визначили "filter" у std :: string str = :: testing :: GTEST_FLAG (filter) ;?
beasone
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.