pytest单元测试框架

  1. 什么是单元测试框架

    单元测试是指在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试

  2. 单元测试框架主要做什么

    测试发现:从多个文件里面去找到我们测试用例

    测试执行:按照一定的顺序和规则去执行,并生成结果

    测试判断:通过断言判断预期结果和实际结果的差异

    测试报告:统计测试进度,耗时,通过率,生成测试报告

单元测试框架和自动化测试框架的关系

自动化测试框架:

  1. 提高测试效率,降低维护成本

  2. 减少人工干预,提高测试的准确性,增加代码的重用性

  3. 核心思想是让不懂代码的人也能够通过这个框架去实现自动化测试

    单元测试框架只是自动化测试框架的组成部分之一

需要安装的插件

pytest
pytest-html  # 生成html格式的自动化测试报告
pytest-xdist # 测试用例分布式执行,多CPU分发
pytest-ordering # 用于改变测试用例多执行顺序
pytest-rerunfailures # 用例失败后重跑
allure-pytest # 用于生成美观的测试报告

默认的测试用例规则

  1. 模块名必须以test_开头或者以_test结尾
  2. 测试类必须以Test开头,并且不能有init方法
  3. 测试方法必须以test开头

基础应用

运行方式

  1. 主函数模式
    通过程序入口:if __name__ == '__main__':下来执行

    (1) 运行所有:pytest.main()
    (2) 指定模块运行:pytest.main(['文件名']),如果不指定文件名,它会自动(3) 寻找当前文件夹下所有符合条件的文件并执行。

    指定文件夹执行:pytest.main(['路径/文件夹名'])

    (4) 通过nodeid去执行:

    ​ 解释一下nodeid,nodeid由模块名,分隔符,类名,方法名,函数名组成, 通过::来分割类、方法、函数

    pytest.main(['-vs', './文件夹名/文件名::类名::方法名']),如果是函数测试的话,那直接文件名后用::分割,写上函数即可。

  2. 命令行模式
    在当前目录下,执行pytest或者python -m pytest

    至于,为什么可能会执行python -m pytest呢,是因为有可能你执行pytest会找不到,这是因为通过pip安装pytest不会使其成为系统命令,而是会将其安装到python。-m命令将pytest作为其自己的命令运行,然后任何后续脚本都将作为参数。

  3. 通过读取pytest.ini配置文件运行

参数详解

-s: 表示输出调试信息,包括print打印出的信息,如果使用主函数模式,他的传参方式是一个数组,看起来像是这样

pytest.main(['-s'])

如果是命令行模式,就直接pytest -s即可

-v:输出用例的类名和方法名,可以和-s一起用

-n:支持多线程或者分布式运行测试用例,前提是安装了pytest-xdist,用法,在命令行-n 2代表启用两个线程,这个线程数可以根据需要来自己定义,在入口函数中使用的话,就直接-n=线程数即可

--reruns:代表失败后重跑,前提是安装了pytest-rerunfailures,用法,在命令行--reruns 2即可,后面的数字代表,如果失败了再跑几次,如果超过这个数它还是报错,那就说明这个东西它已经没救了。可以放弃治疗,在入口中,使用方法和-n一致。

-x:只要有一个用例错误,测试停止

--maxfail 2:失败两个用例,才会停止

-k 'XXX':根据测试用例的部分字符串指定测试用例,比如你的函数名带QQ的,那么,-k 'QQ',只有带QQ的才会被执行,不带的则会直接跳过

执行顺序

pytest默认是从上到下执行,这个和unittest的执行方式不同,unittest的顺序是由ascll码来决定顺序

标记更改执行顺序

标记更改,手动的去标记某些方法或者函数的执行顺序,这个是需要使用到装饰器,@pytest.mark.run(order=1)

order,代表的是第几个执行,例如:order=1,则是第一个执行

前提是,你安装了pytest-ordering

配置文件执行

无论是命令行模式还是入口函数模式,真正使用起来并不多,而最多的是使用配置文件,就像我们使用docker,是可以一个个的使用dockerfile来写,但是没人会这么做吧,还是一个docker-componse解决。pytest的配置文件名,是pytest.ini,一般来说,放在文件的根目录,这个没有什么可说的,但是需要 注意 的是,他的编码,必须是ANSI,可以使用notpad++来更改,或者更直接点,我们通过python代码来手动更改

import os
import codecs


# oldfile:UTF8文件的路径
# newfile:要保存的ANSI文件的路径
def convertUTF8ToANSI(oldfile, newfile):
    #打开UTF8文本文件
    f = codecs.open(oldfile, 'r', 'utf8')
    utfstr = f.read()
    f.close()

    # 把UTF8字符串转码成ANSI字符串
    outansestr = utfstr.encode('mbcs')

    # 使用二进制格式保存转码后的文本
    f = open(newfile, 'wb')
    f.write(outansestr)
    f.close()
# 头部格式,不可更改
[pytest]
# 命令行参数,用空格分割
addopts = -vs 
# 测试用例文件夹路径,可自己配置
testpaths = ./test_profile
# 配置测试搜索的模块文件名称,我们之前说过,文件名、类名、方法名都必须是固定格式,但是,这里我们变了,我们可以通过这里来设置自己定义的
python_files = test*.py
# 配置测试搜索的测试类名
python_classes = Test*
# 配置测试搜索的测试方法名
python_functions = test