一、python+requests模块
(1)requests全局观
安装:pip install requests
1.发送请求
①requests.get() 发送get请求
②requests.post() 发送post请求
data和json的区别:取绝于你需要传递的参数的类型。files:文件上传-----------------------form-data:表单和文件上传x-www-form-urlencoded:纯表单raw: json (参数为Json)binary: 把文件转化成二进制传输③requests.delete() 发送delete请求
④requests.put() 发送put请求
前面的四个方法底层其实都是调用下面这个方法⑤requests.request 最核心的方法
上面这个方法调用的是下面这个方法(区别在于,这个方法能够自动化的关联有cookie关联的接口。)session.request(method=method, url=url, **kwargs)method=method, 请求方式url=url, 请求路径params=None, get请求传参data=None, post或者put请求传参json=None post请求传参23 headers=None, 请求头24 cookies=None, Cookie25 files=None, 文件上传26 -----------------------27 auth=None, 鉴权28 timeout=None, 超时处理29 allow_redirects=True, 是否允许重定向30 proxies=None, 设置代理31 hooks=None, 钩子32 stream=None, 文件下载33 verify=None, 证书验证34 cert=None, CA证书35生成一个session对象requests.session()2.接收响应:response对象
1 print ( res . text ) 返回的文本信息2 print ( res . json ()) 返回的 json 格式3 print ( res . content ) 返回的字节内容4 print ( res . status_code ) 返回的状态码5 print ( res . reason ) 返回的状态信息6 print ( res . cookies ) 返回的 cookie7 print ( res . encoding ) 返回编码格式8 print ( res . headers ) 返回响应头9 print ( res . request . 请求数据 ) 返回请求数据
(2)接口自动化实战以及正则和Jsonpath提取器的应用
五、代码实现接口自动化(黑马程序员)
视频网址:032_接口自动化测试基础介绍_哔哩哔哩_bilibili
(1)基础介绍
(2)接口自动化测试框架介绍
(3)requests入门
(4)接口对象封装--登录
接口对象层
#接口封装时,重点是依据接口文档封装接口信息,需要使用的测试数据是从测试用例传递的、接口方法被调用时需要返回对应的响应结果 #导包 import requests #创建接口类 class LoginAPI: def __init__(self): # 指定url基本信息 self.url_verify="http://kdtx-test.itheima.net/api/captchaImage" self.url_login="http://kdtx-test.itheima.net/api/login" #验证码 def get_verify_code(self): return requests.get(url=self.url_verify) #登录 def login(self,test_data): return requests.post(url=self.url_login,json=test_data)
测试脚本层
#导包 from api.login import LoginAPI #创建测试类 class TestContractBusiness: #前置处理 def setup(self): #实例化接口对象 self.login_api=LoginAPI() #后置处理 def teardown(self): pass #登录成功 def test01_login_success(self): #获取验证码 res_v=self.login_api.get_verify_code() print(res_v.status_code) print(res_v.json()) #打印uuid数据 print(res_v.json().get("uuid")) #登录 login_data={ "username":"admin", "password":"HM_2023_test", "code":"2", "uuid":res_v.json().get("uuid") } res_l=self.login_api.login(test_data=login_data) print(res_l.status_code) print(res_l.json())
(5)合同新增业务
课程添加--接口封装
#课程模块接口封装:核心在于依据接口文档实现接口信息封装,重点关注接口如何被调用 #导包 import requests #创建接口类 class CourseAPI: #初始化 def __init__(self): self.url_add_course="http://kdtx-test.itheima.net/api/clues/course" #课程添加 def add_course(self,test_data,token): return requests.post(url=self.url_add_course,json=test_data,headers={"Authorization":token})
课程添加--测试脚本
#导包 from api.login import LoginAPI from api.course import CourseAPI #创建测试类 class TestContractBusiness: #初始化 token=None #前置处理 def setup(self): #实例化接口对象 self.login_api=LoginAPI() self.course_api=CourseAPI() #后置处理 def teardown(self): pass #登录成功 def test01_login_success(self): #获取验证码 res_v=self.login_api.get_verify_code() print(res_v.status_code) print(res_v.json()) #打印uuid数据 print(res_v.json().get("uuid")) #登录 login_data={ "username":"admin", "password":"HM_2023_test", "code":"2", "uuid":res_v.json().get("uuid") } res_l=self.login_api.login(test_data=login_data) print(res_l.status_code) print(res_l.json()) #提取登录成功之后的token数据并保存在类的属性中 TestContractBusiness.token=res_l.json().get("token") print(TestContractBusiness.token) #2.课程新增成功 def test02_add_course(self): add_data={"name":"测试开发提升课01","subject":"6","price":899,"applicablePerson":"2","info":"测试开发提升课01"} response=self.course_api.add_course(test_data=add_data,token=TestContractBusiness.token) print(response.json())
合同上传--封装与调用
封装
#导包 import requests #创建接口类 class ContractAPI: #初始化 def __init__(self): self.url_upload="http://kdtx-test.itheima.net/api/common/upload" #合同上传接口 def upload_contract(self,test_data,token): return requests.post(url=self.url_upload,files={"file":test_data},headers={"Authorization":token})
调用
#导包 from api.login import LoginAPI from api.course import CourseAPI from api.contract import ContractAPI #创建测试类 class TestContractBusiness: #初始化 token=None #前置处理 def setup(self): #实例化接口对象 self.login_api=LoginAPI() self.course_api=CourseAPI() self.contract_api=ContractAPI() #后置处理 def teardown(self): pass #登录成功 def test01_login_success(self): #获取验证码 res_v=self.login_api.get_verify_code() print(res_v.status_code) print(res_v.json()) #打印uuid数据 print(res_v.json().get("uuid")) #登录 login_data={ "username":"admin", "password":"HM_2023_test", "code":"2", "uuid":res_v.json().get("uuid") } res_l=self.login_api.login(test_data=login_data) print(res_l.status_code) print(res_l.json()) #提取登录成功之后的token数据并保存在类的属性中 TestContractBusiness.token=res_l.json().get("token") print(TestContractBusiness.token) #2.课程新增成功 def test02_add_course(self): add_data={"name":"测试开发提升课01","subject":"6","price":899,"applicablePerson":"2","info":"测试开发提升课01"} response=self.course_api.add_course(test_data=add_data,token=TestContractBusiness.token) print(response.json()) #3.上传合同成功 def test03_upload_contract(self): #读取pdf文件数据 f=open("../data/test.pdf","rb") response=self.contract_api.upload_contract(test_data=f,token=TestContractBusiness.token) print(response.json())
合同新增--封装与调用
封装
#导包 import requests #创建接口类 class ContractAPI: #初始化 def __init__(self): self.url_upload="http://kdtx-test.itheima.net/api/common/upload" self.url_contract="http://kdtx-test.itheima.net/api/contract" #合同上传接口 def upload_contract(self,test_data,token): return requests.post(url=self.url_upload,files={"file":test_data},headers={"Authorization":token}) #合同新增 def add_contract(self,test_data,token): return requests.post(url=self.add_contract,json=test_data,headers={"Authorization":token})
调用
#导包 from api.login import LoginAPI from api.course import CourseAPI from api.contract import ContractAPI #创建测试类 class TestContractBusiness: #初始化 token=None #前置处理 def setup(self): #实例化接口对象 self.login_api=LoginAPI() self.course_api=CourseAPI() self.contract_api=ContractAPI() #后置处理 def teardown(self): pass #登录成功 def test01_login_success(self): #获取验证码 res_v=self.login_api.get_verify_code() print(res_v.status_code) print(res_v.json()) #打印uuid数据 print(res_v.json().get("uuid")) #登录 login_data={ "username":"admin", "password":"HM_2023_test", "code":"2", "uuid":res_v.json().get("uuid") } res_l=self.login_api.login(test_data=login_data) print(res_l.status_code) print(res_l.json()) #提取登录成功之后的token数据并保存在类的属性中 TestContractBusiness.token=res_l.json().get("token") print(TestContractBusiness.token) #2.课程新增成功 def test02_add_course(self): add_data={"name":"测试开发提升课01","subject":"6","price":899,"applicablePerson":"2","info":"测试开发提升课01"} response=self.course_api.add_course(test_data=add_data,token=TestContractBusiness.token) print(response.json()) #3.上传合同成功 def test03_upload_contract(self): #读取pdf文件数据 f=open("../data/test.pdf","rb") response=self.contract_api.upload_contract(test_data=f,token=TestContractBusiness.token) print(response.json()) #4.合同新增成功 def test04_add_contract(self): #contractNo:数据唯一 add_data={"name":"测试888","phone":"13870630671", "contractNo":"HT2112603","subject":"6","courseId":"99", "channel":"0","activityId":77,"fileName":"文件" } response=self.contract_api.add_contract(test_data=add_data,token=TestContractBusiness.token) print(response.json())
(6)登录单接口测试
#导包 from api.login import LoginAPI #创建测试类 class TestLoginAPI: #初始化 uuid=None #前置处理 def setup(self): #实例化接口类 self.login_api=LoginAPI() #获取验证码 response=self.login_api.get_verify_code() print(response.json()) #提取验证码接口返回的uuid参数值 TestLoginAPI.uuid=response.json().get("uuid") print(TestLoginAPI.uuid) #后置处理 def teardown(self): pass #登录成功 def test01_success(self): login_data={ "username":"admin", "password":"HM_2023_test", "code":"2", "uuid":TestLoginAPI.uuid } response=self.login_api.login(test_data=login_data) #断言响应状态码为200 assert 200 == response.status_code #断言响应数据包含‘成功’ assert '成功' in response.text #断言响应json数据中code值 assert 200 == response.json().get("code") #登录失败(用户名为空) def test01_success(self): login_data={ "username":"", "password":"HM_2023_test", "code":"2", "uuid":TestLoginAPI.uuid } response=self.login_api.login(test_data=login_data) #断言响应状态码为200 assert 200 == response.status_code #断言响应数据包含‘错误’ assert '错误' in response.text #断言响应json数据中code值 assert 500 == response.json().get("code") #登录失败(未注册用户) def test01_success(self): login_data = { "username": "jack666", "password": "HM_2023_test", "code": "2", "uuid": TestLoginAPI.uuid } response = self.login_api.login(test_data=login_data) # 断言响应状态码为200 assert 200 == response.status_code # 断言响应数据包含‘错误’ assert '错误' in response.text # 断言响应json数据中code值 assert 500 == response.json().get("code")
数据驱动实现
#导包 from api.login import LoginAPI import pytest #测试数据 test_data=[ ("admin","HM_2023_test",200,'成功',200), ("","HM_2023_test",200,"错误",500), ("jack666","HM_2023_test",200,"错误",500), ] #创建测试类 class TestLoginAPI: #初始化 uuid=None #前置处理 def setup(self): #实例化接口类 self.login_api=LoginAPI() #获取验证码 response=self.login_api.get_verify_code() print(response.json()) #提取验证码接口返回的uuid参数值 TestLoginAPI.uuid=response.json().get("uuid") print(TestLoginAPI.uuid) #后置处理 def teardown(self): pass #登录成功 @pytest.mark.parametrize("username,password,status,message,code",test_data) def test01_success(self,username,password,status,message,code): login_data={ "username":username, "password":password, "code":"2", "uuid":TestLoginAPI.uuid } response=self.login_api.login(test_data=login_data) #断言响应状态码为200 assert status == response.status_code #断言响应数据包含‘成功’ assert message in response.text #断言响应json数据中code值 assert code == response.json().get("code")
json文件实现数据驱动
修改代码
完整代码
#导包 from api.login import LoginAPI import pytest import json # #测试数据 # test_data=[ # ("admin","HM_2023_test",200,'成功',200), # ("","HM_2023_test",200,"错误",500), # ("jack666","HM_2023_test",200,"错误",500), # ] #读取json文件 def build_data(json_file): #定义空列表 test_data=[] #打开json文件 with open(json_file, 'r', encoding='utf-8') as f: #加载json文件数据 json_data=json.load(f) #循环遍历测试数据 for case_data in json_data: #转换数据格式[{},{}]==>[(),()] username=case_data.get("username") password=case_data.get("password") status=case_data.get("status") message=case_data.get("message") code=case_data.get("code") test_data.append((username,password,status,message,code)) #返回处理之后的测试数据 return test_data #创建测试类 class TestLoginAPI: #初始化 uuid=None #前置处理 def setup(self): #实例化接口类 self.login_api=LoginAPI() #获取验证码 response=self.login_api.get_verify_code() print(response.json()) #提取验证码接口返回的uuid参数值 TestLoginAPI.uuid=response.json().get("uuid") print(TestLoginAPI.uuid) #后置处理 def teardown(self): pass #登录成功 @pytest.mark.parametrize("username,password,status,message,code",build_data(json_file="../data/login.json")) def test01_success(self,username,password,status,message,code): login_data={ "username":username, "password":password, "code":"2", "uuid":TestLoginAPI.uuid } response=self.login_api.login(test_data=login_data) #断言响应状态码为200 assert status == response.status_code #断言响应数据包含‘成功’ assert message in response.text #断言响应json数据中code值 assert code == response.json().get("code")
(7)课程管理
①课程添加接口自动化测试
②课程查询列表单接口自动化测试
③课程修改单接口自动化测试
④课程删除单接口自动化测试
(8)项目配置文件
(9)Allure测试报告
报错及其解决
(1)pip install requests出错
原因:版本不够高,SSL缺失
解决方法:安装最新版本python后解决
解决方法:
更新 pip: 使用 Python 解释器自带的
pip
版本更新命令来确保pip
是最新的:python -m pip install --upgrade pip
修复 pip 安装: 可以尝试修复pip
的安装,有时候重新安装pip
可能会解决问题:python -m pip install --force-reinstall pip
(2)PyCharm添加python解释器时出现[unsupported]
原因:Pycharm版本与python3.12.4不兼容
解决方法:下载更高版本的Pycharm,比如Pycharm2023.1