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。