天天看点

Pytest使用记录

文章目录

    • Pytest简介
    • Pytest安装指令
    • Pytest编写规则
    • 项目结构目录
    • 执行测试方法
    • 常见指令参数
    • Pytest插件使用
      • Pytest-ordering
    • 参考链接

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/
           
Pytest使用记录
  • 执行指定测试文件
pytest -v ./test/test_1.py
           
Pytest使用记录
  • 执行指定测试文件指定方法
pytest -v ./test/test_1.py::test_interface1
           
  • 执行指定标签mark下的测试方法(这里就测试之前标注的

    mo1

    标签下的方法)
pytest -v -m 'mo1' ./test/
           
Pytest使用记录

通过终端输出可以看到,一共有6个测试方法,但属于

mo1

标签的只有2项,并仅测试这两项方法。

常见指令参数

  • -v

    表示输出更加详细的测试信息
  • -x

    表示一旦遇到测试失败就立即退出(默认情况是会执行所有测试样例的,无论是否有测试失败的情况)
  • -q

    为安静模式,测试过程中不会输出测试环境以及测试进度等信息,只返回测试结果
  • -s

    打印测试函数中的

    print

    输出,默认是不打印的
  • -m

    仅执行指令标签mark下的测试方法

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

pytest -h
           
Pytest使用记录

对于常用的参数指令可以直接写在

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使用记录

通过终端的输出,可以发现执行的顺序是按照我们给定的

order

顺序来执行的。pytest -vs ./test/test_1.py

参考链接

Pytest - 使用介绍

Pytest基础使用教程

pytest文档18-配置文件pytest.ini

Pytest系列 - pytest-ordering用例的执行顺序