框架结构(如图):
接口测试框架的结构说明:
—API用于封装被测系统的接口(requests模块封装的请求方法)
—TestCase将一个或多个接口封装成测试用例,并使用UnitTest管理测试用例TestCase可以调用数据库进行数据的效验
—为了方便维护测试数据,可以把测试脚本和测试数据分离开
—通过UnitTest断言接口返回的数据,并生成测试报告
框架目录结构
封装登录接口案例
按照功能模块定义封装被测系统的接口,方便测试脚本的调用,并且能够达到代码的复用。对登录功能的相关接口进行封装,示例代码:
在login文件中写入: class LoginApi(object): # 初始化 def __init__(self): self.verify_code_url = "xxxx" self.login_url = "yyyy" # 登录过程 # 1.获取验证码 # 2.填写必要数据:用户名,密码,验证码 # 3.点击登录按钮 def get_login_verify_code(self,session): return session.get(self.verify_code_url) def login(self,session,username,password,verify_code): data = { "username":username, "password":password, "verify_code":verify_code } return session.post(url=self.login_url,data=data)
登录测试用例
将api模块中的一个或多个接口封装成一个测试用例,并使用测试框架UnitTest管理测试用例。定义登录功能的测试用例。示例代码:
在logintestcase文件中写入: import unittest from requests import Session from api.login import LoginApi class LoginTest(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.login_api = LoginApi() def setUp(self) -> None: self.session = Session() def tearDown(self) -> None: self.session.close() def test_login_success(self): # 请求验证码 response = self.login_api.get_login_verify_code(self.session) self.assertIn("image",response.headers.get("Content-Type")) # 验证码识别:略,8888 # 调用登录方法,发送请求,获取响应数据 res = self.login_api.login(self.session,"13800000002","123456","8888") res = res.json() # 断言 self.assertEqual(200,res.status_code) self.assertEqual(1,res.get("status")) self.assertEqual("登陆成功",res.get("msg"))
集成测试报告
使用HTMLTestRunner生成HTML格式的测试报告
注意:需要将HTMLTestRunner.py文件放置在lib中
在run_suite文件写入: import unittest from scripts import logintestcase from lib.HTMLTestRunner import HTMLTestRunner suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(logintestcase.LoginTest)) f = open('D:/JySoft/P6/P6-Django/apiTestFramework/report/report.html','wb') runner = HTMLTestRunner(stream=f,title="asdadf",description="cdsbhucv") runner.run(suite)
生成报告为:
参数化
参数化分析:
首先,创建json文件存放测试数据,然后构建参数化数据
测试用例实现参数化
# 导包 from parameterized import parameterized def build_data(): with open('../data/data.json','r',encoding='utf-8') as f: content = f.read() data = json.loads(content) d = [(item["username"],item["password"],item["verify_code"],item["status"],item["msg"]) for item in data] return d class LoginTest(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.login_api = LoginApi() def setUp(self) -> None: self.session = Session() def tearDown(self) -> None: self.session.close() @parameterized.expand(build_data) def test_login_success(self,username,password,verify_code,status,msg): # 请求验证码 response = self.login_api.get_login_verify_code(self.session) self.assertIn("image",response.headers.get("Content-Type")) # 验证码识别:略,8888 # 调用登录方法,发送请求,获取响应数据 res = self.login_api.login(self.session,username,password,verify_code) res = res.json() # 断言 self.assertEqual(200,res.status_code) self.assertEqual(status,res.get("status")) self.assertEqual(msg,res.get("msg"))
db数据承载形式实现参数化
—构建数据库数据,执行SQL脚本,将数据写入数据库中
—修改构建数据函数
def build_data(): # 获取数据库的数据 sql = "select * from t_login" db_data = DBUtil.exe_sql(sql) test_data = [] for case_data in db_data: username = case_data[2] password = case_data[3] verify_code = case_data[4] status_code = case_data[5] content_type = case_data[6] status = case_data[7] msg = case_data[8] test_data.append((username,password,verify_code,status_code,content_type,status,msg)) print(test_data) return test_data