[跟着官方文档学pytest][一][学习笔记]

举报
John2021 发表于 2022/05/02 14:00:57 2022/05/02
【摘要】 pytest框架使编写小型、可读的测试变得容易,并且可以拓展以支持应用程序和库的复杂功能测试。pytest要求Python版本3.7+。PyPI包名:pytest。 安装pytest在命令提示符中输入pip指令安装pytestpip install -U pytest检查版本>pytest --versionpytest 7.1.2 写第一个pytest本例中采用的Python IDE为Py...

pytest框架使编写小型、可读的测试变得容易,并且可以拓展以支持应用程序和库的复杂功能测试。
pytest要求Python版本3.7+。
PyPI包名:pytest。

安装pytest

  1. 在命令提示符中输入pip指令安装pytest
pip install -U pytest
  1. 检查版本
>pytest --version
pytest 7.1.2

写第一个pytest

本例中采用的Python IDE为PyCharm 2022.1 (Community Edition)
创建一个名为test_sample.py的文件输入以下代码

# content of test_sample.py
def inc(x):
    return x + 1


def test_answer():
    assert inc(3) == 5

输出结果为:

[100%]是指运行所有测试用例的总体进度。完成后,pytest会显示一个失败报告,因为 func(3)不返回 5。

运行多个pytest

pytest将在当前目录及其子目录中运行test_.py或_test.py格式的所有文件。更一般地说,它遵循标准的测试发现规则。

断言引发某个异常

使用raises帮助程序断言某些代码会引发异常:

# content of test_sysexit.py
import pytest


def f():
    raise SystemExit(1)


def test_mytest():
    with pytest.raises(SystemExit):
        f()

输出结果:

对一个类中的多个测试进行分组

开发多个测试后,可能希望将它们分组到一个类中。pytest使创建包含多个测试的类变得容易:

# content of test_class.py
class TestClass:
    def test_one(self):
        x = "this"
        assert "h" in x

    def test_two(self):
        x = "hello"
        assert hasattr(x, "h")

pytest按照其Python测试发现约定发现所有测试,因此它同时找到test_前缀函数。无需对任何内容进行子类化,但请确保在类前面加上Test前缀,否则将跳过该类。我们可以通过传递模块的文件名来运行该模块:

第一个测试通过,第二个测试失败。可以轻松查看断言中的中间值,以帮助您了解失败的原因。
由于以下原因,将类中的测试分组可能有以下好处:

  • 组织测试
  • 在特定类中为测试共享工具
  • 在类级别应用标记并让它们隐式应用于所有测试

在类内对测试进行分组时需要注意的是,每个测试都有一个唯一的类实例。让每个测试共享同一个类实例将非常不利于测试隔离,并且会促进不良的测试实践。概述如下:

# content of test_class_demo.py
class TestClassDemoInstance:
    value = 0

    def test_one(self):
        self.value = 1
        assert self.value == 1

    def test_two(self):
        assert self.value == 1
pytest -k TestClassDemoInstance -q

请求用于功能测试的唯一临时目录

pytest提供了内置的固定设置/函数参数来请求任意资源,例如唯一的临时目录:

# content of test_tmp_path.py
def test_needsfiles(tmp_path):
    print(tmp_path)
    assert 0

在测试函数签名中列出名称tmp_path,pytest将在执行测试函数调用之前查找并调用fixture工厂以创建资源。在测试运行之前,pytest会创建一个唯一的每个测试调用的临时目录:

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。