Python单元测试发现

这篇文章将教我们单元测试以及如何为某段代码运行单元测试。我们将学习discover 命令的用法来自动识别模块名称,以及为什么它在Python中可能不起作用。

在Python中使用unittest 模块,在discover 命令的帮助下识别测试模块

我们无法触摸、闻到或感觉到软件来确定其质量,但我们可以使用测试工具来测试它。单元测试是将你的应用程序的一小部分实例化,并独立于其他部分验证其行为的方法。

换句话说,你把你的代码的一小部分,在一个小函数中单独测试。开发的这一部分经常被跳过,导致客户对你的软件的测试是一个糟糕的用户体验。

一个典型的单元测试有三个阶段:安排,行动,和断言。

安排为单元测试的运行或实例化一个对象创造适当的条件。Act给该对象一些输入或数据,Assert检查输出的数据是否符合预期。

让我们创建一个名为demo.py 的新文件并开始编写代码;我们将创建两个函数,对两个数字进行加减。这些函数只能接受整数或浮点数作为参数;否则,它将抛出一个TypeError。

def Add_TWO_NUM(a,b):
    return a+b
def SUB_TWO_NUM(a,b):
    return a-b

现在,我们将使用unittest 为测试创建一个test_functions.py 文件,因为unittest 是在 Python 发行版中内置的。我们不需要做任何事情来安装它;但是,我们可以在我们的代码中导入unittest

我们在这里添加了这个额外的前缀,test_ ,在我们的文件名前面,也就是functions.py 。这个test_ 前缀将帮助unittest 识别出这是编写单元测试功能的文件。

一开始,正如你所看到的,我们导入了模块unittest ,然后从我们要测试的模块中导入函数,然后我们初始化了一个名为TesstSomeFunctions 的类。如果你需要写一个测试类,你应该在写所有测试函数之前写一个测试类。

因为我们是测试,所以在括号中,我们需要给它unittest.TestCase ;用户定义的类应该是从unittest.TestCase 。要运行测试是函数被unittest ;这是一个单元测试的案例,这个类中的每个函数都将是一个单元测试。

我们可以像在我们的Python脚本中定义任何其他函数一样,写上def 关键字。然后用测试前缀开始命名,如test_ ,然后我们可以给它起任何名字。

unittest 模块为我们提供了断言。你可以使用unittest. 或官方文档上的所有方法看到unittest 模块中的所有资产。

使用assertEqual() 方法,我们将检查这个函数是否返回10。断言表示你要断言该函数返回所需的结果,因为我们期望的结果是10。

我们提供4和6作为这个Add_TWO_NUM() 函数的一个参数。在assertEqual() 方法的第二个参数中,我们提供了一个是否相等的检查。

我们还将测试另一个名为test_SUB_TWO_NUM() 的函数,过程将是相同的,但在这个函数中,我们测试的是一个减去两个数字的函数。现在我们需要下到文件中,写一行if __name__=='__main__' ,并使用命令unittest.main() ,运行单元测试。

import unittest
from demo import Add_TWO_NUM,SUB_TWO_NUM
class TesstSomeFunctions(unittest.TestCase):
    def test_Add_TWO_NUM(self):
        self.assertEqual(Add_TWO_NUM(4,6),10)
    def test_SUB_TWO_NUM(self):
        self.assertEqual(SUB_TWO_NUM(5,3),2)
if __name__=='__main__':
    unittest.main()

现在两个测试用例已经准备好了,让我们来运行Python文件。正如你所看到的,它给了我们两个测试的信息,在0.0秒内运行。

这两个点代表测试通过。如果测试没有通过,你会看到一个大写的F

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK

如果你不想从文件中运行你的测试模块,作为一个模块怎么办?那么,你可以通过在终端输入命令来实现。

python -m unittest test_functions.py

这个命令的作用都是一样的。

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK

如果你想要更多的信息,你可以把v - ,这意味着verbose,给你每个单元测试的更多细节。它告诉你哪个测试是最好的。

python -m unittest -v test_functions.py

输出:

test_Add_TWO_NUM (test_functions.TesstSomeFunctions) ... ok
test_SUB_TWO_NUM (test_functions.TesstSomeFunctions) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.002s
OK

还有第三个选项可以从终端运行单元测试,discover 。这个命令会自动发现所有以测试开头的模块,所以我们不需要单独传递模块名称。

这就是为什么必须给所有以test 开始的模块命名。

python -m unittest discover

输出:

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s
OK

如果测试文件名不是以test 开头,那么discover 命令将不返回任何东西,因为它把它识别为一个普通的 Python 文件或模块。关于unittest 模块的更多信息,你可以访问 python.org。