GoogleTest: Как пропустить тест?

121

С помощью Google Test 1.6 (Windows 7, Visual Studio C ++). Как я могу отключить данный тест? (как я могу предотвратить запуск теста). Могу ли я еще что-нибудь сделать, кроме как прокомментировать весь тест?

пользователь
источник

Ответы:

179

В документации для Google Test 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
просто нашел и фильтрует
Пользователь
@ Билл, я нашел его незадолго до того, как вы разместили свой комментарий ... (и я тоже поставил его в качестве ответа). Затем я удалил свой комментарий, полагая, что он устарел ... но это действительно хорошая информация! +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 еще не доступен, в настоящее время даже не объявлен.
ocroquette
2
GTEST_SKIP()доступно с 1.10.0.
mattdibi
К сожалению, документации по этому поводу все еще недостаточно. Похоже, что тоже есть GTEST_SKIP_("some message")(обратите внимание на нижнее подчеркивание)
Маттеус Брандл,
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 *».

pilkch
источник
Это отличное решение. Я использую его для исключения некоторых тестов по умолчанию, если фильтр пустой. Их можно включить с помощью export GTEST_FILTER='*'.
Timmmm
На самом деле это не работает, потому что по умолчанию это *«не». Вместо этого я просто использую другую переменную среды, которая отменяет фильтр.
Timmmm
Где вы определили «фильтр»? Это строка?
beasone
Я не определяю его, поэтому думаю, что это должен быть глобал, включенный из gtest / gtest.h?
pilkch
6

Если требуется более одного теста, пропустите

--gtest_filter=-TestName.*:TestName.*TestCase
Виджей С
источник
5

При другом подходе вы можете заключить свои тесты в функцию и использовать обычные условные проверки во время выполнения, чтобы выполнять их только при желании.

#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 с двойным стеком.

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

Что касается его проверки, у меня есть объекты-заглушки, которые имитируют поддержку системой двойного стека (или ее отсутствие) путем создания поддельных сокетов.

Единственным недостатком является то, что результаты теста и количество тестов изменятся, что может вызвать проблемы с чем-то, что отслеживает количество успешных тестов.

Вы также можете использовать ASSERT_ * вместо EQUAL_ *. Assert will об остальной части теста, если он не прошел. Предотвращает сброс на консоль большого количества избыточного материала.

Дэвид С. Бишоп
источник
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 вам понадобится этот цикл, чтобы исключить тесты, которые оценивают 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();
Иржи Збранек
источник
Как вы определили «фильтр» в std :: string str = :: testing :: GTEST_FLAG (filter) ;?
beasone