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



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

566   7  

7 ответов:

на docs для Google Test 1.7 предлагаю:

вы можете выполнить подмножество тестов, согласно документации:

запуск подмножества тестов

по умолчанию тестовая программа Google выполняет все тесты, определенные пользователем. Иногда вы хотите запустить только подмножество тестов (например, для отладка или быстрая проверка изменений). Если вы установите GTEST_FILTER переменная окружения или флаг --gtest_filter для строки фильтра, Тест Google будет работать только тесты, чьи полные имена (в виде 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. 

Не самое красивое решение, но оно работает.

вот выражение для включения тестов, имена которых имеют строки foo1 или foo2 в них и исключить тесты, имена которых имеют строки bar1 или bar2 в них:

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

Я предпочитаю делать это в коде:

// 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.Тестовая сеть* " или " - MyLibrary.TestFileSystem*".

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

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

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

#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 не должен быть модульным тестом, поскольку он зависит от системы. Но я не могу действительно сделать какие-либо интеграционные тесты, пока я не протестировал их работу в любом случае, и это гарантирует, что он не будет сообщать о сбоях, когда это не ошибка кодов.

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

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

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

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

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

дополнительно, в основном.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();

Comments

    Ничего не найдено.