Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

docs для 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) { ... }

Ответ 2

Вы также можете запустить подмножество тестов в соответствии с документацией:

Выполнение подмножества тестов

По умолчанию программа Google Test запускает все тесты, которые пользователь определил. Иногда вы хотите запустить только подмножество тестов (например, для отладки или быстрой проверки изменения). Если вы установите GTEST_FILTER переменная среды или флаг -gtest_filter в строку фильтра, Google Test проведет только тесты, чьи полные имена (в форме TestCaseName.TestName) соответствуют фильтру.

Формат фильтра представляет собой список шаблонов подстановочных символов:: (так называемые положительные паттерны), а затем - "-" и другой ':' - выделенный список шаблонов (называемый отрицательными шаблонами). тест соответствует фильтру тогда и только тогда, когда он соответствует любому из положительных но не соответствует ни одному из негативных шаблонов.

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

Не самое приятное решение, но оно работает.

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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

Ответ 6

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

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