接口框架项目实战-pytest(一)级别用法 前后置 夹具

本文介绍了Python的pytest框架,包括其用于发现和执行测试用例的方式,支持的特性如断言、报告生成、自动化测试插件(如pytest-html和allure-pytest),以及如何配置和使用pytest进行单元测试、多线程执行、跳过和重试功能。还提到了unittest的比较和pytest与其他工具的结合应用。
摘要由CSDN通过智能技术生成

Python unittest pytest
主要作用:
发现测试用例:从多个py文件看一定规则找到测试用例
执行测试用例:按照一定顺序执行测试用例,并生成结果
pytest 默认从上到下 执行 可以通过装饰器改变顺序
unittest 默认ascii顺序执行
判断测试结果:断言
生成测试报告:pytest-html allure

pytest
基于Python的单元测试框架 可以和selenium requests appium 结合自动化测试
可以实现用例跳过 skip 和失败用例重测 reruns
可以通过allure-pytest 生成allure 报告
方便和Jenkins实现持续集成
有很多强大的插件
pytest-html 生成html报告
pytest-xdist 多线程执行测试用例
pytest-ordering 改变测试用例执行顺序
pytest-rerunfailures 失败用例重跑
allure-pytest 生成allure报告
一次性安装需要的插件
项目根目录新建requirement.txt
文件内容

pytest
pytest-html
pytest-xdist
pytest-ordering 
pytest-rerunfailures
allure-pytest

执行文件

pip install -r requirement.txt

查看安装

#查看所有
pip list 
#查看pytest
pip show pytest

pytest测试用例规则:
模块名必须已test_开头或者_test结尾
测试类必须以Test开头切不能带init方法
测试用例必须以test_开头
命名规范:
模块名一般以全小写多个英文用_隔开
类名一般首字母大写
方法名一般全小写多个英文用_隔开
运行方式:
主函数

import pytest

if __name__ == '__main__':
    pytest.main()

常见参数:
-v 输出更加详细的信息
-s 输出调试信息
可以合并成vs

–reruns=数字 失败重跑次数
-x 失败一次就停止测试
–maxfail=N 失败N次就停止
–html=保存文件地址
-n=N 多线程

-k 执行包含指定关键字的测试用例(可以是模块名、测试类名、方法名)

#-k 可以是模块名、测试类名、方法名
pytest.main(['-v','-s','-k','03 or 01'])

通过node id 执行用例
指定模块执行

import pytest
if __name__ == '__main__':
    pytest.main(['-v','-s','testcases/test_demo2.py'])

执行指定文件夹

import pytest

if __name__ == '__main__':
    pytest.main(['-v','-s','-k','test_02','testcases'])

执行指定测试类

import pytest

if __name__ == '__main__':
    pytest.main(['-v','-s','testcases/test_demo2.py::TestApi22'])

执行指定测试用例

import pytest

if __name__ == '__main__':
    pytest.main(['-v','-s','testcases/test_demo2.py::TestApi22::'])

命令行

pytest 

pytest.ini配置文件运行(不管是主函数还是命令行都会读取这个配置文件)
[pytest] 标记pytest配置文件
addopts 命令行参数多个命令用空格隔开
testpaths 搜索测试用例范围
python_files 搜索模块名规则
python_classes 搜索类名规则
python_functions 搜索方法名规则
markers 标记

[pytest]
#配置文件
addopts = -vs -m 'smoke or product_mange'
testpaths= report/
python_files= test_*.py
python_classes=Test*
python_functions=test_*
#用例分组
markers=
    smoke
    product_mange:商品管理

用例加标记

import pytest
class TestApi:
    @pytest.mark.smoke
    def test_01(self):
        print("felicia")
    def test_02(self):
        print("TestApi_jammy")
    @pytest.mark.product_mange
    def test_03(self):
        print("test")

pytest 默认执行顺序
从上到下
改变执行顺序 (有run装饰器的的会优先执行

@pytest.mark.run(order=1)

跳过用例(有条件跳过 无条件跳过)

#无条件跳过
@pytest.mark.skip()
#有条件跳过
@pytest.mark.skipif(flag,reason='flag 为True 跳过用例')

用例的前后置 固件(夹具和固件是指同一个)

import pytest
def setup_module(self):
    print("每个模块之前执行")
def teardown_module(self):
    print("每个模块之后执行")
class TestApi:
    def setup_class(self):
        print("每个类之前执行 创建日志对象 创建数据库连接")
    def teardown_class(self):
        print("每个类之后执行  销毁日志对象 关闭数据库连接")
    def setup(self):
        print("每个用例之前执行,web自动化 打开浏览器 加载网页 接口自动化 日志开始")
    def teardown(self):
        print("每个用例之后执行,日志结束 关闭浏览器")
    def test_01(self):
        print("felicia")
    def test_02(self):
        print("jammy")
    def test_03(self):
        print("test")
        
class TestAAApi:
    def test_aa(self):
        print("aa")

发现问题:没有办法指定哪些用例需要前后置哪些不需要
解决方法:通过@pytest.fixure() 来实现部分用例前后置
function级别

import pytest
@pytest.fixture(scope="function")
def sql():
    print("查询数据库 验证数据")
    yield '成功'
    print("关闭数据库连接")
class Test3Api:
    def test_01(self,sql):
        print("felicia")
        print(sql)
    def test_02(self):
        print("jammy")
    def test_03(self):
        print("test")

yield 和return 都可以返回值 返回的值都可以在测试用例用 获取
yield 返回一个对象 return返回一个值
yield 后面可以接代码 return 不能接代码
注意autouse=true自动调用 函数级别时和setup teardown效果一样
class 级别

import pytest


@pytest.fixture(scope="class")
def sql2():
    print("查询数据库 验证数据")
    yield '成功'
    print("关闭数据库连接")

调用

import  pytest

@pytest.mark.usefixtures("sql2")
class TestApi22:
    def test_01(self):
        print("felicia")

注意
autouse=true自动调用 类级别时和setup_class teardown_class效果一样

module 级别

import pytest
@pytest.fixture(scope="module")
def sql2():
    print("查询数据库 验证数据")
    yield '成功'
    print("关闭数据库连接")

注意
autouse=true自动调用 类级别时和setup_module teardown_module效果一样
每个模块的前后执行一次

session、package级别 一般是和conftest.py文件一起使用

params 参数

import pytest

def get_data():
    return ["felicia","jammy","bob"]
@pytest.fixture(scope="function",params=get_data(),ids=['f','j','b'])
def sql2(request):
    print(request.param)
    print("查询数据库 验证数据")
    yield request.param
    print("关闭数据库连接")

request 参数名称固定写法 request.param 固定写法 get_data返回长度为3的数组,sql2会执行三次
ids 参数 和params 参数 一起使用
在这里插入图片描述
name 参数 是夹具的别名,如果设置name参数,引用夹具时需要使用别名

conftest.py主要是单独的存放fixture 固件的,session 和package 级别时 多个py文件共享(例如:登录 、模块的共性)
不需要引入conftest.py文件 直接调用fixture 函数名
conftest.py 文件可以有多个
根目录下的conftest.py文件项目下的用例都可以使用
子目录下的conftest.py 文件只有该模块下的用例可以使用
作用:解决重复日志 连接数据库 关闭数据库 等等

注意
多个前置同时存在有优先级
conftest.py 夹具为function级别时优先级高于 setup teardown
conftest.py 夹具为class级别时优先级高于 setup_class teardown_class
conftest.py 夹具为moudle级别时优先级高于 setup_module teardown_module

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值