一. @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
三.废话少说,实战练习下 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():
def __init__(self,yaml_file):
self.yaml_file = yaml_file
def Yaml_Read(self):
with open(self.yaml_file,encoding='utf-8') as f:
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():
def __init__(self,yaml_file):
self.yaml_file = yaml_file
def Yaml_Read(self):
with open(self.yaml_file,encoding='utf-8') as f:
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.接下来,要把报告导出来。 学习中。。。待更新
|