1. unittest
unittest 是 Python 内置的单元测试框架,它最初是从 Java 的 JUnit 演变而来的,非常适合针对单元测试编写测试用例。
1.1 简介
unittest框架本身并不提供测试,而是提供了很多工具和类,帮助测试人员创建测试用例、组织测试、运行测试用例等。
下面是一个简单的 unittest 实例:
import unittest
class TestStringMethods(unittest.TestCase):
def test_upper(self):
self.assertEqual('foo'.upper(), 'FOO')
def test_isupper(self):
self.assertTrue('FOO'.isupper())
self.assertFalse('Foo'.isupper())
def test_split(self):
s = 'hello world'
self.assertEqual(s.split(), ['hello', 'world'])
# check that s.split fails when the separator is not a string
with self.assertRaises(TypeError):
s.split(2)
if __name__ == '__main__':
unittest.main()
上面的测试使用了 unittest.TestCase 类,这个类提供了很多断言方法,可以对结果进行断言,例如,assertEqual()、assertTrue()、assertFalse() 等等。
1.2 测试用例的准备步骤
unittest 框架中测试用例的准备步骤包括:
创建测试用例类。
继承 unittest.TestCase。
在测试用例类中编写测试方法。
使用各种断言方法进行测试验证。
使用 unittest.main() 运行测试用例。
1.3 断言方法
unittest 框架提供了很多断言方法,下面列举一些常用的:
assertEqual(a, b):验证 a == b。
assertNotEqual(a, b):验证 a != b。
assertTrue(x):验证 bool(x) is True。
assertFalse(x):验证 bool(x) is False。
assertIs(a, b):验证 a is b。
assertIsNot(a, b):验证 a is not b。
assertIsNone(x):验证 x is None。
assertIsNotNone(x):验证 x is not None。
2. pytest
pytest 是一个第三方的 Python 测试框架,它可以通过一些插件和扩展实现不同的测试场景,并且兼容 unittest。
2.1 简介
pytest 的特点是易于编写和维护测试用例,支持复杂的测试场景和模块级别的测试,其缺点是性能稍差一些。
下面是一个简单的 pytest 实例:
def test_upper():
assert 'foo'.upper() == 'FOO'
def test_isupper():
assert 'FOO'.isupper()
assert not 'Foo'.isupper()
def test_split():
s = 'hello world'
assert s.split() == ['hello', 'world']
# check that s.split fails when the separator is not a string
with pytest.raises(TypeError):
s.split(2)
pytest 使用 assert 语句进行断言,没有显式的 Test 类。
2.2 fixture
pytest 提供了 fixture 来管理测试用例的环境,fixture 是一个函数,使用 @pytest.fixture 装饰器标示,可以在测试用例中使用 fixture 函数返回的数据。
下面是一个使用 fixture 的例子:
import pytest
@pytest.fixture
def input_value():
input = 39
return input
def test_divisible_by_3(input_value):
assert input_value % 3 == 0
def test_divisible_by_6(input_value):
assert input_value % 6 == 0
在测试用例中使用 input_value 参数即可使用 input_value() 函数返回的数据。
3. coverage
coverage 是一个 Python 测试工具,用于衡量 Python 代码的测试覆盖率,可以帮助开发人员了解哪些代码已经被测试。
3.1 简介
coverage 工具可以自动监测代码的运行,从而确定哪些代码已经被覆盖。
首先需要安装 coverage 工具:
pip install coverage
安装完毕后,使用 coverage 命令运行测试:
coverage run test.py
上面的命令会运行 test.py 脚本,并记录测试覆盖率。
运行完毕后,使用 coverage report 命令生成覆盖率报告:
coverage report
覆盖率报告会统计每个文件的行数和被执行的行数,并计算测试覆盖率。
3.2 更多用法
coverage 工具还有其他用法,例如使用 coverage html 命令生成 HTML 格式的覆盖率报告:
coverage html
使用 coverage erase 命令可以清除之前的统计信息。
4. doctest
doctest 是一个 Python 内置的测试框架,它可以将文档字符串中的示例代码提取出来,运行结果与文档一起构成测试用例。
4.1 简介
doctest 测试用例通常是直接编写在函数或类的文档字符串中,非常易于编写和维护。
下面是一个简单的 doctest 实例:
def add(a, b):
"""
This is a simple add function.
Example:
>>> add(2, 3)
5
>>> add(1.5, 2.5)
4.0
"""
return a + b
在函数的文档字符串中编写测试用例,格式为 >>> 代码和预期结果。
运行 doctest 单元测试:
import doctest
doctest.testmod()
doctest 框架会自动提取文档字符串中的测试用例,并运行测试,打印测试结果。
4.2 更多用法
doctest 还支持 argparse 模块、unittest 模块等的功能。
在 argparse 模块中,可以使用 doctest 来为脚本编写帮助文档。
在 unittest 模块中,可以使用 doctest 来编写测试用例。
总之,doctest 可以广泛地用于 Python 代码的测试和文档编写。
结论
本文介绍了 Python 中四种常用的测试框架:unittest、pytest、coverage、doctest。
unittest 是 Python 内置的单元测试框架,可以通过 TestCase 类提供的断言方法对测试结果进行验证。
pytest 是一个第三方的测试框架,易于编写和维护测试用例,支持使用 fixture 管理测试环境。
coverage 是一个测试工具,用于衡量 Python 代码的测试覆盖率,可以帮助开发人员了解哪些代码已经被测试。
doctest 是 Python 内置的测试框架,可以从文档字符串中提取测试用例,易于编写和维护。