GoogleTest : 테스트를 건너 뛰는 방법?


119

Google Test 1.6 (Windows 7, Visual Studio C ++) 사용. 주어진 테스트를 어떻게 끌 수 있습니까? (일명 테스트 실행을 막을 수있는 방법). 전체 테스트를 주석 처리하는 것 외에 내가 할 수있는 일이 있습니까?

답변:


177

문서 구글 테스트 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
그냥 그것을 찾았고 필터
User

@Bill, 나는 당신이 당신의 코멘트를 게시하기 직전에 그것을 찾았습니다 ... (그리고 나는 그것을 대답으로 올려 놓았습니다). 그런 다음 내 댓글을 삭제하고 쓸모가 없다고 생각했습니다 ...하지만 정말 좋은 정보입니다! +1
Kiril

67

문서에 따라 테스트 하위 집합을 실행할 수도 있습니다 .

테스트의 하위 집합 실행

기본적으로 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. 

가장 예쁜 솔루션은 아니지만 작동합니다.


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 *"목록을 작성하여 기능 모음을 테스트 / 제외 할 수도 있습니다.


이것은 훌륭한 솔루션입니다. 필터가 비어 있으면 기본적으로 일부 테스트를 제외하는 데 사용합니다. 으로 활성화 할 수 있습니다 export GTEST_FILTER='*'.
Timmmm

실제로는 기본값이 " *"아님 " 이기 때문에 작동하지 않습니다 . 대신 필터를 재정의하는 다른 환경 변수를 사용하겠습니다.
Timmmm

"필터"를 어디에서 정의 했습니까? 문자열입니까?
beasone

정의하지 않았으므로 gtest / gtest.h에서 포함 된 전역이어야한다고 생각합니까?
pilkch

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을 지원할 때만 일부 테스트를 실행하려고하므로 나에게 유용합니다.

기술적으로 듀얼 스택은 시스템에 따라 다르기 때문에 실제로 단위 테스트가되어서는 안됩니다. 그러나 어쨌든 작동하는지 테스트하기 전까지는 통합 테스트를 실제로 할 수 없으며 코드 오류가 아닌 경우 실패를보고하지 않습니다.

테스트에 관해서는 가짜 소켓을 구성하여 시스템의 이중 스택 지원 (또는 부족)을 시뮬레이션하는 스텁 객체가 있습니다.

유일한 단점은 테스트 출력과 테스트 수가 변경되어 성공적인 테스트 수를 모니터링하는 문제를 일으킬 수 있다는 것입니다.

EQUAL_ * 대신 ASSERT_ *를 사용할 수도 있습니다. 실패하면 나머지 테스트에 대해 Assert가 수행합니다. 많은 중복 항목이 콘솔에 덤프되는 것을 방지합니다.


4

조건부 테스트에 대한 동일한 필요성이 있었고 좋은 해결 방법을 찾았습니다. TEST_F 매크로처럼 작동하는 매크로 TEST_C를 정의했지만 테스트가 시작되기 전에 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.