c++gmock 유닛 테스트 프레임 워 크

6100 단어 c + +gmock
마이크로 서비스 와 CI 의 유행 에 따라 현재 소프트웨어 공학 분야 에서 유닛 테스트 는 없어 서 는 안 될 부분 이 라 고 할 수 있 고 TDD 에서 유닛 테스트 는 새로운 높이 로 향상 되 었 다.그러나 많은 회사 들 이 여러 가지 이유 로 유지 보 수 를 지속 하지 못 하거나 아예 유닛 테스트 를 써 본 적 이 없다.확실히 유닛 테스트 는 초기 와 코드 유지 기간 에 투 자 를 해 야 하지만 한 프로젝트 가 장기 적 인 유지 와 업데이트 가 필요 하 다 면 유닛 테스트 의 역할 은 투입 에 비해 아무것도 아니다.많은 사람들 이 쓴 단원 테스트 를 본 적 이 있 습 니 다.실행 할 수도 있 고 보급률 도 있 지만 조금 만 분석 해 보면 알 수 있 습 니 다.그것 은 단원 테스트 가 아니 라 통합 테스트 입 니 다.예 를 들 어 누군가가 단원 테스트 에서 네트워크 를 방문 하고 파일 을 쓰 며 데이터 베 이 스 를 읽 고 쓰 는 것 입 니 다.
그러면 어떤 데이터 베 이 스 는 좋 은 단원 테스트 입 니까?필자 의 경험 에 따 르 면 다음 과 같은 몇 가지 가 필요 할 수 있 습 니 다.
1.운행 속도 가 빠 르 고 수백 개의 단원 테스트 사례 가 있 는 테스트 에 있어 저 는 1-2 분 안에 실행 이 완 료 될 수 있 기 를 기대 합 니 다.만약 에 제 가 코드 를 재 구성 하면 빠 른 시간 안에 피드백 을 받 을 수 있 습 니 다.
2.외부 요인 에 의존 하지 말고 유닛 테스트 는 단일 함수 기능 테스트 만 을 대상 으로 합 니 다.
3.하나의 용례 로 하나의 함수 만 테스트
그 중의 두 번 째 점 에 대해 서 는 비교적 번 거 로 울 수 있 습 니 다.만약 에 하나의 함수 가 유형의 구성원 함수 라면 내부 의 구성원 변수 에 의존 할 수 있 습 니 다.이런 상황 은 바로 mock 이 등장 할 때 입 니 다.mock 을 사용 해 야 우 리 는 자신의 편지 로 업무 논 리 를 세 는 테스트 에 전념 할 수 있 고 분리 에 의존 할 수 있 기 때 문 입 니 다.필 자 는 여러 가지 언어의 mock 라 이브 러 리 를 사 용 했 습 니 다.가장 손 쉬 운 것 은 자바 의 mokito 입 니 다.물론 c+언어 도 비슷 한 제품 이 많 습 니 다.예 를 들 어 gmock,fake it 등 이 있 지만 한계 가 많 습 니 다.코드 시작 단계 에서 이해 하지 않 고 계획 을 세우 지 않 으 면 나중에 단원 테스트 에 가입 하고 gmock 을 사용 할 때 후회 하고 전쟁 을 일 으 킬 수 있 습 니 다.다음은 장면 별로 이러한 한계 성 을 분석 해 보 자.
필드 1:

class TurtleReal {

public:

 void PenUp()
 {
 }
 void PenDown() 
 {
 }
};

class MockTurtleReal : public TurtleReal {
public:

 MOCK_METHOD0(PenUp, void());
 MOCK_METHOD0(PenDown, void());

};


class PainterdReal
{
 TurtleReal* turtle;
public:
 PainterdReal(TurtleReal* turtle)
  : turtle(turtle) {}

 bool DrawCircle(int, int, int) {
  turtle->PenDown();
  return true;
 }
};


TEST(PainterTest, ChildRealCanDrawSomething) {
 MockTurtleReal turtle;
 EXPECT_CALL(turtle, PenDown())
  .Times(AtLeast(1));

 PainterdReal painter(&turtle);

 EXPECT_TRUE(painter.DrawCircle(0, 0, 10));
}
결과 1:

결론 1:
왜 예회 에 실 패 했 습 니까?gmock 은 C+다 중 체제 에 의존 하여 작업 을 합 니 다.가상 함수 만 mock 에 의 해 작 동 되 고 비 가상 함수 가 mock 에 의 해 작 동 되 지 않 습 니 다.이 점 은 코드 에서 gmock 류 의 디자인 을 사용 하려 면 인터페이스 격 리 를 사용 하 는 것 이 좋 습 니 다.c++에 있어 서도 순수한 가상 유형 을 사용 하 는 것 이 좋 습 니 다.c+자체 에 인터페이스 유형 이 없 기 때 문 입 니 다.
필드 2:

class Turtle {

public:

 virtual ~Turtle() {}
 virtual void PenUp() = 0;
 virtual void PenDown() = 0;
};

class MockTurtle : public Turtle {
public:

 MOCK_METHOD0(PenUp, void());
 MOCK_METHOD0(PenDown, void());

};

class Painter
{
 Turtle* turtle;
public:
 Painter(Turtle* turtle)
  : turtle(turtle) {}

 bool DrawCircle(int, int, int) {
  turtle->PenDown();
  return true;
 }
};

TEST(PainterTest, CanDrawSomething) {
 MockTurtle turtle;
 EXPECT_CALL(turtle, PenDown())
  .Times(AtLeast(1));

 Painter painter(&turtle);

 EXPECT_TRUE(painter.DrawCircle(0, 0, 10));
}
결과 2:

결론 2:
함 수 를 가상 함수 로 바 꾸 고 테스트 용례 를 통과 합 니 다.
필드 3:

class TurtleChild: Turtle {

public:

 void PenUp()
 {
  int a = 0;
 };
 void PenDown()
 {
  int b = 0;
 };
};

class MockTurtleChild : public TurtleChild {
public:

 MOCK_METHOD0(PenUp, void());
 MOCK_METHOD0(PenDown, void());

};

class PainterChildRef
{
 TurtleChild turtle;
public:
 PainterChildRef(TurtleChild& turtle)
  : turtle(turtle) {}

 bool DrawCircle(int, int, int) {
  turtle.PenDown();
  return true;
 }
};

TEST(PainterTest, ChildCanDrawSomething) {
 MockTurtleChild turtle;
 EXPECT_CALL(turtle, PenDown())
  .Times(AtLeast(1));

 PainterChild painter(&turtle);

 EXPECT_TRUE(painter.DrawCircle(0, 0, 10));
}
결과 3:

결론 3:
테스트 용례 통과,파생 클래스 의 동명 함 수 는 여전히 가상 함수 이 며,다 중 지원,gomck 지원
필드 4:

class Turtle {

public:

 virtual ~Turtle() {}
 virtual void PenUp() = 0;
 virtual void PenDown() = 0;
};

class TurtleChild: Turtle {

public:

 void PenUp()
 {
  int a = 0;
 };
 void PenDown()
 {
  int b = 0;
 };
};


 class MockTurtleChild : public TurtleChild {
 public:
 MOCK_METHOD0(PenUp, void());
 MOCK_METHOD0(PenDown, void());
};
class PainterChildRef
{
 TurtleChild turtle;
public:
 PainterChildRef(TurtleChild& turtle)
  : turtle(turtle) {}

 bool DrawCircle(int, int, int) {
  turtle.PenDown();
  return true;
 }
};

TEST(PainterTest, ChildRefCanDrawSomething) {
 MockTurtleChild turtle;
 EXPECT_CALL(turtle, PenDown())
  .Times(AtLeast(1));

 PainterChildRef painter(turtle);

 EXPECT_TRUE(painter.DrawCircle(0, 0, 10));
}
결과 4:

결론 4:
테스트 용례 가 실 패 했 습 니 다.인용 형식 으로 들 어 오 는 구성원 변수 자체 가 다 중 특성 을 가지 고 있 지 않 기 때문에 gmock 은 지원 하지 않 습 니 다.
결론.
본 고 는 네 가지 장면 을 통 해 점차적으로 gmock 의 사용 을 깊이 있 게 분 석 했 습 니 다.여러분 들 은 코드 를 쓰기 전에 미리 계획 을 세우 고 전쟁 을 피 하 며 다시 일 을 시작 하 기 를 바 랍 니 다.그러나 다른 측면 에서 볼 때 인터페이스 격 리,p-impl 관용 법 등 기술 은 c++늙 은 새 의 필수 적 인 보물 이 어야 한다.이 를 통 해 알 수 있 듯 이 많은 것 이 일리 가 있다.전기 에 잘 모 르 면 후기 에 더 많은 정력 을 들 여 보완 할 수 밖 에 없다.재 구성 을 뒤 집 거나 직접 버 리 거나 모 르 는 사람 은 두려움 이 없다.no zuo,no die.

좋은 웹페이지 즐겨찾기