pytest接口测试中切换测试环境
pytest-base-url 是pytest的第三方插件,主要用来帮助我们进行切换测试环境地址,其中配置方法存在两种,一种直接在命令行中进行添加url参数
import requests import pytest from data_driver.yamalread import load_yaml class TestApi: @pytest.mark.parametrize('api_info',load_yaml('../Data/api_base.yaml')) def test_baidu(self,base_url,api_info): url= base_url headers=api_info['request']['headers'] rep = requests.get(url=url,headers=headers) print(rep.status_code) if __name__ == '__main__': # pytest.main(['vs','--base-url','https://www.baidu.com/','test_baseapi.py']) pass
接下来命令行输入:
也就是:
我们看到接口已通过了
另外一种方式:
https://baijiahao.baidu.com/s?id=1744257445555898707&wfr=spider&for=pc
下面尝试使用:
- 用户通过pytest命令行传入参数驱动脚本执行(pytest_addoption用于实现自定义命令行参数);
- fixture函数get_env用于获取用户输入的命令行参数,传递给fixture.py中的各个fixture函数;
- fixture.py中的各个fixture函数根据get_env提供的环境参数值,解析测试环境对应的数据文件内容:URL(get_url)、账号(get_user)、数据库配置(get_db),同时传递给api类(api_module_A...B...C)、登录方法(login)、数据库连接方法(use_db)等,用于实例化操作,这部分fixture函数再传递给测试用例,用于用例前后置操作(相当于setup/teardown);
- 最后测试用例再根据各个fixture函数返回的实例对象、配置信息,调用各个模块的api函数,执行测试,并读写数据库实现数据校验、断言,从而最终实现切换环境策略;
具体实现步骤:先创建一个conftest.py文件(固定写法,不能改名),用然后在定义hook函数(钩子函数)
def pytest_addoption(parser): ''' parser.addoption 为固定写法, :param parser: 第一个参数是命名参数名称 ,default 指的是默认哪个参数, choices 指的是参数范围,例如必须在fat 1,2,3中选, help 指说明 :return: ''' parser.addoption('--env',default='fat1',choices=['fat1','fat2','fat3'],help='测试环境参数') #在conftest.py中定义get_env的fixture函数,用来获取用户在命令行输入的参数值, @pytest.fixture(scope="session") def get_env(request): # request.config.getoption()是pytest框架中的一个方法,用于获取命令行选项的值 return request.config.getoption("--env")
conftest.py无需导入,可直接引用,创建在根目录的可全局引用,但是不能反向目录引用。
那么来在用例中引用:
import pytest class TestEnv(): def test_env(self,get_env): print('这是一个测试用例') print(f"The current environment is: {get_env}") if __name__ == '__main__': pass
然后输入命令执行:
pytest -s -v --env fat1 test_env.py
那么下一步我们可以把项目中常用的环境关联数据给带入进来,比如 接口host,数据库信息,等等
这里为了理解直观,就不在做conf模块去读取这些配置内容,直接创建一个setting.py文件用来存放
然后修改一个测试用例:
# 导入seting模块中的配置映射数据 import setting import pytest class TestEnv(): def test_env(self,get_env): print('这是一个测试用例') print(f"The current environment is: {get_env}") print(setting.hosts[get_env]) if __name__ == '__main__': pass
再次运行看结果:这次切换到fat2环境:
好的,直接已经将fat2的具体值已经传进用例当中了。这就实现了通过自定义命令行参数实现环境切换。