Dubbo 接口自动化测试框架
一、核心模块及基础服务类封装(封装同样参考unittest框架的五个文件夹加两个py文件。只是这个多一个base_service.py,放于api文件夹即可)
1、核心模块介绍
2、基础服务类封装设计
1、创建一个基础服务类(base_service.py)
from dubboclient import DubboClient class BaseService(object): def __init__(self): self.dubbo_client = DubboClient("211.103.136.244",6502)
2、服务对象封装
会员服务类(新建member_service.py)
#导包 import json from base_service import BaseService class MemberService(BaseService): #重写(扩展式) def __init__(self): super().__init__() #继承父类 self.service_name = "MemberService" #服务名,多个方法使用 #封装服务类下面的方法 def find_by_telephone(self,tel): resp = self.dubbo_client.invoke(self.service_name,"findByTelephone",tel) if resp == "null": return None else: #将string类型的数据还原成 字典 或 列表数据 return json.loads(resp) def find_member_count_by_months(self,months): resp = self.dubbo_client.invoke(self.service_name,"findMemberCountByMonths",months) return json.loads(resp) def add(self,info): #自定义类型数据 ''' info:代表用户传入的测试数据,此时没有class元素 :return: ''' #此时自己添加info的 class 类 info["class"] = "com.itheima.pojo.Member" resp = self.dubbo_client.invoke(self.service_name,"add",info) if resp == "null": return True else: return False if __name__ == "__main__": ms = MemberService() print(ms.find_by_telephone())
预约设置服务类(同上)
#导包 import json from base_service import BaseService class OrderSettingService(BaseService): #重写(扩展式) def __init__(self): super().__init__() #继承父类 self.service_name = "OrderSettingService" #服务名,多个方法使用 #封装服务类下面的方法 def edit_number_by_date(self,date): #给date添加class类 date["class"] = "com.itheima.pojo.OrderSetting" resp = self.dubbo_client.invoke(self.service_name,"findByTelephone",date) if resp == "Failed": return False else: #将string类型的数据还原成 字典 或 列表数据 return True def get_order_setting_by_month(self,months): resp = self.dubbo_client.invoke(self.service_name,"getOrderSettingByMonth",months) if resp == "Failed": return None else: return json.loads(resp) def add(self,data_list): #自定义类型数据 resp = self.dubbo_client.invoke(self.service_name,"add",data_list) if resp == "Failed": return False else: return True if __name__ == "__main__": ms = OrderSettingService()
3、测试脚本层
创建 test_itheima_health.py
import unittest #导入测试接口 from test01 import OrderSettingService #封装测试类 class TestFindByTelephone(unittest.TestCase): #定义类属性,用了setUpClass ms = None @classmethod def setUpClass(cls) -> None: #创建类实例(赋值给类属性)#由于不是类方法,所以只能导入类包,通过实例化类对象获取方法 cls.ms = OrderSettingService() #手机号已存在 def test01_tel_exists(self): resp = self.ms.add(data_list=["2019-09"]) #print(resp) self.assertEqual("2019-09",resp.get("date")) #由于响应结果本身就是字典格式,所以不需要resp.json().get() #手机号不存在 def test02_tel_not_exists(self): resp = self.ms.add(data_list="12132453536") #print(resp) self.assertEqual(None,resp) #手机号特殊字符 def test03_tel_special_char(self): resp = self.ms.add(data_list="1213245abc") #print(resp) self.assertEqual(None,resp)
4、参数化
测试脚本层就可以写成通用测试方法(也可以将参数写成一个单独的文件,调用方法读取然后传入参数化)
import unittest #导入测试接口 from test01 import OrderSettingService #导入参数化包 from parameterized import parameterized #封装测试类 class TestFindByTelephone(unittest.TestCase): #定义类属性,用了setUpClass ms = None @classmethod def setUpClass(cls) -> None: #创建类实例(赋值给类属性)#由于不是类方法,所以只能导入类包,通过实例化类对象获取方法 cls.ms = OrderSettingService() #手机号已存在 @parameterized.expand([("2019-09"),("2019-09"), ("2019-09"),None, ("2019-09"),None ]) def test01_tel_all_way(self,data_list,expect_data): resp = self.ms.add(data_list) #print(resp) if resp is None: self.assertEqual(expect_data,resp) # else: self.assertEqual(expect_data,resp.get("data")) #由于响应结果本身就是字典格式,所以不需要resp.json().get()
5、生成测试报告
run_suite.py文件写脚本
#导包 import unittest #导入测试脚本 from test_itheima_health import TestFindByTelephone from htmltestreport import HTMLTestReport #创建suite实例 suite = unittest.TestSuite() #添加测试用例 suite.addTest(unittest.makeSuite(TestFindByTelephone)) #创建HTMLTESTREPORT runnner = HTMLTestReport("./report/健康小程序.html",description="描述",title="标题") runnner.run(suite)