2017-01-10 1 views
0

최근에 내 C++ 코드 용 Google 테스트를 사용하고 있습니다. 테스트를 위해 테스트 픽스처를 설정하는 방법을 읽었을 때 약간 혼란스러워졌습니다. Writing the main() Function 세션은 테스트 픽스처 클래스가 어떻게 생겼는지에 대한 예제를 보여주었습니다. 그러나 생성자 정의가 될 때, 테스트 픽스처 클래스 안에 넣어야합니까? 예를 들어, 구글 테스트 문서에 의해 주어진 다음 코드처럼 : 나는 또한 매크로 TEST_F(test_fixture_name, test_name)의 정의를 보았다C++ Google 테스트 테스트 픽스쳐 생성자 정의

class FooTest : public ::testing::Test { 
protected: 
    // You can remove any or all of the following functions if its body 
    // is empty. 

    FooTest() { 
    // You can do set-up work for each test here. 
    } 

    virtual ~FooTest() { 
    // You can do clean-up work that doesn't throw exceptions here. 
    } 
} 

, 동일한 테스트 픽스처와 연관된 각 테스트, 매크로가 생성됩니다 것 같아 테스트 픽스처 클래스의 새로운 서브 클래스. 위의 사실을 감안할 때

,

  1. 생성자의 일이 무거운 경우, 그 컴파일러가 모든 곳에서 코드 생성자의 큰 조각을 확장하게됩니다 테스트 픽스처의 생성자의 암시 inline을 의미합니까? (또는 같은 번역 단위에서 중요하지 않습니다)

  2. 이 상황에서 테스트 픽스처 클래스 외부에서 생성자를 정의하는 것이 더 합리적입니까? 그러나 이것은 테스트 코드를 읽기 어렵게 만들 것이고, 나는 무엇을해야 할지를 정말로 모른다. ..

아무도 나에게 이것에 관해 약간의 제안을 줄 수 있냐? 감사!

답변

1

질문 1, 그건 전적으로 컴파일러에 달렸습니다. 함수를 인라인하는 방법과 방법을 결정하는 폭이 넓습니다. 함수를 명시 적으로 inline으로 선언하더라도 컴파일러와 관련된 한 가지 제안 일 뿐이며 결과 머신 코드가 너무 비대하거나 비효율적이라고 결정하면 해당 제안을 무시해도됩니다.

C++ FAQ이 주제에 대한 좀 더 자세한 내용이 있습니다

인라인 키워드를 포함하는 일부 함수가 인라인 것을 지정하는 방법은 여러 가지가 있습니다를, 다른 사람은하지 않습니다. 함수를 인라인으로 지정하는 방법과 상관없이 컴파일러에서 무시하도록 허용하는 요청입니다. 즉 컴파일러에서 인라인으로 지정된 함수를 호출하는 곳 중 일부 또는 전부를 인라인 확장 할 수 있습니다. 위의 유연성은 실제로 커다란 이점입니다. 컴파일러는 작은 함수와 다르게 큰 함수를 처리 할 수 ​​있으며 컴파일러는 선택하면 디버깅하기 쉬운 코드를 생성 할 수 있습니다. 올바른 컴파일러 옵션을 참조하십시오.

2 번 질문에서 가장 쉽게 읽을 수있는 것이 있으면 무엇이든 사용하는 것이 좋습니다. Google 테스트를 사용할 때 필자는 모든 "공유 된"코드를 테스트 픽스처 정의에 직접 배치 한 다음 해당 픽스처 내에서 실행되는 모든 단위 테스트에 대해 TEST_F 선언을 즉시 따릅니다.

class MyTestCase : public ::testing::Test 
{ 
    virtual void SetUp() override 
    { 
     // ... 
    } 
} 

TEST_F(MyTestCase, UnitTestNumber1) 
{ 
    // testing stuff here 
} 

// ...more tests... 

그건 그냥 제안입니다. 자신에게 적합한 표준을 고르고 일관되게 사용하십시오.

관련 문제