Pytest测试框架

Pytest测试框架

测试用例发现规则

  1. 默认从当前或者指定文件夹下递归查找文件名以test_开头或者_test结尾的.py文件
  2. Test 开头且(不继承自 unittest.TestCase或者含有init方法的类)的类
  3. 函数名以 test_ 开头的测试用例方法

自定义测试用例发现规则

我们也可以在pytest.ini配置文件指定测试发现策略

# 设置递归查找的测试用例文件夹
testpaths = ./testcases
# 改变模块查找规则
python_files = test_*.py
# 改变类的查找规则
python_classes = Test*
# 改变函数的查找规则
python_function = test_*

测试用例执行规则

测试用例的默认执行方式有两种

  • 通过pytest.main()方法执行测试用例

    if __name__ == "__main__":
        pytest.main(["testcase/test_api.py::TestApi", "-vs"]) # 将命令以列表的形式传参
    
  • 通过命令行的方式执行测试用例

    • pytest ./testcase (直接调用pytest命令执行)
    • python -m pytest(调用python解释器,以pytest模块化的方式执行测试用例,推荐)

当然,我们可以针对性的使用参数来指定对应的测试用例的执行:

  • -k 匹配函数名执行用例

    pytest -k "test_login or test_register" # 选择测试用例名称为test_login or test_register的用例执行
    
  • -m 指定测试用例标签执行

    @pytest.mark.smoke # 将该用例添加到smoke标签内
    def test_01(self):
        pass
    
    pytest -m "smoke" # 执行smoke标签的用例
    

    我们也可以在pytest.ini声明标签的种类

    markers = 
        smoke: 冒烟测试用例
        user: 用户管理模块用例
    

pytest.ini配置文件

pytest.ini 文件是 pytest 的配置文件,用于设置全局选项、标记、自定义行为以及插件的配置。它允许你定义某些 pytest 参数的默认值,从而减少在命令行中重复输入参数的需要。pytest.ini 文件通常放在项目的根目录下,pytest 在命令行或是主函数时都会自动加载并应用其中的配置。

pytest.ini常见配置

[pytest]
# 执行命令默认添加参数
addopts = -vs -m "smoke"

# 指定测试目录
testpaths = /testcase

# 基础路径,测试用例可以直接传入使用
base_url: https://api.weixin.qq.com

# 自定义标记
markers =
    slow: 标记慢速测试
    smoke: 标记冒烟测试
    login: 标记与登录相关的测试

# 配置日志级别
log_cli = true
log_cli_level = INFO
log_file = pytest.log
log_file_level = DEBUG

# 配置最大失败数
maxfail = 2

# 添加 Python import 路径
pythonpath = src

pytest常见插件

pytest
pytest-html			pytest html测试报告
pytest-xdist  		多线程执行
pytest-ordering		控制用例的执行顺序
pytest-rerunfailures失败用例重跑
pytest-base-url		基础路径
allure-pytest		生成allure测试报告

安装pytest第三方插件,将以下内容写入requirements.txt文件,执行命令pip install -r .\requirements.txt一键下载

pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
pytest-base-url
allure-pytest

pytest常见参数

# pytest 常见参数示例

# 1. 控制输出详细程度
pytest -v                # 增加输出详细信息
pytest -q                # 减少输出详细信息
pytest -s			    # 禁用捕获标准输出和标准错误输出

# 2. 测试执行控制
pytest -x                # 在第一个测试失败后停止
pytest --maxfail=2       # 失败两次后停止
pytest --lf              # 只运行上次失败的测试
pytest --ff              # 优先运行上次失败的测试

# 3. 选择性测试
pytest -k "expression"   # 通过表达式筛选测试用例
pytest -m "marker"       # 通过标记筛选测试用例

# 6. 并行执行
pytest -n <num>          # 使用多进程并行执行测试

# 8. 日志输出
pytest --log-cli-level=INFO    # 设置命令行日志输出级别
pytest --log-file=log.txt      # 将日志输出到文件

# 10. 仅收集测试
pytest --collect-only         # 仅收集测试用例,不执行

pytest.fixture固件

pytest固件主要作用是在执行测试用例/类/模块/会话前后做一些操作。

在测试用例前后执行操作

def setup(self):
    print("测试用例前执行操作")

def teardown(self):
    print("测试用例后执行操作")

def setup_class(self):
    print("测试类前执行操作")

def teardown_class(self):
    print("测试类后执行操作")

在pytest当中引入了一个强大的功能fixture,可以取代setup/teardown方法实现前后置操作,也可以实现传参功能

@pytest.fixture(
    scope="function", # 作用域:function/class/module/session
    autouse=False, # 是否自动执行:True/False
    params=["mysql", "redis"], # 传入参数(每次只传入一个值,有多少个参数执行多少遍case)
    ids=["m", "r"], # 传入参数别名(也可以为case取别名)
    name="cm", # 夹具别名,当声明之后只能用这个别名
)

fixture实现前后置操作

@pytest.fixture(
    scope="function", # 设置执行级别为function
    autouse=True, # 每个测试用例前后默认执行
)
def connect_mysql():
    logger.info("前置操作")
    yield # 测试用例执行
    logger.info("后置操作")

fixture实现参数传递

@pytest.fixture(
    scope="function",
    autouse=False,
    params=["mysql", "redis"], # 传入参数(每次只传入一个值,有多少个参数执行多少遍case)
    ids=["m", "r"], # 传入参数别名(也可以为case取别名)
    name="cm", # 夹具别名,当声明之后只能用这个别名
)
def connect_mysql(request):  # 传参需要传递request
    logger.info("前置操作")
    yield request.param  # 传参固定写法
    logger.info("后置操作")
    
def test_01(self,cm): # 传入fixture别名
    logger.info(cm)  # 接受并打印夹具传来的参数 # mysql、redis

test_01测试用例会根据传入参数的个数去执行,执行的结果如下:

image-20241014112136331

一般而言我们把fixture存放在当前文件夹内的conftest.py文件,表示当前fixture可适用于该文件夹内的全部测试用例。便于代码的管理维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值