前言
在目前互联网公司中,都会存在多个测试环境,那么当我们编写的自动化想要在多套测试环境下进行运行时,如何使用?大多数人想到的可能是通过将我们自动化代码中的地址修改成不同环境,但是这时候就会增加一些工作量,每次运行不同的环境,都需要进行再配置文件中进行修改地址,这样很不方面,今天小编介绍一种pytest的钩子函数,这个函数可以帮助我们很容易的解决这个问题。
pytest_addoption
pytest_addoption是pytest的钩子函数之一,用于为pytest添加自定义选项,并将这些选项传递给测试用例。可以通过修改pytest的配置文件(pytest.ini)或使用命令行参数来设置这些选项。pytest_addoption该函数一般需要和pytest的fixture内置函数request中的request.config.getoption(获取命令行参数信息)进行结合使用。
在上述问题中,我们可以通过在命令行参数中对测试环境地址进行修改,这样就可以在不修改配置文件的情况下,只通过命令行参数进行在不同的测试环境中执行相同的自动化代码。
def pytest_addoption(parser):
parser.addoption(
"--anjing",
action="store",
default="dev",
help="通过'anjing'添加自定义命令行参数名称"
)
参数介绍
pytest_addoption中常用到的一些参数介绍
name:表示自定义命令行参数的名称,一般通过“--xxx”来使用;
action:表示命令行中遇到此参数时要采取的存储该参数对应的参数值的基本操作类型,默认为“store”;
default:表示如何命令行中没有传入该参数的值,则取默认值
help:对参数作用的简介和说明
使用方法
关于pytest_addoption的一些简介和用途已经介绍完毕了,接下来跟着小编一起查看如何使用pytest_addoption来解决我们的问题。
- 需要在conftest.py文件中进行创建一个pytest_addoption函数,对其进行设置对应参数类型
- 通过pytest.fixture创建函数,获取命令行对应参数值
- 通过编写测试用例中调用对应的函数名称
- 命令行执行时,添加对应命令行参数
小编先列举下conftest.py文件中关于pytest_addoption的编写
# conftest.py文件
# coding:utf-8
import pytest
def pytest_addoption(parser):
parser.addoption(
"--anjing", action="store", default="anjing", help="将'anjing'添加到pytest的配置参数中"
)
parser.addoption(
"--env", action="store", default="dev", help="env:表示命令行参数内容,不填写默认输出default的值内容"
)
@pytest.fixture()
def anjing(request):
return request.config.getoption("--anjing")
@pytest.fixture()
def env(request):
return request.config.getoption("--env")
再根据conftest.py文件中的内容编写对应的测试用例
# coding:utf-8
def test_01(anjing):
if anjing == 'test':
print('命令行传参成功!')
else:
print('命令行取默认值!')
def test_02(env):
if env == 'test':
print('传参成功!')
else:
print('传参失败!')
![](https://img2023.cnblogs.com/blog/1171635/202308/1171635-20230831171121222-774409662.png)
通过cmd执行时候,后续进行添加了对应的命令行参数值,这里小编是对两个命令行参数都添加了值,那么如果不添加值会怎么样呢?
![](https://img2023.cnblogs.com/blog/1171635/202308/1171635-20230831171140391-1300464097.png)
通过执行结果可以看出来,当我们没有添加参数时,这里小编忘记打印返回值了,其实会实际输出默认值,就是我们在函数中设置的default
我们上面使用的方法是通过XXX=XXX的格式来输出的,这里我们也可以通过--xxxx 值,参数和值之间通过空格进行输入,结果都是一样的。
![](https://img2023.cnblogs.com/blog/1171635/202308/1171635-20230831171157046-1790745344.png)
案例展示
上述小编是介绍了如何使用,那么我们如何在接口项目中使用呢?小编这里通过一个简单的方法通过项目进行展示,这里小编通过将默认值值变成了请求成功的url地址,添加参数为错误的url地址
# conftest.py文件
# coding:utf-8
import pytest
def pytest_addoption(parser):
parser.addoption(
"--url",
action="store",
default="http://apis.juhe.cn/simpleWeather/query",
help="将'anjing'添加到pytest的配置参数中"
)
@pytest.fixture()
def anjing(request):
return request.config.getoption("--url")
conftest.py文件中我们将默认请求成功的地址写入到默认值中,然后继续编写接口请求地址,在添加一个命令行参数的函数
# test_01.py文件
# coding:utf-8
import requests
def test_01(anjing):
data = {
'city': "上海",
'key': '331eab8f3481f37868378fcdc76cb7cd'
}
r = requests.post(anjing, data=data)
result = r.json()['reason']
assert result == '查询成功!'
通过cmd进行运行程序,我们先不添加任何命令行参数,让其请求默认参数值的内容,发现测试用例请求成功了。
![](https://img2023.cnblogs.com/blog/1171635/202308/1171635-20230831171249234-979375939.png)
接下来我们通过随便在命令行参数后跟一个不正确的url地址,去模拟请求,这里肯定是无法请求成功的,因为我们请求的百度,不能请求成功。(主要模拟测试环境场景)
![](https://img2023.cnblogs.com/blog/1171635/202308/1171635-20230831171314842-826961974.png)
总结
小编通过简单的方法介绍了如何使用pytest_addoption进行来模拟不同测试环境下,我们如何进行执行我们的测试用例,当然pytest_addoption的用途不仅仅只有这么多,具体如何使用,大家可以根据自己公司内容的项目进行结合使用。感谢您的阅读,希望本篇文章对您有所帮助。