TDD实例
项目中对于 TDD
的实战,依赖的是 GoogleTest
框架
我负责编码单元对中控提供
- 设置编码单元
- 设置视频源
- 设置视频输出
- 状态检测
- 开启通道
- 关闭通道
这 6 个接口,中控通过 http
调用编码单元接口,为了解耦和方便进行 TDD
测试,我们将这几个方法写成一个抽象类,编码单元再实现具体的方法:
class IEventHandler {
public:
virtual bool StartChannel(int channel_id) = 0;
virtual bool StopChannel(int channel_id) = 0;
virtual bool ConfigChannel(int channel_id,
const tucodec::SChannelSourceConfig &source_config) = 0;
virtual bool ConfigChannel(int channel_id,
const tucodec::SChannelDestConfig &dest_config) = 0;
virtual bool ConfigChannel(int channel_id,
const tucodec::SChannelEncoderConfig &encoder_config) = 0;
virtual void DetectWorker(int channel_id, int duration,
tucodec::SWorkerStatus &worker_status) = 0;
};
这里 ConfigChannel
方法处理不同的参数结构体。
在测试用例中首先继承 testing::Test
和 public IEventHandler
class HttpControllerTest : public testing::Test, public IEventHandler {
public:
bool StartChannel(int channel_id) override {
channel_id_ = channel_id;
return true;
}
bool StopChannel(int channel_id) override {
channel_id_ = channel_id;
return true;
}
bool ConfigChannel(int channel_id,
const tucodec::SChannelSourceConfig &source_config) override {
channel_id_ = channel_id;
// 其他参数省略
source_config_.username = source_config.username;
return true;
}
bool ConfigChannel(int channel_id,
const tucodec::SChannelDestConfig &dest_config) override {
channel_id_ = channel_id;
// 其他参数省略
dest_config_.port = dest_config.port;
return true;
}
bool ConfigChannel(int channel_id,
const tucodec::SChannelEncoderConfig &encoder_config) override {
channel_id_ = channel_id;
// 其他参数省略
encoder_config_.output_h = encoder_config.output_h;
return true;
}
void DetectWorker(int channel_id, int duration,
tucodec::SWorkerStatus &worker_status) override {
channel_id_ = channel_id;
};
protected:
void SetUp() override {
tucodec::TuLog::Init("", "http_controller_test.log", 50, 2 * 1024 * 1024);
tucodec::TuLog::Instance()->SetPriority(tucodec::kTulogDebug);
controller_.Init();
}
void TearDown() override {
tucodec::TuLog::Destory();
}
protected :
HttpController controller_{this};
tucodec::SChannelSourceConfig source_config_;
tucodec::SChannelDestConfig dest_config_;
tucodec::SChannelEncoderConfig encoder_config_;
int channel_id_{};
};
TEST_F(HttpControllerTest, GetStateTest) {
unsigned char get_json[] = "{\n"
" \"cmd\":\"get_state\",\n"
" \"chn_id\":1,\n"
" \"duration\":2\n"
"}";
controller_.ResolveData(get_json, sizeof(get_json));
ASSERT_EQ(channel_id_, 1);
}
TEST_F(HttpControllerTest, StartChannelTest) {
unsigned char start_json[] = "{\n"
" \"cmd\"