Pytest使用记录

Pytest简介

Pytest是一个易用、强大、灵活的功能测试框架,并且兼容unittest和nose的测试用例。

  • 易用: 用例编写简单, 断言方便
  • 强大: 全能的mark, 强大的fixtures
  • 灵活: 灵活的执行控制及丰富的插件

Pytest安装指令

pip install pytest

Pytest编写规则

  • 测试文件以test_开头,或以_test结尾
  • 测试类以Test开头,并且不能带有 init 方法
  • 测试函数以test_开头
  • 断言使用python自带的assert

项目结构目录

假设我的项目结构如下图所示,在项目目录下专门创建了一个test文件夹,里面存放的都是与测试相关的文件。

├── my_project
     ├── src 
     ├── main.py
     └──  test
           ├── pytest.ini
           ├── test_1.py
           └── test_2.py

其中,pytest.ini为pytest的配置文件,名称是固定的不能随便更改,假设配置文件如下,这里我只是简单配置了下标签mark,后面会使用到mark:

[pytest]

markers =
  mo1: module 1

假设在main.py中实现了一个非常简单的方法:

import math


def func(x: int, y: int):
    return math.pow(x, y)

然后在测试文件中调用该方法,进行测试(在这里去实现自己需要测试的方法),假设test_1.py为(判断结果是否正确,主要是使用assert语句):

import pytest
from main import func


@pytest.mark.mo1
def test_interface1():
    assert func(1, 1) == 1


@pytest.mark.mo1
def test_interface2():
    assert func(2, 1) == 2


def test_interface3():
    assert func(2, 2) == 4

注意,其中有些函数上添加了@pytest.mark.mo1装饰器,mo1是我们在ini文件中提前声明了的,后面可以指定去执行哪些标签mark下的测试方法。

执行测试方法

在项目根目录打开系统终端

  • 执行test文件夹下所有测试文件
pytest -v ./test/

test输出1

  • 执行指定测试文件
pytest -v ./test/test_1.py

test输出2

  • 执行指定测试文件指定方法
pytest -v ./test/test_1.py::test_interface1
  • 执行指定标签mark下的测试方法(这里就测试之前标注的mo1标签下的方法)
pytest -v -m 'mo1' ./test/

test mark1通过终端输出可以看到,一共有6个测试方法,但属于mo1标签的只有2项,并仅测试这两项方法。

常见指令参数

  • -v表示输出更加详细的测试信息
  • -x表示一旦遇到测试失败就立即退出(默认情况是会执行所有测试样例的,无论是否有测试失败的情况)
  • -q为安静模式,测试过程中不会输出测试环境以及测试进度等信息,只返回测试结果
  • -s打印测试函数中的print输出,默认是不打印的
  • -m仅执行指令标签mark下的测试方法

更多指令参数可查看pytest的帮助文档:

pytest -h

pytest -h
对于常用的参数指令可以直接写在pytest.ini文件的addopts中,这样就不需要手动输入了。

[pytest]
addopts = -v

markers =
  mo1: module 1

Pytest插件使用

Pytest-ordering

有时在测试代码中可能需要按照一定的顺序去执行测试代码,此时可以使用pytest-ordering包来控制执行的顺序。

  • 安装pytest-ordering
pip install pytest-ordering
  • 在测试代码中加上装饰器@pytest.mark.run(order=1),其中order代表着执行顺序,数字越小执行优先级越高。
import pytest
from main import func


@pytest.mark.run(order=1)
def test_interface1():
    print("test1")
    assert func(1, 1) == 1


@pytest.mark.run(order=3)
def test_interface2():
    print("test2")
    assert func(2, 1) == 2


@pytest.mark.run(order=2)
def test_interface3():
    print("test3")
    assert func(2, 2) == 4

  • 再次执行测试程序
pytest -vs ./test/test_1.py

pytest-ordering通过终端的输出,可以发现执行的顺序是按照我们给定的order顺序来执行的。pytest -vs ./test/test_1.py

参考链接

Pytest - 使用介绍
Pytest基础使用教程
pytest文档18-配置文件pytest.ini
Pytest系列 - pytest-ordering用例的执行顺序

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

太阳花的小绿豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值