一. @pytest.mark. parametrize() 基本用法
示例1:
import pytest
class TestApi():
@pytest.mark.parametrize('args',['111','222','333'])
def test_api_01(self,args):
print(args)
if __name__ == '__main__':
pytest.main()
示例2:
import pytest
class TestApi():
@pytest.mark.parametrize('name,age',[['张三','18'],['李四','19'],['王五','21']])
def test_api_01(self,name,age):
print(name,age)
if __name__ == '__main__':
pytest.main()
二. YAML文件详解–实现接口自动化
1.用于全局的配置文件 ini/yami
2.用于写测试用例(接口测试用例居多)
yaml是一种数据格式,支持注释、换行、多行字符串、裸字符串(整形、字符串)
语法规则:
1.区分大小写
2.不能使用Tab缩进,只能用空格
3.注释为#
数据组成:
1.Map对象,键值对(键+:+空格+值)
2. - 表示数组
- test:
- one: 1
- two: 2
@pytest.mark.parametrize(args_name,args_value)
args_name:参数名称
args_value:参数的值
三.废话少说,实战练习下
1.创建文件夹【Testcase】,然后创建【test_api.py】。
test_api.py 代码:
import requests
import pytest
class TestApi:
def test_login(self):
url = "http://apis.juhe.cn/****/***"
headers = None
params = {
'key': '从聚合数据拿',
'phone': '13000000000'
}
result = requests.get(url=url,params=params)
# 输出一下响应结果
print(result.text)
if __name__ == '__main__':
pytest.main()
运行一下,诶!接口能用哈!
2.【Testcase】下,创建一个【run.py】文件。
run.py 代码:
import pytest
if __name__ == '__main__':
pytest.main()
运行一下,发现能调用测试文件,不错不错。
3. 【Testcase】同级目录,创建pytest的配置文件【pytest.ini】,这样就可以自定义配置一些东西了
pytest.ini 代码:
[pytest]
addopts = -vs
#测试用例文件夹
testpaths = ./Testcase
#配置测试搜索的模块文件名称
python_files = test_*.py
#配置测试搜索的测试类名
python_classes = Test*
#配置测试搜索的测试函数名
python_functions = test
- 【Testcase】同级目录,创建文件【test.txt】,这里是pytest 用到的一些插件。
test.txt :
pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
allure-pytest
pytest
pytest-html 生成HTML格式的自动化测试报告
pytest-xdist 测试用例分布式执行,多CPU分发
pytest-ordering 用于改变测试用例的执行顺序
pytest-rerunfailures 用于用例失败后的重跑
allure-pytest 用于生成美观的测试报告
这个需要运行一下,进行安装。
打开终端,输入命令:
pip install -r test.txt
5.继续接第2步哈,接口运行没问题了。尝试把url、headers、params放在一个yaml文件中,然后进行读取。
在【Testcase】下,创建【test_api.yaml】文件,并写入数据,参考Yaml文件详解。
test_api.yaml 代码:
-
url: http://apis.juhe.cn/***/***
params:
key: '****************'
phone: 13000000000
6.数据有了,但是还得读取出来。在【Testcase】下,创建【yaml_read.py】
yaml_read.py 代码:
import yaml
class YamlRead():
# 传入yaml文件
def __init__(self,yaml_file):
# 通过init方法把yaml文件传到这个类
self.yaml_file = yaml_file
# 读取yaml文件
def Yaml_Read(self):
# 打开yaml 文件作为 f
with open(self.yaml_file,encoding='utf-8') as f:
# 读取文件并加载出来到 value
value = yaml.load(f, Loader=yaml.FullLoader)
print(value)
if __name__ == '__main__':
YamlRead('./test_api.yaml').Yaml_Read()
运行一下,发现可以得到【test_api.yaml】中的数据。
7.然后回到【test_api.py】,最关键的@pytest.mark.parametrize()
【test_api.py】修改代码如下:
import requests
import pytest
from yaml_read import YamlRead
@pytest.mark.parametrize('data',YamlRead('./test_api.yaml').Yaml_Read())
class TestApi:
def test_login(self, data):
url = data['url']
params = data['params']
result = requests.get(url=url,params=params)
# 输出一下响应结果
print(result.text)
if __name__ == '__main__':
pytest.main()
【test_api.py】修改代码如下:
import yaml
class YamlRead():
# 传入yaml文件
def __init__(self,yaml_file):
# 通过init方法把yaml文件传到这个类
self.yaml_file = yaml_file
# 读取yaml文件
def Yaml_Read(self):
# 打开yaml 文件作为 f
with open(self.yaml_file,encoding='utf-8') as f:
# 读取文件并加载出来到 value
value = yaml.load(f, Loader=yaml.FullLoader)
return value
然后运行一下【test_api.py】中的if name == ‘main’,发现可以返回正确数据了。(自己提前复制一份,进行一下修改前后的对比哈)
8.一般我们不会这样调用,我们需要运行的只是【run.py】
首先我们把【test_api.py】中的 if 删掉
if __name__ == '__main__':
pytest.main()
删除或者注释。
然后运行【run.py】,发现报错了,找不到文件。
FileNotFoundError: [Errno 2] No such file or directory: ‘./test_api.yaml’
那就修改下【test_api.py】中的路径
@pytest.mark.parametrize('data',YamlRead('./test_api.yaml').Yaml_Read())
修改为绝对路径(原因我也不清楚,有知道的小伙伴,麻烦指教下我哈)
@pytest.mark.parametrize('data', YamlRead("/***/***/***/***/Testcase/test_api.yaml").Yaml_Read())
或者
@pytest.mark.parametrize('data', YamlRead(os.getcwd()+'/Testcase/test_api.yaml').Yaml_Read())
然后就可以完美运行了。
9.接下来,要把报告导出来。
学习中。。。待更新