前言上一篇我们介绍了固件,通过示例可以看到,一个模块中,固件会对其作用范围内的所有用例起作用;其实这样很不灵活,比如我们只希望部分测试用例执行某个固件,通过setup和teardown是实现不了的;但是,通过fixture就可以根据需要自定义测试用例的前置、后置操作;fixture是通过yield来区分前后置的,前后置均可以单独存在,fixture如果有后置,前置不报错就都
为什么要写pytest?之前分享了java自动(详见:),部分测友建议分享一个python版本自动化,而pytest这个热门单元测试框架作为python自动化中的必备技术栈,必须单独拎出来详解。后续分享基于pytest最新版,和老版本有微小差异。 pytest介绍官网:https://www.osgeo.cn/pytest/contents.htmlpytest是
固件分类固件用于执行前的初始化参数、执行后的清理动作。类型规则setup_module/teardown_module全局模块级模块运行前/后运行(只运行一次)setup_function/teardown_function函数级每个函数用例运行前/后运行setup_class/teardown_class类级每个class运行前/后运行(只运行一次)setup_method(setu
自定义前置(setup)、后置(teardown)fixture可以实现自定义测试用例的前置、后置,是通过yield来区分前后置的,前后置均可以单独存在;写在yield前面的就是前置条件,写在后面的就是后置条件;如果yield前面的代码出异常了,yield后面的代码不会执行;但是,如果是测试用例出异常,yield前后的代码还是都会执行。 示例:仅test_a和test_b需要
关于conftest.py如果多个模块使用的fixture相同,那么,我们可以将fixture写在conftest.py中(通过conftest.py管理共享的fixture),这样达到跨模块和文件的效果conftest的特点:1、文件名称默认为conftest.py,是pytest里面固定的名字,不能随意更改,通常在里面写用例执行前的一些初始化操作2、conftest.py文件可以有
特点1. 采用pytest.mark.xxx(参数)标志所需要的参数,然后在fixture中可以做一些逻辑处理 2. fixture采用request获取参数 3. 传参的个数可以是多个,类型可以为简单类型或者复杂对象 示例简单类型#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : 韧 import py
用例名默认展示我们先来看下用例名默认是如何显示的一个参数#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : 韧 import pytest @pytest.fixture(params=['a', 'b', 'c']) def fun(request): # 必须是request这个参数名 return
特点1. fixture可以通过设计params,让依赖该fixture的用例迭代执行 2. params数据可以为[列表],(元组),{集合},{字典} 3. params数据在fixture中通过request变量来接收 示例:fixture返回值#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : 韧
前言通常,我们通过分包或者分模块来对用例进行分类管理,如果只想执行符合某要求的部分用例,该如何实现呢?可以使用装饰器@pytest.mark.xxx给用例打标签(自定义标记)。 自定义标记使用流程1. 注册自定义标记(通过pytest.ini进行管理)2. 将模块、函数、类、方法进行业务标记3. 根据自定义标记运行用例 注册自定义标记在pytest.ini文件中,新
前置基础python操作yaml: 关于数据驱动数据驱动就是通过数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变。简单来说,就是参数化的应用。数据量小的测试用例可以使用代码的参数化来实现数据驱动,数据量大的情况下建议使用一一种结构化的文件(例如yaml、json等) 来对数据进行存储,然后在测试用例中读取这些数据。但是,建议不管数据多少,都要数据和代码的分离,方便维
关于parametrize参数化之前我们分享了通过fixture返回值实现参数化(详见:)今天我们分享parametrize参数化,也就是在测试函数/测试类进行参数化parametrize是一个内置标记,在命令pytest --markers结果中可以看到@pytest.mark.parametrize(argnames, argvalues) 源码class _Parame
测试数据case.json [ { "uname": "ren", "pwd": "123" }, { "uname": "qzcsbj", "pwd": "456" } ] parametrize从json获取数据#!/usr/bin/env python # -*- codi
测试数据case.xlsx 设置为文本格式:'123 模块安装(读excel)pip install xlrd==1.0.0 parametrize从excel获取数据#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : 韧 import xlrd import pytest import
测试数据从数据库导出的数据是csvcase.csv parametrize从csv获取数据#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : 韧 import pytest import csv import os # 获取项目路径 BASE_PATH = os.path.dirname(os.path.d
常用异常处理方法try...exceptpytest.raises() try...except示例一:#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : 韧 print("begin") try: a = int(input("请输入被除数:")) b = int(input("请输入除数:
简介1、indirect默认是False2、如果设置成True,表示把被parametrize修饰器修饰的方法形参当函数执行(parametrize中参数名和这个形参同名),此时必须有被@pytest.fixture()修饰的和形参名同名的函数(可以对参数做一些加工处理),否则报错:fixture 'xxx' not found,xxx表示形参名;简单说,为True时,形参被当成是一个fixtur
之前我们分享了fixture中使用ids给用例取别名(详见:)类似的,parametrize中也可以使用ids给用例取别名,从而增加可读性示例:#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : 韧 import pytest data = ["ren", "qzcsbj"] ids = [f"注册用户:{name}
应用场景功能未开发完成,但是用例写了;环境限制,已经知道会失败,也可以预期失败。 源码class _XfailMarkDecorator(MarkDecorator): @overload # type: ignore[override,misc,no-overload-impl] def __call__(self, arg: Markab
应用场景我们可以将常用标记赋值给一个标记变量,这样可以在模块中、模块间共享这些标记变量如果是模块间共享,需要把标记变量单独放一个文件中,然后模块中导入 示例:模块中共享#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : 韧 import pytest import sys if_win_skip_mark = pyte
pytest简易教程汇总,详见:使用场景某功能不稳定,重复执行多次,以便复现问题 插件安装安装:pip install pytest-repeat 使用方式一:命令行参数参数: --count:重复运行次数,必填 --repeat-scope:默认function,还可以是class、module、session,表示重复运行的维度,比如session,表示所有
pytest简易教程汇总,详见: 应用场景用例执行顺序,默认是按照从上到下的顺序进行执行的,详见:如果想自定义执行顺序,也就是改变执行优先级,那么可以使用pytest-ordering 插件安装pip install pytest-ordering 使用方式标记于被测试函数、方法、类:@pytest.mark.run(order=x),根据order值来决
pytest简易教程汇总,详见:应用场景用来验证用例在随机(无序)执行时是否正常 插件安装pip install pytest-random-order 使用方式加参数:--random-order 示例#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : 韧 def test_d():
关于http协议详见:web server响应的格式必须要遵循http响应协议,否则浏览器或者其它客户端工具不能解析响应;另外,http请求协议已经由浏览器或者其它客户端工具帮我们封装好了。 这里我们直接通过socket写一个简单的server来演示。 响应格式不遵循http响应协议server.pyimport socket import time # 创建TC
简介 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于万维网(WWW : World Wide Web )服
背景pip源默认是国外的服务器,pip install比较慢,还时不时的访问不了,可以把pip源改成国内的pip源豆瓣:https://pypi.douban.com/simple/ 清华(常用):https://pypi.tuna.tsinghua.edu.cn/simple/ 阿里云:https://mirrors.aliyun.com/pypi/simple/ 中科大: https:/
MyBatis是数据库访问层框架,是一个应用层框架。 MyBatis简易教程(01):mybatis基础 MyBatis简易教程(02
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号