Python 2.x 中如何使用unittest模块进行单元测试

1. 什么是单元测试

单元测试是一种软件测试方法,它独立地测试软件系统中的各个单独功能模块。这些测试一般由开发人员编写和执行,目的是确保每个模块的功能都能满足其要求。

单元测试的主要优点之一是它能够提高代码的质量。通过定期运行测试套件并检测错误,开发人员能更快地检测到和修复代码中的错误,从而减少生产环境中的失败和不可预知的行为。

Python 中的 unittest 模块是一个用于单元测试的标准库。

2. unittest 模块介绍

unittest 模块是 Python 标准库的一部分,它提供了一组用于编写和运行单元测试的工具。它支持自动化测试、发现测试和生成测试报告等功能。

unittest 模块的主要组成部分如下:

测试套件(Test Suite)

测试用例(Test Case)

测试运行器(Test Runner)

测试结果(Test Result)

断言(Assertion)

2.1 测试用例

测试用例是测试的基本单元。它通常是一个函数或类,由 unittest.TestCase 基类派生而来。

下面是一个简单的测试用例例子:检查一个数字是否等于自身。

import unittest

class TestNumber(unittest.TestCase):

def test_int(self):

self.assertTrue(1 == 1)

if __name__=='__main__':

unittest.main()

在上面的测试用例中,我们使用了 TestCase 类的 assertEqual 方法来比较数字。

2.2 测试套件

测试套件是一组测试用例的集合。它们一起运行并输出测试结果。

unittest.TestSuite 类是用于创建测试套件的基类,可以通过调用 addTest() 方法添加测试用例。

下面是一个简单的测试套件例子:运行两个测试用例,每个测试用例检查两个数字是否相等。

import unittest

class TestNumbers(unittest.TestCase):

def test_int(self):

self.assertEqual(1, 1)

def test_float(self):

self.assertEqual(0.1 + 0.2, 0.3)

if __name__ == '__main__':

suite = unittest.TestSuite()

suite.addTest(TestNumbers('test_int'))

suite.addTest(TestNumbers('test_float'))

runner = unittest.TextTestRunner()

runner.run(suite)

在上面的例子中,我们创建了一个测试套件并向其添加了两个测试用例。然后,我们使用 TextTestRunner 类运行测试套件并输出结果。

2.3 测试运行器

测试运行器是一个程序,用于收集、加载并运行测试案例。unittest 提供了几种不同的运行器,每种运行器使用不同的方法和环境来执行测试。

TextTestRunner 是常用的一种测试运行器。它在控制台上输出测试结果,可以方便地查看使用情况。其他的测试运行器包括 XMLTestRunner 这一类可以将测试结果输出为 XML 文件,HTMLTestRunner 将测试结果生成 HTML 报告等。

2.4 断言

断言是用于判断测试是否出现问题的方法。unittest 的 TestCase 提供了许多不同的断言方法,用于各种不同类型的测试比较操作。

下面是一些用于断言的方法列表。

assertEqual(a, b) — 用于比较两个值是否相等

assertNotEqual(a, b) — 用于比较两个值是否不相等

assertTrue(a) — 用于检查值是否为 True

assertFalse(a) — 用于检查值是否为 False

assertIs(a, b) — 用于比较两个对象的标识符是否相同

assertIsNot(a, b) — 用于比较两个对象的标识符是否不相同

assertIsNone(a) — 用于检查值是否为 None

assertIsNotNone(a) — 用于检查值是否不为 None

assertIn(a, b) — 用于检查值 a 是否在值 b 中

assertNotIn(a, b) — 用于检查值 a 是否不在值 b 中

assertIsInstance(a, b) — 用于检查值 a 是否为 b 类型的实例

assertNotIsInstance(a, b) — 用于检查值 a 是否不为 b 类型的实例

3. 使用 unittest 模块进行单元测试

假设我们有一个名为 average 的函数,它接收一个数字列表并返回平均值。

def average(numbers):

return sum(numbers) / len(numbers)

我们想要测试此函数是否按预期工作,因此我们创建一个名为 TestAverage 的测试用例。该用例有两个测试。第一个测试检查函数是否返回正确的值,如果给定正确的数字列表,则测试成功。第二个测试检查函数是否在给定一个空列表时引发 ZeroDivisionError 错误。

import unittest

def average(numbers):

return sum(numbers) / len(numbers)

class TestAverage(unittest.TestCase):

def test_average(self):

self.assertEqual(average([1, 2, 3]), 2)

self.assertEqual(round(average([1, 2, 3, 4, 5]), 2), 3.0)

self.assertRaises(ZeroDivisionError, average, [])

if __name__ == '__main__':

unittest.main()

在上面的示例中,我们使用了 TestCase 类的 assertEqual 方法来比较数字。我们还使用了 round 函数来四舍五入到小数点后 2 位。最后,我们使用 assertRaises 方法检查函数是否在 ZeroDivisionError 异常发生时引发该异常。

4. 运行测试用例

要运行测试用例,可以使用 unittest 中的 TestLoader,它可以自动查找符合条件的测试用例。

运行所有测试用例可以使用 unittest.main() 函数。它会自动发现并运行当前模块中的所有测试用例。

另一种方法是使用 TextTestRunner 类,它会在控制台上打印测试结果。这对于大型测试套件很有用。

您还可以使用 XMLTestRunner 类将测试结果输出到 XML 文件中。这可以方便地将测试结果用于后续自动化测试。

下面是执行 TestAverage 测试用例的示例输出。

$ python test_average.py

..

----------------------------------------------------------------------

Ran 2 tests in 0.000s

OK

在上面的示例中,我们使用了 unittest.main() 函数运行测试。点表示每个测试用例的运行情况:一个点表示测试成功,一个 F 表示测试失败。

5. 结论

unittest 模块是 Python 中最基本的测试框架,它提供了必要的工具来编写和运行单元测试。unittest 提供了丰富的断言方法、测试用例和测试运行器等多个功能,可以满足您的测试需求。

在本文中,我们介绍了 unittest 的基础知识,包括单元测试的定义、unittest 的组件,以及如何使用 unittest 编写单元测试。我希望这些信息能够帮助您开始编写更高质量的 Python 代码,并确保代码正确运行。

后端开发标签