为什么要使用单元测试
单测环境搭建
单测框架
MOCK工具
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
部署到服务器运行
外围功能建设
如何编写有效的单元测试用例
提高代码的可测试性
class MyTest {public:int GetIndex() {return index++;}static int index; //静态变量};int MyTest::index = 0;TEST(test, demo) {ASSERT_EQ(0, MyTest().GetIndex());}TEST(test, demo2) {ASSERT_EQ(0, MyTest().GetIndex()); //Error}
TEST(test, demo) { MyTest::index = 0; ASSERT_EQ(0, MyTest().GetIndex());}
TEST(test, demo2) { MyTest::index = 0; ASSERT_EQ(0, MyTest().GetIndex());}
class MyClass {public: void doSomething() { if(getUserManager().getUser(123).getProfile().isAdmin()) { //bad 复杂的依赖链 //xxxx } else { } }};
class MyClass {public: void doSomething(bool isAdmin) { //简单的参数依赖 if(isAdmin) { //xxxx } else { } }};
class MyClass {public:
void processOrderBefore(const UserContext & userContext) { //修改之前 const User & user = userContext.getUser(); const PlanLevel & level = userContext.getLevel(); const Order & order = userContext.getOrder();
// ... process }
void processOrderAfter(const UserContext & userContext) { //修改后 const User & user = userContext.getUser(); const PlanLevel & level = userContext.getLevel(); const Order & order = userContext.getOrder();
processOrderAfter(user, level, order); //核心逻辑抽成新的函数 }
void processOrderAfter(const User & user, const PlanLevel & level,const Order & order) { //只需要对新封装函数进行单元测试即可 // ... process }};
常见误区
维护测试用例
测试用例命名规则参考
TEST_F(TestUCPPipelineCenter, checkTaskInProcess_重复触发_true);测试宏 被测试类名, 被测试函数名_简单描述核心测试逻辑_要校验的结果值
重磅来袭!2022上半年阿里云社区最热电子书榜单!
千万阅读量、百万下载量、上百本电子书,近200位阿里专家参与编写。多元化选择、全领域覆盖,汇聚阿里巴巴技术实践精华,读、学、练一键三连。开发者藏经阁,开发者的工作伴侣~
点击阅读原文查看详情。