文章目录
一、前言
测试工程师每天都跟不同的环境打交道,比如线上环境,测试环境,预上线环境等等,那么作为自动化测试人员写的代码,我们也要具备能自由切换环境的能力,如何能让我们python语言写的测试用例可以自由切换到不同的环境下面去运行呢?
二、安装
pytest有一个插件叫pytest-base-url ,是管理base_url非常好的一款插件
pip install pytest-base-url
三、使用
第1种:使用方式是终端添加–base-url这个命令
pytest --base-url http://www.baidu.com works
#encoding=utf-8import time
import requests
import pytest
name ="登录"@pytest.fixture(scope="class")defclass_setup_teardown():print(f"\n============= {name} 接口测试开始! ==============")yieldprint(f"\n============= {name} 接口测试结束! ==============")@pytest.mark.usefixtures("class_setup_teardown")classTestWork:deftest_work1(self,base_url):
resp=requests.get(base_url)print(base_url)
resp_code=resp.status_code
assert resp_code==200if __name__ =='__main__':
pytest.main()
执行结果:
第2种:使用方式是在pytest.ini配置文件种去配置base_url,然后自动读取url的数据,这样就不用添加–base-url这个命令行参数了:
#encoding=utf-8import time
import requests
import pytest
name ="登录"@pytest.fixture(scope="class")defclass_setup_teardown():print(f"\n============= {name} 接口测试开始! ==============")yieldprint(f"\n============= {name} 接口测试结束! ==============")@pytest.mark.usefixtures("class_setup_teardown")classTestWork:deftest_work1(self,base_url):
resp=requests.get(base_url)print(base_url)
resp_code=resp.status_code
assert resp_code==200if __name__ =='__main__':
pytest.main()
运行命令:
pytest works
第3种:pytest有个hooks函数,可以自定义命令行参数,一般在conftest.py中去引用。
conftest.py中写pytest_addoption这个hooks函数,可以自定义命令行参数,base_url只能对一个url地址进行传递,那么有的项目不仅需要多项目请求的url地址进行不同环境的切换,还需要对mysql的url地址进行不同的切换,这个时候就可以用自定义命令,定义不同的命令行参数,这样我们在执行pytest的时候就可以自由进行传递。
conftest.py
import pytest
@pytest.fixture(scope='session',autouse=True)defmy1_fixture():print('----这是前置方法----')yieldprint('----这是后置方法----')defpytest_addoption(parser):
parser.addoption("--test-url",
action="store",
default="http://www.baidu.com",help="传递项目url")
parser.addoption("--produce-url",
action="store",
default="http://www.sogou.com",help="传递数据库主机名称")
parser.addoption("--develop-url",
action="store",
default="https://www.tencent.com/",help="传递数据库主机名称")# 获取 pytest.ini 配置参数@pytest.fixture(scope="session")defget_url(request):
test_url = request.config.getoption('--test-url')
produce_url = request.config.getoption('--produce-url')
develop_url = request.config.getoption('--develop-url')print("\n读取到配置文件的测试url地址:%s"% test_url)print("\n读取到配置文件的生产url地址:%s"% produce_url)print("\n读取到配置文件的开发url地址:%s"% develop_url)return test_url,produce_url,develop_url
test_work.py
#encoding=utf-8import time
import requests
import pytest
name ="登录"@pytest.fixture(scope="class")defclass_setup_teardown():print(f"\n============= {name} 接口测试开始! ==============")yieldprint(f"\n============= {name} 接口测试结束! ==============")@pytest.mark.usefixtures("class_setup_teardown")classTestWork:deftest_work1(self,get_url):
resp=requests.get(get_url[0])print(get_url[1])
resp_code=resp.status_code
assert resp_code==200if __name__ =='__main__':
pytest.main()
第4种:通过yml文件和fixture进行配合使用
如果需要改环境,直接在con.yml中改参数即可(develop\test\produce)
conftest.py
import pytest
import yaml
@pytest.fixture(scope='session',autouse=True)defmy1_fixture():print('----这是前置方法----')yieldprint('----这是后置方法----')@pytest.fixture(scope="session")defconfig():withopen(r'D:\project_development\api_pytest\conf.yml',"r",encoding="utf-8")as f:
conf=yaml.load(f,Loader=yaml.FullLoader)return conf
@pytest.fixture(scope="session")defenv_vars(config):
env=config["env"]
mapping={"test":{"base_url":"http://www.baidu.com","mysql_url":"127.0.0.1",},"develop":{"base_url":"http://www.sogou.com","mysql_url":"127.0.0.2",},"produce":{"base_url":"http://www.tencent.com","mysql_url":"127.0.0.3",},}
base_url=mapping[env]['base_url']
mysql_url=mapping[env]['mysql_url']return base_url,mysql_url
test_work.py
#encoding=utf-8import time
import requests
import pytest
name ="登录"@pytest.fixture(scope="class")defclass_setup_teardown():print(f"\n============= {name} 接口测试开始! ==============")yieldprint(f"\n============= {name} 接口测试结束! ==============")@pytest.mark.usefixtures("class_setup_teardown")classTestWork:deftest_work1(self,env_vars):
resp=requests.get(env_vars[0])print(env_vars[0])print(env_vars[1])
resp_code=resp.status_code
assert resp_code==200if __name__ =='__main__':
pytest.main()
版权归原作者 敲代码敲到头发茂密 所有, 如有侵权,请联系我们删除。