使用pytest命令行实现环境切换

news2024/11/18 11:36:13

目录

前言

pytest_addoption(parser, pluginmanager)

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

获取命令行参数

设置不同环境的全局变量

定义测试类及测试方法

测试验证


前言

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

pytest_addoption(parserpluginmanager)

注册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命令运行,查看输出:

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

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

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/726959.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android12之IBinder中[[clang::lto_visibility_public]]作用(一百六十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

MySQL自治平台建设的内核原理及实践(上)

总第565篇 2023年 第017篇 本文整理自美团技术沙龙第75期的主题分享《美团数据库攻防演练建设实践》,系超大规模数据库集群保稳系列(内含4个议题的PPT及视频)的第4篇文章。 本文作者在演讲后根据同学们的反馈,补充了很多技术细节&…

如何绘制「UML类图」

一、UML类图简介 类图以反映类的结构(属性、操作)以及类之间的关系为主要目的,描述了软件系统的结构,是一种静态建模方法。类图用来描述系统中有意义的概念,包括具体的概念、抽象的概念、实现方面的概念等,是对现实世界中事物的抽…

设计模式--------结构型模式

结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”…

web 页面布局:(三)position 坐标系布局

web 页面布局:(三)position 坐标系布局 页面坐标系position 设置fixedrelativeabsolutesticky 应用场景 页面坐标系 因为所有文本内容,是从左向右读,自上而下读,和书写习惯,读书习惯一致&#…

惊呆了!这个银行管理技巧也太厉害了吧

在金融行业,蓄电池监控是一项至关重要的任务。随着金融机构的数字化转型和依赖电力的增加,蓄电池成为保障金融系统正常运行的关键组成部分。 因此,对蓄电池的状态进行监控和维护,确保其高效可靠地工作,对金融行业的稳定…

深度学习06-pytorch从入门到精通

文章目录 概述环境准备安装cuda和cudnn安装pytorch 基础张量定义numpy转换数学函数随机数计算函数矩阵处理函数 自动梯度案例计算图 torchvision模块TransformsDataSetDataLoader自定义数据集 nn模块nn.ModuleCNN图像处理层nn.Conv2dnn.AvgPool2d和nn.MaxPool2dnn.Linearnn.Bat…

TransFuse

方法 Transformer分支 将不同尺度的特征图 t 0 、 t 1 和 t 2 t^0、t^1和t^2 t0、t1和t2保存起来,之后与对应的CNN分支的特征图融合。 CNN分支 以基于ResNet的模型为例,模型通常有五个块,每个块对特征图进行两倍下采样。我们获取第 4( g 0…

vue父组件调用子组件的Form表单校验

需求1:父组件调用子组件的表单验证方法,验证成功,继续进行接下来的操作,验证失败,提示用户并返回。 需求2:父组件校验多个子组件的表单验证方法,验证成功,继续进行接下来的操作&…

cookie/session/token(持续更新)

1.cookie 1.1概念 cookie是服务器产生的保存在客户端的一小段文本信息,格式是字典形式,键值对形式 cookie有两类: 1.会话级cookie:保存在内存,随浏览器关闭自动消息 2.持久化cookie:保存在硬盘,浏览器关闭不会直接消失,生命周期取决于失效时间 1.2如何查看cookie以及格式…

vue3+vite+element pro + pnpm 创建的monorepo项目

vue3+vite+element pro + pnpm 创建的monorepo项目 欢迎使用河码桌面技术说明界面欢迎使用河码桌面 欢迎使用河码桌面,河码桌面是一个基于vue3+vite+element pro + pnpm 创建的monorepo项目,项目采用的是类操作系统的web界面,操作起来简单又方便,符合用户习惯,又没有操作…

GlusterFs部署及使用

目录 一、部署和使用 1. clusterfs服务器初始化 2. 部署glusterfs 3. 创建volume 4. 客户端挂载和使用 5. k8s使用glusterfs作为后端存储(静态供给glusterfs存储) 5.1 集群所有节点安装glusterfs客户端 5.2 k8s创建资源对象使用glusterfs存储 5.…

Spring Boot 中的声明式事务是什么,如何使用

Spring Boot 中的声明式事务是什么,如何使用 简介 在数据库操作中,事务是一组操作的集合,这些操作在一个逻辑单元内执行,如果其中任何一个操作失败,则整个事务都会被回滚,使得数据库回到事务执行之前的状…

不看产品、不重销售,聊聊Forrester推荐的CLG战略

近日,Forrester的分析师们发现,企业(尤其是B2B企业)对于CLG战略的关注空前增加。而且,越来越多SaaS企业选择CLG战略来取代以前的PLG(产品导向型增长)或SLG(销售导向型增长&#xff0…

SpringSecurity之基本原理

目录 核心过滤器 FilterSecurityInterceptor ExceptionTranslationFilter UsernamePasswordAuthenticationFilter BasicAuthenticationFilter 过滤器加载过程 重要接口 UserDetailsService接口 PasswordEncoder接口 springSecurity本质上就是一个过滤器链,…

RabbitMQ系列(16)--用SpringBoot整合RabbitMQ

1、新建项目 2、新建Spring项目 3、选择合适的SpringBoot版本,依赖在这里可以先不选,可以在项目生成后在pom.xml文件里批量的导入依赖 4、设置项目的Maven (1)打开设置 (2)在搜索框里输入Maven搜索Maven设置,然后根据自己的实际情况设置Mave…

优化篇--Vue模版语法做动态渲染

Vue模版语法做动态渲染&#xff0c;随便记录一下 <a-row v-for"(row, rowIndex) in footerConfig" :key"rowIndex"><a-col span"4" v-for"(col, colIndex) in row" :key"colIndex"><span class"total-l…

新来的资深java不会lambda表达式,中级开发都笑拉了--lambda流这么难吗,教你怎么玩早学早吃香

因为一个人就全体 虽然没提名字但是说的意思和报身份证没区别, 我自己看着都尴尬… 标题就是事情的经过,和同事的聊天记录在最下面 前言 Lambda表达式是优化代码的工具&#xff0c;使得代码更简洁、易读&#xff0c;符合现代开发的趋势,以及推动函数式编程在Java开发中的流行…

web3创业有哪些机会?(一)

目录 1. 去中心化金融&#xff08;DeFi&#xff09;&#xff1a;2. 去中心化身份验证和数字身份&#xff1a;3. 去中心化市场和电子商务&#xff1a;4. 区块链游戏和虚拟资产&#xff1a;5. 数据隐私和安全&#xff1a;6. 去中心化社交媒体&#xff1a;7. 去中心化能源交易&…

Webpack原理与实战 --- 背景介绍

模块化的演进过程 Stage 1 - 文件划分方式 缺点&#xff1a; 模块直接在全局工作&#xff0c;大量模块成员污染全局作用域&#xff1b;没有私有空间&#xff0c;所有模块内的成员都可以在模块外部被访问或者修改&#xff1b;一旦模块增多&#xff0c;容易产生命名冲突&#…