python 几种常用测试框架

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 内置的测试框架,可以从文档字符串中提取测试用例,易于编写和维护。

后端开发标签