使用Python unittest模块进行单元测试
没有好的开发人员会在没有彻底测试的情况下部署代码。单元测试是测试大型程序的各个模块的过程。
本文将讨论如何使用Python unittest模块对您的代码进行单元测试。首先,让我们了解有哪些类型的测试。
谈到 testing,有手动测试和自动测试。手动测试是一种人工完成开发完成后手动执行测试的测试技术。自动测试是一种程序自动执行测试并将结果提供给我们的测试技术。
您应该已经了解到手动测试是很耗时间且难以执行的。因此,开发人员编写用于执行测试(自动测试)的代码。自动化测试中有不同类型的测试。其中一些测试包括单元测试、集成测试、端到端测试、压力测试等等。
让我们看看测试的标准流程。
- 编写或更新代码。
- 编写或更新代码的不同用例的测试。
- 运行测试(手动或使用测试运行器)。
- 查看测试结果。如果有任何错误,修复它们并重复这些步骤。
在这里,我们将讨论最重要和基本的测试类型,即单元测试。不再废话,让我们进入实际教程。
什么是单元测试?
单元测试是一种测试小块独立代码的技术。这些小块代码在大多数情况下将是函数。独立的意思是它不依赖于项目中的其他代码。
假设我们要检查一个字符串是否等于“Geekflare”。为此,我们编写了一个函数,该函数接受一个参数并返回它是否等于“Geekflare”。
def is_equal_to_yaoweibin(string):
return string == "Geekflare"
上述函数不依赖于任何其他代码。因此,我们可以通过提供不同的输入独立地测试它。这个独立的代码块可以在整个项目中使用。
单元测试的重要性
通常情况下,独立的代码块可以在整个项目中使用。因此,它必须编写和测试得很好。单元测试是用于测试这些类型独立代码块的测试。如果我们不为项目使用单元测试会发生什么?
假设我们没有测试项目中使用的小代码块。使用其他小代码块的所有其他测试,如集成测试、端到端测试等,可能会失败。这会导致应用程序出错。这就是为什么必须对代码的基本构建块进行良好的测试。
现在,我们知道了单元测试的重要性,并为所有独立代码块编写了单元测试。由于我们已经执行了单元测试,因此使用独立代码块的其他测试,如 integration 测试、端到端测试等,不会因为单独的代码块而失败。
在接下来的章节中,我们将看到Python unittest模块是什么,以及如何在 Python 中使用unittest模块编写单元测试。
注意:我们假设您熟悉Python类、模块等。如果您不熟悉Python中级概念,如类、模块等,可能难以理解接下来的章节。
什么是Python unittest?
Python unittest是一个内置的测试框架,用于测试Python代码。它有一个测试运行器,允许我们轻松运行测试。因此,我们可以使用内置的unittest模块进行测试,而不使用第三方模块。但是,这取决于您的需求。内置的unittest模块非常适合在Python中开始测试。
我们必须按照以下步骤使用unittest模块来测试Python代码。
#1. 编写代码。
#2. 导入unittest
模块。
#3. 创建一个以关键字test
开头的文件。例如test_prime.py
。关键字test用于识别测试文件。
#4. 创建一个继承unittest.TestCase
类的类。
#5. 在类内部编写方法(测试)。每个方法包含基于您的需求的不同测试用例。我们必须以test
关键字开头命名方法。
#6. 运行测试。我们可以以不同的方式运行测试。
- 运行命令
python -m unittest test_filename.py
。 - 我们像运行一般的Python文件一样运行测试文件,使用命令
python test_filename.py
。为了让这种方法工作,我们需要在测试文件中调用unittest
的main
方法。 - 最后,使用
discover
。我们可以使用命令python -m unittest discover
自动运行测试,而不需要指定测试的文件名。它将使用我们遵循的命名约定找到测试。因此,我们必须以关键字test
开头命名测试文件。
通常,在测试中,我们将代码的输出与预期输出进行比较。因此,为了比较输出,unittest提供了不同的方法。您可以在here这里找到比较函数的列表。
您可以轻松理解它们,没有任何困难。它们是直截了当的。
这是很多理论。现在我们必须开始编码。
注意:如果您对unittest模块有任何疑问,您可以访问documentation以解决疑问。不要再拖延了,让我们使用unittest模块。
使用unittest进行Python单元测试
首先,我们将编写一些函数,然后我们将专注于编写测试。首先,在您喜欢的code editor编辑器中打开一个文件夹。然后创建一个名为utils.py
的文件。将以下代码粘贴到文件中。
import math
def is_prime(n):
if n < 0:
return '不允许负数'
if n <= 1:
return False
if n == 2:
return True
if n % 2 == 0:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
def cubic(a):
return a * a * a
def say_hello(name):
return "你好," + name
在utils.py
文件中有三个不同的函数。现在,我们必须使用不同的测试用例来测试每个函数。让我们为第一个函数is_prime
编写测试。
#1. 在与utils.py
相同的文件夹中创建一个名为test_utils.py
的文件。
#2. 导入utils
和unittest
模块。
#3.创建一个名为TestUtils
的类,继承unittest.TestCase
类。类的名称可以是任意的。尽量给类一个有意义的名称。
#4. 在类内部编写一个名为test_is_prime
的方法,接受self
作为参数。
#5.使用不同的参数编写不同的测试用例,并将输出与期望的输出进行比较。
#6.示例测试用例self.assertFalse(utils.is_prime(1))
。
#7.我们期望is_prime(1)
的输出在上述情况下为假。
#8.类似于上述情况,我们将根据我们正在测试的函数编写不同的测试用例。
让我们看看这些测试。
import unittest
import utils
class TestUtils(unittest.TestCase):
def test_is_prime(self):
self.assertFalse(utils.is_prime(4))
self.assertTrue(utils.is_prime(2))
self.assertTrue(utils.is_prime(3))
self.assertFalse(utils.is_prime(8))
self.assertFalse(utils.is_prime(10))
self.assertTrue(utils.is_prime(7))
self.assertEqual(utils.is_prime(-3),
"负数不允许")
if __name__ == '__main__':
unittest.main()
我们正在调用unittest模块的main方法来使用python filename.py命令运行测试。现在运行测试。
您将看到类似于下面输出的输出。
$ python test_utils.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
现在,尝试为其他函数编写测试用例。为函数想出不同的情况并为其编写测试用例。看看以下添加到上述类中的测试。
...
class TestUtils(unittest.TestCase):
def test_is_prime(self):
...
def test_cubic(self):
self.assertEqual(utils.cubic(2), 8)
self.assertEqual(utils.cubic(-2), -8)
self.assertNotEqual(utils.cubic(2), 4)
self.assertNotEqual(utils.cubic(-3), 27)
def test_say_hello(self):
self.assertEqual(utils.say_hello("Geekflare"), "Hello, Geekflare")
self.assertEqual(utils.say_hello("Chandan"), "Hello, Chandan")
self.assertNotEqual(utils.say_hello("Chandan"), "Hi, Chandan")
self.assertNotEqual(utils.say_hello("Hafeez"), "Hi, Hafeez")
...
我们只使用了unittest模块中的一些比较函数。您可以在链接_4中找到完整的列表。
我们已经学习了如何使用unittest模块编写单元测试。现在,是时候看看运行测试的不同方法了。
如何使用unittest运行测试
我们已经在上一节中看到了运行测试用例的一种方法。让我们看看使用unittest模块运行测试的另外两种方法。
#1. 使用文件名和unittest模块。
在这种方法中,我们将使用unittest模块和文件名来运行测试。运行测试的命令是python -m unittest文件名.py。在我们的例子中,运行测试的命令是python -m unittest test_utils.py。
#2. 使用discover方法
我们将使用unittest模块的discover方法来自动检测所有测试文件并运行它们。为了自动检测测试文件,我们需要以关键字test开头命名它们。
使用discover方法运行测试的命令是python -m unittest discover。该命令将检测所有以test开头的文件并执行它们。
结论 👩💻
单元测试是编程世界中的基本测试。在现实世界中还有很多其他测试。尝试逐个学习它们。我希望本教程能帮助您使用unittest模块在Python中编写基本测试。还有pytest、Robot Framework、nose、nose2、slash等第三方库。根据您的项目要求来探索它们。
快乐测试 😎
您可能还对链接_8感兴趣。