Python自动化脚本-运维人员宝典第三章-单元测试-单元测试框架的介绍

对项目进行测试是软件开发的基本部分。本章中,我们将学习如何在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模块以及进行备份。

☞☞☞ 第四章 自动化常规运维活动

扩展阅读

猜你喜欢

转载自juejin.im/post/7054345238462070791