Pytest运行与测试用例调度

一、Pytest运行用例

1.1 运行多条用例

  • 运行某个/多个用例包

  • 运行某个/多个用例模块

  • 运行某个/多个用例类

  • 运行某个/多个用例方法

1.2 运行多条用例方式

  • 执行包下所有的用例:pytest/py.test [包名]

  • 执行单独一个pytest模块:pytest 文件名.py

  • 运行某个模块里面某个类:pytest 文件名.py::类名

  • 运行某个模块某个类里的方法:pytest 文件名.py::类名::方法名

1.3 运行步骤

    1. 文件右键->open in terminal

    1. 输入命令行,如pytest test_mark.py

    1. 查看运行结果

1.4 运行结果分析

  • 常用结果:fail/error/pass

  • 特殊结果:warning/deselect

二、Pytest测试用例调度与运行

2.1 命令行参数-使用缓存状态

  • --lf(--last--failed):只重新运行故障;


  • --ff(--failed-first):先运行故障,再运行其余的测试。



三、命令行参数-常用命令行参数

– help
-x:用例一旦失败(fail/error),就立刻停止执行
–maxfail=num:用例达到
-m:标记用例
-k:执行包含某个关键字的测试用例
-v:打印详细日志
-s:打印输出日志(一般-vs结合使用)
–collect-only:测试平台,pytest自动导入功能

实例:

    1. -x参数

    1. –maxfail=num参数

    1. -m参数

    1. -k参数

    1. –collect-only参数

四、Python执行pytest

4.1 使用main函数

if __name__ == '__main__':
    # 1、运行当前目录下所有符合规则的用例,包括子目录(test_*.py 和 *_test.py)
    pytest.main()
    # 2、运行test_mark1.py::test_dkej模块中的某一条用例
    pytest.main(['test_mark1.py::test_dkej','-vs'])
    # 3、运行某个 标签
    pytest.main(['test_mark1.py','-vs','-m','dkej'])

运行方式:

python test_*.py

实例:

    1. 第一种方式:

    1. 第二种方式:

    1. 第三种方式:

4.2 使用python -m pytest

五、异常处理

5.1 方法一:try…except

try:
    可能产生异常的代码块
except [(Error1, Error2, ...) [as e]]:
    处理异常的代码块1
except [(Error3, Error4, ...) [as e]]:
    处理异常的代码块2
except [Exception]:
    处理其他异常

源码:

try:
    a = int(input("请输入被除数:"))
    b = int(input("请输入除数:"))
    c = a/b
    print("您输入的两个数相除后的结果为:", c)
except (ValueError, ArithmeticError):
    print("程序发生数字格式异常或算数异常!")
except :
    print("未知异常!")
print("程序继续运行")

5.2 方法二:pytest.raises()

1. 特点

  • 可以捕获特定的异常;
  • 获取捕获异常的细节(异常类型、异常信息);
  • 发生异常,后面的代码将不会被执行。

2.用法

def test_raise():
    with pytest.raises(ValueError, match='must be 0 or None'):
        raise ValueError("value must be 0 or None")

def test_raise1():
    with pytest.raises(ValueError) as exc_info:
        raise ValueError("value must be 42")
    assert exc_info.type is ValueError
    assert exc_info.value.args[0] == "value must be 42"

源码:

import pytest


def test_raise():
    with pytest.raises((ZeroDivisionError, ValueError)):
        raise ZeroDivisionError("除数为0")

def test_raise1():
    with pytest.raises(ValueError) as exc_info:
        raise ValueError("必须输入40")
    assert exc_info.type is ValueError
    assert exc_info.value.args[0] == "必须输入40"