背景说明: 1、为了防止三天打鱼两天晒网式学习 2、每日更新1-2个小知识点或者案例 3、只看和跟着做的理解程度是不一样的 4、建议一起打卡练习 5、互相督促打卡 + v:yifuqiang2021
基于UnitTest的JsonPath应用 yml文件的数据参数化 基于Jsonpath获取数据的关键字
准备yaml文件 安装命令 pip install ddt pip install PyYAML 代码实现
-
'username':'admin',
'password':'123456'
-
'username':'sean',
'password':'123456'
-
'username':'jay',
'password':'123456'
pip install ddt
pip install PyYAML
-- case_demo.py的代码
import unittest
from ddt import ddt,file_data
from api_key import Apikey
@ddt
class ApiCase(unittest.TestCase):
@classmethod
# 执行函数方法前,先执行一次setUpClass(cls)里面的方法,进行实例化对象
def setUpClass(cls) -> None:
cls.ak = Apikey()
@file_data('user.yaml')
def test_1(self, username,password):
url = 'http://39.98.138.157:5000/api/login'
data = {
'username': username,
'password': password
}
res = self.ak.do_post(url=url, json=data)
print(res.text)
name = res.json()['info']['name']
print(name)
if __name__ == '__main__':
unittest.main()

--在api_key.py中新增代码
# 基于Jsonpath获取数据的关键字,用于提取所有需要的内推
def get_text(self,json_data,key):
# jsonpath获取数据的表达式:成功则返回list,失败则返回false
value = jsonpath.jsonpath(json_data,'$..{0}'.format(key))
if value:
if len(value) == 1:
return value[0]
return value
return value
--在case_demo.py中新增
# 获取响应中的结果,用于校验是否成功
name = self.ak.get_text(res.json(),'name')
print(name)
# 添加断言,有name的就是成功
self.assertTrue(name)

从yaml文件中的期望响应结果来进行断言 json提前提取,包容非json转换的异常报错
-- 修改user.yaml
-
user:
username: admin
password: '123456'
msg: success
-
user:
username: admin1
password: '1234561'
msg: 用户名或密码错误
-
user:
username: admin2
password: '1234562'
msg: 用户名或密码错误
--api_key.py
# 基于JsonPath获取数据的关键字:用于提取所有需要的内容
def get_text(self, txt, key):
try:
txt = json.loads(txt)
value = jsonpath.jsonpath(txt, '$..{0}'.format(key))
if value:
if len(value) == 1:
return value[0]
return value
except Exception as e:
return e
return value
--case_demo.py
import unittest
from ddt import ddt,file_data
from api_key import Apikey
@ddt
class ApiCase(unittest.TestCase):
@classmethod
# 执行函数方法前,先执行一次setUpClass(cls)里面的方法,进行实例化对象
def setUpClass(cls) -> None:
cls.ak = Apikey()
@file_data('user.yaml')
def test_1(self, user, msg):
# ak = ApiKey()
url = 'http://39.98.138.157:5000/api/login'
data = {
'username': user['username'],
'password': user['password']
}
res = self.ak.do_post(url=url, json=data)
print(res.text)
# 获取响应中的结果,用于校验是否成功
msg1 = self.ak.get_text(res.text, 'msg')
print(msg1)
self.assertEqual(msg1, msg, msg='异常')
if __name__ == '__main__':
unittest.main()


原因:
运行的时候光标的位置放在 ApiCase 方法里面了
加了ddt后,运行时要先识别装饰的类,将光标放在某一个方法后面的话,测试用例只会执行当前的方法,ddt识别不到类,就会报错
解决办法
将光标放到ddt方法的外面,则运行通过
api_key.py用来封装函数 case_demo.py用来处理测试用例,在unittest框架下调用封装的函数
yml文件的数据参数化 导包:from ddt import ddt,file_data class前带@ddt 函数前带 @file_data('user.yaml') 函数传参(self,yaml文件里的字段1,yaml文件里的字段2) 基于Jsonpath获取数据的关键字 封装函数来处理json的内容 通过封装函数后的结果进行断言处理
文章转载自走向易富强之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。