问题引入
Web服务提供restful API供前端调用,restful API支持http/https协议,现构造http/https请求对restful API进行单元测试,单元测试代码除了请求使用的协议不同,请求url、请求参数都一样,如何用一套单元测试代码测试http/https restfulAPI呢?
目标
掌握使用参数化测试夹具对单元测试用例进行参数化配置
参数化测试夹具类图结构
TestWithParam是一个模板类测试夹具,与其它测试夹具一样继承于Test类,为了支持参数化继承于WithParamInterface模板类,WithParamInterface模板类定义一个成员变量parameter_,类型为模板参数指定的类型,同时定义设置/获取参数的接口。子类继承获取参数接口GetParam。设置参数接口SetParam是私有接口,供gtest内部在运行每个单元测试前进行参数化配置时使用。MyTestFixture是单元测试代码要写的测试夹具,它不是模板类,继承TestWithParam时需指定模板参数T。
参数化测试夹具使用示例
现使用参数化测试夹具实现文章一开始提出的问题,示例代码只是为了演示。
类RemoteResource实现Request接口用于测试Web服务的Restful API,内部实现依协议是http或https有所不同,协议参数值设置通过构造函数传入。
RemoteResourceTest是一个参数化测试夹具,继承于TestWithParam模板类,模板参数指定string类型,用于存储协议值。测试夹具定义一个成员变量remote_resource_用于测试,构造函数调用继承下来的GetParam接口获取参数值去实例化remote_resource_对象。
使用宏TEST_P定义测试用例,尾部字母P为Param的首字母,宏TEST_P与其它定义测试用例宏一样有两个参数:测试夹具名称、测试用例名称。
使用宏INSTANTIATE_TEST_CASE_P实例化测试用例,尾部字母P为Param首字母,有三个参数:前缀、测试夹具名称、参数值列表。构造用例测试名称时前缀会放在前面,主要用于避免名字冲突类似于C++名字空间。参数值类型必须与参数化测试夹具的参数类型一致,参数值用Values聚合在一起。宏INSTANTIATE_TEST_CASE_P内部使用很多C++宏技巧实现,INSTANTIATE_TEST_CASE_P(RemoteResource, RemoteResourceTest,Values("http", "https")); 这行代码会生成2条的Request测试用例,第一条运行前会设置测试参数为http,第二条运行前会设置参数为https。
总结
参数化测试三步骤:
定义参数化测试夹具,继承TestWithParam,指定模板参数T,测试夹具内部调用GetParam接口获取参数,根据参数进行实现
使用宏TEST_P定义测试用例
使用宏INSTANTIATE_TEST_CASE_P实例化测试用例,将参数值列表用Values聚合在一起
领取专属 10元无门槛券
私享最新 技术干货