c++gmock 유닛 테스트 프레임 워 크
그러면 어떤 데이터 베 이 스 는 좋 은 단원 테스트 입 니까?필자 의 경험 에 따 르 면 다음 과 같은 몇 가지 가 필요 할 수 있 습 니 다.
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.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 1717 소수 화 점수 2 (수학)소수 화 점수 2 레이 는 수학 시간 에 선생님 의 말씀 을 듣 고 모든 소수 가 점수 로 표시 되 는 형식 이 라 고 말 했다. 그 는 녹 기 시 작 했 고 곧 완성 되 었 다. 그러나 그 는 또 하나의 문 제 를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.