对项目进行测试是软件开发的基本部分。本章中,我们将学习如何在Python中进行单元测试。Python中有一个称为unittest的模块,这就是一个单元测试框架。本章中我们将学习unittest这一框架。
本章中我们会学习如下课题:
- 单元测试框架的介绍
- 创建单元测试任务
unittest是Python中的一个单元测试框架。它支持多任务,如测试夹具(test fixture)、编写测试用例、聚合测试用例进入一个测试套件,以及运行测试。
unittest支持以下4种主要概念:
- 测试夹具: 这包括执行一个或多个测试的准备和清理活动
- 测试用例: 这包括我们的单个测试。通过使用unittest中的TestCase基类,我们可以新建测试用例
- 测试套件: 这包含一个测试用例、测试套件或两者的合集。用于一起执行测试用例
- 测试运行器: 这包括安排测试执行和向用户给出输出
Python有一个我们可以在脚本中导入的unittest模块。unittest模块有TestCase类用于创建测试用例。
单个测试用例可以方法形式创建。这些方法名以单词 test 开头。因此,测试运行器可以知道哪些方法表示测试用例。
在这一部分,我们来创建单元测试。我们要创建两个脚本来进行实现。一个是普通脚本,另一个是包含测试的代码。
首先,创建一个名为arithmetic.py的脚本并编写如下代码:
# 在这个脚本中,我们将创建4个函数:add_numbers, sub_numbers, mul_numbers, div_numbers
def add_numbers(x, y):
return x + y
def sub_numbers(x, y):
return x - y
def mul_numbers(x, y):
return x * y
def div_numbers(x, y):
return (x / y)
在以上脚本中,我们创建了4个函数:add_numbers, sub_numbers, mul_numbers和div_numbers。下面我们将编写这些函数的测试用例。首先,我们将学习如何为add_numbers函数编写测试用例。创建test_addition.py脚本并编写如下代码:
import arithmetic
import unittest
# Testing add_numbers function from arithmetic.
class Test_addition(unittest.TestCase):
# Testing Integers
def test_add_numbers_int(self):
sum = arithmetic.add_numbers(50, 50)
self.assertEqual(sum, 100)
# Testing Floats
def test_add_numbers_float(self):
sum = arithmetic.add_numbers(50.55, 78)
self.assertEqual(sum, 128.55)
#Testing Strings
def test_add_numbers_strings(self):
sum = arithmetic.add_numbers('hello','python')
self.assertEqual(sum, 'hellopython')
if __name__ == '__main__':
unittest.main()
在以上脚本中,我们为add_numbers函数编写了三个测试用例。第一个是测试整型数字,第二个测试浮点数,第三个测试字符串。字符串的加法表示对字符串进行拼接。类似地,我们可以为减法、乘法和除法编写测试用例。
下面我们将运行test_addition.py测试脚本,在运行脚本后将可以看到运行的结果。
像下面这样运行脚本,可得到如下输出:
vagrant@python-scripting:~$ python3 test_addition.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
这里我们得到的结果是OK,表示我们的测试是成功的。
不论何时运行测试脚本,我们可能得到的三种测试结果如下:
结果 | 描述 |
---|---|
OK | 成功 |
FAIL | 测试失败-抛出AssertionError异常 |
ERROR | 抛出AssertionError以外的异常 |
使用unittest时,有一些方法可以在我们的脚本中使用。这些方法如下:
- assertEqual()和assertNotEqual():检测预期结果
- assertTrue()和assertFalse():验证条件
- assertRaises():验证抛出指定的异常
- setUp()和tearDown():定义每个测试方法执行之前和之后的指令 我们还可以在命令行中使用unittest模块。因此前述的测试脚本也可以这么运行:
vagrant@python-scripting:~$ python3 -m unittest test_addition.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.001s
OK
下面我们来看另一个示例。我们创建两个脚本:if_example.py和test_if.py。if_example.py 是我们的常规脚本,test_if.py将包含测试用例。在这个测试中,我们检查所输入的数字是否等于100.如果等于100,我们的测试将会成功。否则应显示一个FAILED的结果。
创建一个if_example.py脚本并加入如下代码:
def check_if():
a = int(input("Enter a number \n"))
if(a == 100):
print("a is equal to 100")
else:
print("a is not equal to 100")
return a
现在来创建test_if.py测试脚本并编写如下代码:
import if_example
import unittest
class Test_if(unittest.TestCase):
def test_if(self):
result = if_example.check_if()
self.assertEqual(result, 100)
if __name__ == '__main__':
unittest.main()
运行测试脚本如下:
vagrant@python-scripting:~/Chapter03$ python3 -m unittest test_if.py
Enter a number
100
a is equal to 100
.
----------------------------------------------------------------------
Ran 1 test in 0.984s
OK
我们运行脚本获得了一个成功的测试结果。下面我们输入一个100以外的值,会得到一个FAILED的结果。运行脚本如下:
vagrant@python-scripting:~/Chapter03$ python3 -m unittest test_if.py
Enter a number
50
a is not equal to 100
F
======================================================================
FAIL: test_if (test_if.Test_if)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/vagrant/Chapter03/test_if.py", line 7, in test_if
self.assertEqual(result, 100)
AssertionError: 50 != 100
----------------------------------------------------------------------
Ran 1 test in 0.638s
FAILED (failures=1)
本章中我们学习了unittest,它是Python中的单元测试框架。我们还学习了如何创建单元测试中使用的测试用例和方法。
在下一章中,我们将学习如何自动化系统管理员的常规管理活动。我们将学习接收输入、处理密码、执行外部命令、读取配置文件、向脚本添加警告代码、设置CPU限制、网页浏览器启动、使用os模块以及进行备份。
☞☞☞ 第四章 自动化常规运维活动
- 单元测试文档:https://docs.python.org/3/library/unittest.html
- Python中的PEP8编码标准:https://www.python.org/dev/peps/pep-0008/