精通Python自动化脚本-运维人员宝典完整目录:
第一章 Python脚本概述
第二章 Python脚本调试和性能测试
第三章 单元测试-单元测试框架的介绍
第四章 自动化常规运维活动
第五章 文件、目录和数据处理
第六章 文件存档、加密和解密
第七章 文本处理和正则表达式
第八章 文档和报告
第九章 操作各类文件
第十章 网络基础 – Socket编程
第十一章 使用Python脚本处理邮件
第十二章 使用Telnet和SSH远程监控主机
第十三章 创建图形化用户界面
第十四章 处理Apache和其它的日志文件
第十五章 SOAP和REST API通讯
第十六章 网络抓取 – 从网站上提取有用的信息
第十七章 数据收集及报表
第十八章 MySQL和SQLite数据库管理
对项目进行测试是软件开发的基本部分。本章中,我们将学习如何在Python中进行单元测试。Python中有一个称为unittest的模块,这就是一个单元测试框架。本章中我们将学习unittest这一框架。
本章中我们会学习如下课题:
- 单元测试框架的介绍
- 创建单元测试任务
什么是单元测试?
unittest是Python中的一个单元测试框架。它支持多任务,如测试夹具(test fixture)、编写测试用例、聚合测试用例进入一个测试套件,以及运行测试。
unittest支持以下4种主要概念:
- 测试夹具:这包括执行一个或多个测试的准备和清理活动
- 测试用例:这包括我们的单个测试。通过使用unittest中的TestCase基类,我们可以新建测试用例
- 测试套件:这包含一个测试用例、测试套件或两者的合集。用于一起执行测试用例
- 测试运行器:这包括安排测试执行和向用户给出输出
Python有一个我们可以在脚本中导入的unittest模块。unittest模块有TestCase类用于创建测试用例。
单个测试用例可以方法形式创建。这些方法名以单词 test 开头。因此,测试运行器可以知道哪些方法表示测试用例。
创建单元测试
在这一部分,我们来创建单元测试。我们要创建两个脚本来进行实现。一个是普通脚本,另一个是包含测试的代码。
首先,创建一个名为arithmetic.py的脚本并编写如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 在这个脚本中,我们将创建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脚本并编写如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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测试脚本,在运行脚本后将可以看到运行的结果。
像下面这样运行脚本,可得到如下输出:
1 2 3 4 5 6 |
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模块。因此前述的测试脚本也可以这么运行:
1 2 3 4 5 6 |
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脚本并加入如下代码:
1 2 3 4 5 6 7 |
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测试脚本并编写如下代码:
1 2 3 4 5 6 7 8 9 10 |
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() |
运行测试脚本如下:
1 2 3 4 5 6 7 8 9 |
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的结果。运行脚本如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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模块以及进行备份。
☞☞☞ 第四章 自动化常规运维活动
课后问题
- 什么是单元测试、自动化测试和手动测试?
点击查看单元测试一种软件测试,可对软件中的单个单元/组件进行测试。目的是验证软件的每个单元与执行效果与设计初衷一致。
自动化测试是种自动化技术,测试人员自己编写脚本并使用相应的软件来进行测试。基本上是一种手动操作的自动化过程。
手动测试是一种在软件程序中查找故障或 bug 的一种过程。在这种方法中,测试人员起到作为终端用户的重要作用,来验证应用功能是否正常运行。 - unittest以外还有哪些替代模块?
点击查看mock, nose, pytest. - 编写测试用例的用处是什么?
点击查看测试用例是一组执行用于验证软件应用具体特性或功能的动作。本文中讲解了如何设计测试用例以及各个组件的重要性。 - 什么是PEP8标准?
点击查看PEP 8是Python的样式指南。有一组格式化Python代码的规则,来最大化改善代码可读性。按照规定编写代码有助于让众多代码编写人员编写大型项目。更为符合标准也可预测。
扩展阅读
- 单元测试文档:https://docs.python.org/3/library/unittest.html
- Python中的PEP8编码标准:https://www.python.org/dev/peps/pep-0008/