pytest框架 基本使用

基本使⽤

测试函数形式

"""测试函数"""
def test_func(): # 要求函数名以 test 开头
 print('我是测试函数')

运行方式(命令)

pytest -s 文件名 alt

测试类方法

class TestDemo(object):  # 类名以Test开头
    def test_fun1(self):  # 方法名test开头
        print("测试1")

    def test_fun2(self):
        print("测试2")

主函数执行方式

说明: 使⽤主函数, 可以实现在代码⽂件内, ⿏标右键菜单执⾏

使用案例

import pytest


def test_fun():  # 函数名以 test开头
    print("测试函数")


class TestDemo(object):  # 类名以Test开头
    def test_fun1(self):  # 方法名test开头
        print("测试1")

    def test_fun2(self):
        print("测试2")


if __name__ == '__main__':
    # 第一个为运行参数,第二个参数为文件名
    pytest.main(["-s", "03_主函数运行方式.py"])

特殊方法

函数级别
说明: 函数级别特殊⽅法的执⾏逻辑与 UnitTest 中的 Fixture 的⽅法级别的执⾏逻辑⼀致!
import pytest


class TestDemo(object):
    def setup(self):
        print("函数开始")

    def teardown(self):
        print("函数结束")

    def test_fun1(self):
        print("测试函数1")

    def test_fun2(self):
        print("测试函数1")


if __name__ == '__main__':
    # 与测试夹具方法一致 每个函数执行前执行 setup  之后执行teardowm
    pytest.main(["-s", "04_特殊方法——函数级别.py"])
类级别
说明: 类级别特殊⽅法的执⾏逻辑与 UnitTest 中的 Fixture 的类级别的执⾏逻辑⼀致!
import pytest


class TestDemo(object):
    def setup_class(self):
        print("类开始")

    def teardown_class(self):
        print("类结束")

    def test_fun1(self):
        print("测试函数1")

    def test_fun2(self):
        print("测试函数2")


if __name__ == '__main__':
    # 与测试夹具方法一致 所有函数之前执行setup_class 所有类函数之后执行tear_down
    pytest.main(["-s", "05_特殊方法——类级别.py"])

pytest配置文件

说明: 使⽤配置⽂件后可以快速的使⽤配置的项来选择执⾏哪些测试模块
注意:
1. 在 Windows 系统下, pytest 配置⽂件中, 不允许写注释信息
2. ⼀个⼯程内只需要⼀个 pytest 配置⽂件, 并且需要保证⽂件名正确
3. ⼀般情况, 只需要将 pytest 配置⽂件, 置于⼯程根⽬录下
4. 配置有 pytest 配置⽂件的⼯程, 只需要打开命令⾏, 输⼊ pytest 指令,
即可执⾏测试
选项字段获取

alt

编写步骤

alt

使⽤步骤
说明: 打开命令⾏ -> 输⼊ pytest -> 执⾏即可
默认设置

说明: 测试⽤例⽂件名/测试类名/测试⽅法名均为 Test/test 开头

[pytest]
testpaths = ./case
addopts = -s
python_files = test*.py
python_classes = Test*
python_functions = test*
⾃定义规则
说明: 测试⽤例⽂件名/测试类名/测试⽅法名, 需要根据具体项⽬进⾏设置, 以下以 Hm/hm
为例
[pytest]
testpaths = ./case
addopts = -s
python_files = hm*.py
python_classes = Hm*
python_functions = hm*
扩展: 指定单个⽂件/类/⽅法执⾏
[pytest]
testpaths = ./case
addopts = -s
python_files = demo_case1.py
python_classes = DemoDemo1
python_functions = demo_method1

pytest 常⽤插件

HTML 报告插件

安装

⽅式1 -> 安装: pip install pytest-htm

使用

1. 在 pytest 配置⽂件中, 增加命令选项
选项: --html=./报告路径/报告⽂件名.html --self-contained-html
说明: --self-contained-html 将 CSS ⽂件内嵌到报告⽂件中
2. 执⾏ pytest 指令, 运⾏测试即可

添加命令选项执⾏ alt

控制⽅法执⾏顺序插件

安装

pip install pytest-ordering

使⽤步骤 说明: 直接在测试类或测试⽅法上⽅添加 @pytest.mark.run(order=序号)

扩展: 序号⽀持正数和负数, 以及正负混合
1. 纯正数: 数越⼩, 优先级越⾼[掌握]
2. 纯负数: 数越⼩, 优先级越⾼[了解]
3. 正负混合: 正数先按照顺序执⾏, 负数最后执⾏[了解]
import pytest

#需要安装 pytest-ordering插件
@pytest.mark.run(order=1)
class TestDemo(object):
    @pytest.mark.run(order=3)
    def test_fun1(self):
        print("测试方法1")

    @pytest.mark.run(order=2)
    def test_fun2(self):
        print("测试方法2")

    @pytest.mark.run(order=1)
    def test_fun3(self):
        print("测试方法3")


# 对类也有效果
@pytest.mark.run(order=0.5)
class TestDemo1(object):
    def test_fun4(self):
        print("测试方法1-1")


if __name__ == '__main__':
    # @pytest.mark.run(order=1)
    # 正数数字越小越 先执行
    # 负数     越小越先执行
    # 正负数混合先执行正数后负数
    pytest.main(["-s", "07_控制函数执行顺序——orderring.py"])

运行结果 alt

失败重试插件

安装

pip install pytest-rerunfailures

使用

1. 在 pytest 配置⽂件中, 增加命令选项
选项: --reruns 次数
2. 执⾏ pytest 指令, 运⾏测试即可

alt

pytest ⾼级功能

跳过操作
说明: 对于完成的代码或版本不对应的代码, 可以设置跳过使之不参与测试执⾏。
# 语法: @pytest.mark.skipif(符合的条件, reason='跳过的原因')
 # 说明: 如果满⾜条件, 以下⽅法或测试类执⾏跳过, 不执⾏!
 # 注意: reason= 不能省略, 否则报错

使用

import pytest

version = 12


class TestDemo(object):
    # 需要写上参数  (条件,原因)
    @pytest.mark.skipif(version >= 12, reason="版本号太高")
    def test_fun1(self):
        print("测试函数1")

    def test_fun2(self):
        print("测试函数2")


# 支持跳过类
@pytest.mark.skipif(version >= 12, reason="版本号太高")
class TestDem2(object):
    # 需要写上参数  (条件,原因)

    def test_fun1(self):
        print("测试函数2-1")


if __name__ == '__main__':
    pytest.main(["-s", "09_跳过——skip.py"])


运行结果

alt

参数化
说明: 与 UnitTest 框架不同, pytest 框架⾃带参数化功能, 调⽤对应⽅法并
传⼊数据, 即可完成参数化实现
单个参数
import pytest


class TestDemo(object):  # 类名以Test开头
    def test_fun1(self):  # 方法名test开头
        print("测试1")
    # 语法: @pytest.mark.parametrize('参数变量', ['数值1', '数值2‘ ...])
    @pytest.mark.parametrize("name", ["小米", '小红', '小黄'])
    def test_fun2(self, name):
        print("测试2", name)


if __name__ == '__main__':
    # 第一个为运行参数,第二个参数为文件名
    pytest.main(["-s", "10_参数化——单个参数.py"])


多个参数
import pytest


class TestDemo(object):  # 类名以Test开头
    def test_fun1(self):  # 方法名test开头
        print("测试1")

    # 数据格式必须为[(),()]或者[[],[]]
    @pytest.mark.parametrize("name,age", [("小米", 23), ('小黄', 56)])
    #     另一种写法
    # @pytest.mark.parametrize(("name","age"), [("小米", 23), ('小黄', 56)])
    def test_fun2(self, name, age):
        print(f"测试2{name},{age}")


if __name__ == '__main__':
    # 第一个为运行参数,第二个参数为文件名
    pytest.main(["-s", "11_参数化——多个参数.py"])

通过方法引用
import pytest


def bulid_data():
    return [("小米", 23), ('小黄', 56)]


class TestDemo(object):  # 类名以Test开头
    def test_fun1(self):  # 方法名test开头
        print("测试1")

    # 数据格式必须为[(),()]或者[[],[]]
    @pytest.mark.parametrize("name,age", bulid_data())
    #     另一种写法
    # @pytest.mark.parametrize(("name","age"), [("小米", 23), ('小黄', 56)])
    def test_fun2(self, name, age):
        print(f"测试2{name},{age}")


if __name__ == '__main__':
    # 第一个为运行参数,第二个参数为文件名
    pytest.main(["-s", "12_参数化——通过方法引入数据.py"])

断言
说明: 与 UnitTest 框架不同的是, pytest 框架使⽤ Python ⾃带的断⾔⽅
法实现断⾔操作的
Python ⾃带的断⾔⽅法
# 语法: assert 表达式
# 说明: 断⾔后接的表达式的结果为 Ture(断⾔通过), 为 False(断⾔失败)
# 预期相等:
assert 1 == 1
# 预期包含:
assert 'admin' in '欢迎 admin 归来!'
pytest 框架中使⽤断⾔
import pytest


def add(a, b):
    return a + b


class TestDemo():
    def test_fun(self):
        result = add(1, 2)
        # python自带断言 只有成功与失败两种结果成与失败
        assert result == 4
        print("断言函数")


if __name__ == '__main__':
    pytest.main(["-s", "13_断言——assert.py"])

全部评论

相关推荐

01-15 13:52
已编辑
河南大学 Java
六年要多久:标准头像,不吃香菜😂
点赞 评论 收藏
分享
02-05 08:49
已编辑
武汉大学 Web前端
野猪不是猪🐗:36k和36k之间亦有差距,ms的36k和pdd的36k不是一个概念
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务