首页 > 编程语言 >Python中pytest命令行实现环境切换

Python中pytest命令行实现环境切换

时间:2024-01-03 10:38:05浏览次数:33  
标签:命令行 get Python fixture pytest user env def


前言

在自动化测试过程中经常需要在不同的环境下进行测试验证,所以写自动化测试代码时需要考虑不同环境切换的情况。pytest钩子函数pytest_addoption可以很好帮我们解决这个痛点。


pytest_addoption(parser, pluginmanager)

注册argparse样式选项和ini样式配置值,在测试运行开始时调用一次。

注意:

由于pytest在启动过程中如何发现插件,因此该函数只能在位于测试根目录的插件或conftest.py文件中实现。

参数

parser(pytest.parser)–若要添加命令行选项,请调用parser.addoption(…)。若要添加ini文件值,请调用解析器.addini(…)。

pluginmanager(pytest.PytestPluginManager)–pytest插件管理器,可用于安装hookspec()或hookpimpl(),并允许一个插件调用另一个插件的钩子来更改命令行选项的添加方式。

以后可以分别通过配置对象访问选项:

config.getoption(name)来检索命令行选项的值。

config.getini(name)来检索从ini样式文件中读取的值。

config对象通过.config属性在许多内部对象上传递,或者可以作为pytestconfig fixture检索。


在conftest.py文件中定义命令行参数

def pytest_addoption(parser):
"""
添加命令行参数
parser.addoption为固定写法
default 设置一个默认值,此处设置默认值为sit
choices 参数范围,传入其他值无效
help 帮助信息
"""
parser.addoption(
"--env", default="sit", choices=["dev", "sit", "uat"], help="环境参数"
)

我们定义了不同环境下的命令参数:dev、sit、uat,我们怎么获取运行的命令行参数呢?


获取命令行参数

@pytest.fixture(scope="session")
def get_env(request):
return request.config.getoption("--env")


设置不同环境的全局变量

在不同的测试环境下,URL、用户信息等数据都是不一样的,建议在conftest中给全局变量赋值可以减少代码冗余。

先定义一个数据文件,data_util.py分别获取用户信息和URL信息

def get_env():
env = {
'sit': 'www.baidu.com',
'uat': 'www.hao123.com'
}
return env
def get_user():
users = {
'sit': ['user1', 'pwd1'],
'uat': ['user2', 'pwd2']
}
return users

然后在conftest中根据环境设置全局变量值

# 设置不同环境下的全局变量
@pytest.fixture(scope="session")
def set_env(get_env):
if get_env == 'sit':
env_url = data_util.get_env()['sit']
user = data_util.get_user()['sit']
if get_env == 'uat':
env_url = data_util.get_env()['uat']
user = data_util.get_user()['uat']
return {'env_url': env_url, 'user': user}

注意fixture的使用范围为整个测试会话。

以下是完整的conftest

import pytest
import data_util
def pytest_addoption(parser):
"""
添加命令行参数
parser.addoption为固定写法
default 设置一个默认值,此处设置默认值为sit
choices 参数范围,传入其他值无效
help 帮助信息
"""
parser.addoption(
"--env", default="sit", choices=["dev", "sit", "uat"], help="环境参数"
)
@pytest.fixture(scope="session")
def get_env(request):
return request.config.getoption("--env")
# 设置不同环境下的全局变量
@pytest.fixture(scope="session")
def set_env(get_env):
if get_env == 'sit':
env_url = data_util.get_env()['sit']
user = data_util.get_user()['sit']
if get_env == 'uat':
env_url = data_util.get_env()['uat']
user = data_util.get_user()['uat']
return {'env_url': env_url, 'user': user}


定义测试类及测试方法

注意fixture不能在x-unit风格下的setup\teardown中引用,因此需要使用fixture定义setup、teardown方法才能引用到conftest里的fixture,一般我们在setup方法中初始化环境变量具体如下:

@pytest.fixture()
def class_fixture(set_env):
print('setup_class')
url = set_env.get('env_url')
user = set_env.get('user')
print(url, user)
yield
print('teardown class')

这样我们就在测试前把环境信息设置OK了。


测试验证

以下是测试方法

import pytest
pytestmark = pytest.mark.usefixtures("module_fixture")
@pytest.fixture(scope="module", params=["test_fixture"])
def module_fixture(request):
param = request.param
print("  SETUP module", param)
yield param
print("  TEARDOWN module", param)
@pytest.fixture()
def class_fixture(set_env):
print('setup_class')
url = set_env.get('env_url')
user = set_env.get('user')
print(url, user)
yield
print('teardown class')
@pytest.fixture(scope="function", params=[1, 2])
def function_fixture(request):
param = request.param
print("  SETUP function", param)
yield param
print("  TEARDOWN function", param)
@pytest.mark.usefixtures('class_fixture')
class TestFixture:
def test_0(self, function_fixture):
print("  RUN test0 with function_fixture", function_fixture)
def test_1(self, module_fixture):
print("  RUN test1 with module_fixture", module_fixture)
def test_2(self, function_fixture, module_fixture):
print(f"  RUN test2 with function_fixture {function_fixture} and module_fixture {module_fixture}")
def test_env(self, get_env):
print(f"The current environment is: get_env")
if __name__ == '__main__':
pytest.main(['-v', '-s','--env=uat', 'test_fixture.py::TestFixture::test_0'])

我们首先填的uat命令运行,查看输出:

Python中pytest命令行实现环境切换_python

可以看出输出是正确的,我们再切换成sit试试:

if __name__ == '__main__':
pytest.main(['-v', '-s','--env=uat', 'test_fixture.py::TestFixture::test_0'])

 

Python中pytest命令行实现环境切换_接口测试_02

 可以看出在不同的命令下获得的测试数据也不一样,这样我们就达到了环境切换的目的了

标签:命令行,get,Python,fixture,pytest,user,env,def
From: https://blog.51cto.com/u_15333581/9078714

相关文章

  • 如何使用Pytest进行自动化测试
    为什么需要自动化测试自动化测试有很多优点,但这里有3个主要的点可重用性:不需要总是编写新的脚本,除非必要,即使是新的操作系统版本也不需要编写脚本。可靠性:人容易出错,机器不太可能。当运行不能跳过的重复步骤/测试时,速度会更快。全天运行:您可以在任何时间或远程启动测试。夜间运......
  • Pytest测试框架基本使用方法详解
    pytest介绍pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点:1、简单灵活,容易上手,文档丰富;2、支持参数化,可以细粒度地控制要测试的测试用例;3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests);4、......
  • Python pytest.main()运行测试用例
    前言前面一直使用命令行运行pytest用例,本篇来学下使用pytest.main()来运行测试用例pytest.main()args传一个list对象,list里面是多个命令行的参数plugins传一个list对象,list里面是初始化的时候需注册的插件不带参数运行importpytest#等同于命令行执行pytest#默认运行的是......
  • Python模块之hashlib模块
    hashlib模块【一】概要hashlib模块是Python中提供对哈希算法的支持的模块。它提供了常见的哈希算法,如MD5、SHA-1、SHA-224、SHA-256、SHA-384和SHA-512,以及一些其他哈希算法。【二】常见用法计算哈希值:hashlib.md5():创建一个MD5哈希对象。hashlib.sha1():创......
  • 【小沐学写作】PPT、PDF文件添加水印(Python)
    1、简介水印通常用于保护文档或指定其所有权。另一方面,它们用于显示文档的状态,例如手稿、草稿等。在本文中,我们将演示如何在PowerPoint演示文稿中插入水印。您将学习如何在Python中为PowerPointPPT幻灯片添加文本或图像水印。2、ppt添加水印2.1PowerPoint幻灯片母版htt......
  • 微软的一些公开课,Python、机器学习、SQL、AI,全部免费
    大家好,我是老章,刷X看到一位博主AlifHossain⚡@alifcoder总结了微软的一些公开课,全部免费,蛮不错的。感兴趣可以学一波,还能领徽章。1.机器学习简介本课程是学习机器学习基础知识和用例的好方法。→11个模块→2.5小时→适合初学者→免费徽章链接:https://learn.micros......
  • python之bytes与str互转
    fromhex()bytes.fromhex()是一个内置函数,用于从十六进制字符串创建字节串(bytes)对象。fromhex()方法接受一个十六进制字符串作为输入,并将其转换为对应的字节串。输入的十六进制字符串可以包含数字0-9和小写字母a-f(或大写字母A-F)。以下是使用bytes.fromhex()的示例代码:hex_stri......
  • python初试七
    前面的文章研究了Django最主要的几个方面:数据库,模板,动态生成页面等。但都是使用pythonmanage.pyrunserver来运行服务器。这是一个实验性的web服务器,不适用于正常的站点运行。我们需要一个可以稳定而持续的服务器。这个服务器负责监听http端口,将收到的请求交给Django处理,将Django......
  • Python+Selenium实现UI自动化
    自动化测试:自动化测试是把以人为驱动的测试行为转化成机器执行的一种过程,通常在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较,再此过程中,为了节省人力,时间或硬件资源,提高测试效率,便引用了自动化测试的概念Selenium:是......
  • Python爬虫 - 使用代理IP池维护虚拟用户
    在进行Web爬取时,使用代理IP是一种常见的策略,它可以帮助我们隐藏真实IP地址,绕过网站的访问限制,提高爬取效率。本文将介绍如何使用代理IP池维护虚拟用户,以在爬取过程中保持匿名性和稳定性。一、什么是代理IP池?代理IP池是一个包含多个代理IP的集合。这些代理IP通常是从公开或付费的代......