pytest是一种流行的Python测试框架,支持创建简单的单元测试,也支持创建复杂的功能和集成测试。它提供了一系列有用的功能,能够方便地编写,组织和运行测试用例,并生成丰富的测试报告。
pytest的主要特点包括:
unittest
和nose
无缝对接介绍pytest之前, 先来看一下Python内置的测试库unittest, unittest是Python 标准库的一部分,在安装完Python之后就可以使用, 不需要安装任何其他模块。
Python unittest是Python自带的一个单元测试框架,用于编写和运行测试用例,以确保代码的正确性和可靠性。unittest提供了一系列的工具和断言方法,使得编写测试用例变得更加简单和高效。通过使用unittest,开发人员可以快速运行测试用例并自动化测试过程,从而节省时间和人力成本。
在Python中,unittest常被用作测试框架,它不仅仅用于单元测试,还可以进行集成测试和功能测试。unittest框架提供了丰富的API、测试控制器以及测试加载器,使得测试用例的编写和执行变得更容易。
使用unittest编写测试用例的流程如下:
直接上代码示例:
import unittest
def add(a, b):
return a + b
class TestAdd(unittest.TestCase):
def test_add(self):
self.assertEqual(add(1, 2), 3)
if __name__ == '__main__':
unittest.main()
一个测试用例是一个完整的单元测试流程,包括测试前的准备环节、执行测试动作的环节、与期望结果的对比的环节。在unittest
中,测试用例是通过继承unittest.TestCase
类来实现的,这个示例中定义了一个名为 add
的函数,并且使用了 Python 的 unittest 模块对这个函数进行了测试。
TestAdd
类继承自 unittest.TestCase
类,并包含了一个名为 test_add
的测试方法。self.assertEqual
方法来检查 add
函数是否正确计算了加法。最后,使用 unittest.main()
运行测试。运行成功的界面如下:
如果运行失败是怎么显示的呢? 修改上面的 self.assertEqual(add(1, 2), 3)
=> self.assertEqual(add(1, 2), 4)
让测试失败, 失败的界面如下:
如果没有安装pytest
,可以使用pip
来安装:
pip install pytest
如果不确定有没有安装pytest
, 可以使用 pip list
查看安装的模块, 比如:
pytest
工具会自动找到文件名和函数名都以test
开头的测试用例。
这里定义一个加法函数并对这个函数进行测试, 首先创建一个名为test_sample.py
的文件,内容如下:
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
命令行切换到包含test_sample.py
的目录,运行pytest
命令,pytest
会运行所有发现的测试,并产生一个测试报告,运行的效果如下图:
测试失败情况下,pytest 怎么显示呢?pytest
会详细地显示哪个测试失败,以及失败的详细原因。这里故意定义一个执行错误的函数test_add2(), 代码如下:
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
def test_add2():
assert add(1, 2) == 4
除了在命令行控制台运行和查看pytest的结果外, 也可以在VS Code 的Testing的活动栏,运行和查看结果。效果如下图:
需要注意的是: 点击Testing的活动栏之后, 需要选择测试的框架为 pytest。
pytest
是一个非常灵活强大的 Python 测试框架,它既能进行单元测试,也能进行功能测试, 通常与 Flask(轻量级的 Python web 框架)一起使用。
Flask 模块需要先安装, 安装方式是 pip install flask
, 安装完成之后就可以编写Flask代码了,
这里定义一个 Flask Web 应用,并且需要测试当访问/hello
时是否能返回 “Hello, World!”, 代码如下:
from flask import Flask
def create_app():
app = Flask(__name__)
@app.route('/hello')
def hello():
return 'Hello, World!'
return app
if __name__ == '__main__':
app = create_app()
app.run()
接下来, 使用pytest
来进行功能测试,使用Flask的测试客户端来模拟访问, 定义测试的文件test_app.py , 内容如下:
import pytest
from app import create_app
@pytest.fixture
def client():
app = create_app()
app.config['TESTING'] = True
with app.test_client() as client:
yield client
def test_hello(client):
response = client.get('/hello')
assert response.data == b'Hello, World!'
b
时,表示这是一个 bytes 类型的字符串,而不是普通的 str 类型。bytes 类型的字符串在 Python 中是一种原生的二进制序列类型,它的每个字符都是一个字节,可以存储任意的二进制数据。response.data
获取 HTTP 响应的内容时,返回的是 bytes 类型的内容,因为 HTTP 响应的内容是以二进制字节流的形式传输的。因此,在进行 HTTP 响应内容的比较时,需要使用 bytes 类型的字符串,而不是普通的 str 类型字符串。