使用 Python unittest 模块进行单元测试
已发表: 2021-11-08没有好的开发人员会在没有彻底测试的情况下部署代码。 单元测试是测试大型程序的各个模块的过程。
本文将讨论如何使用 Python unittest 模块对代码执行单元测试。 首先,让我们了解一下测试的类型。
说到测试,有手动测试和自动测试。 手动测试是一种测试技术,其中人类在开发完成后手动执行测试。 自动化测试是一种测试技术,其中程序自动执行测试并将结果提供给我们。
您会明白手动测试既耗时又难以执行。 因此,开发人员编写用于执行测试(自动测试)的代码。 自动化测试中有不同类型的测试。 其中一些是单元测试、集成测试、端到端测试、压力测试等,
让我们看看标准的测试流程。
- 编写或更新代码。
- 为代码的不同情况编写或更新测试。
- 运行测试(手动或使用测试运行器)。
- 查看测试结果。 如果有任何错误,请修复它们并重复这些步骤。
在这里,我们将讨论称为单元测试的最基本和最基本的测试类型。 事不宜迟,让我们深入了解实际教程。
什么是单元测试?
单元测试是一种测试一小块独立代码的技术。 大多数情况下,小块代码将是一个函数。 独立一词意味着它不依赖于项目中的其他代码段。
假设我们必须检查一个字符串是否等于“Geekflare” 。 为此,我们编写了一个函数,它接受一个参数并返回它是否等于“Geekflare” 。
def is_equal_to_geekflare(string): return string == "Geekflare"上述函数不依赖于任何其他代码。 因此,我们可以通过提供不同的输入来独立测试它。 可以在整个项目中使用独立的代码段。
单元测试的重要性
一般来说,独立块代码可以在整个项目中使用。 因此,它必须编写好并经过测试。 单元测试是用于测试那些类型的独立代码块的测试。 如果我们的项目不使用单元测试会发生什么?
假设我们没有测试整个项目中使用的小代码块。 所有其他测试,如集成测试、端到端测试等,使用其他小代码块可能会失败。 这会破坏应用程序。 这就是为什么必须很好地测试代码的基本构建块的原因。
现在,我们知道对所有独立代码块进行单元测试和编写单元测试的重要性。 由于我们执行了单元测试,因此其他测试,如集成测试、端到端测试等,不会因为独立的代码块而失败。
在接下来的部分中,我们将看到 Python unittest 模块是什么以及我们如何使用 unittest 模块在 Python 中编写单元测试。
注意:我们假设您熟悉 Python 类、模块等。如果您不熟悉 Python 中级概念,如类、模块等,您可能会发现难以理解接下来的部分。
什么是 Python 单元测试?
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 test_filename.py运行测试文件,就像一般的 Python 文件python test_filename.py。 为了让这个方法起作用,我们需要调用测试文件中unittest的main方法。 - 最后,使用
discover。 我们可以使用命令python -m unittest discover自动运行测试,而无需提及测试的文件名。 它将使用我们遵循的命名约定找到测试。 因此,我们必须在开始时使用关键字test命名我们的测试文件。
通常,在测试中,我们将代码的输出与预期的输出进行比较。 因此,为了比较输出, unittest提供了不同的方法。 您可以在此处找到比较函数的列表。
您可以毫无困难地轻松理解它们。 他们很直接。
这是很多理论。 我们现在必须开始编码。
注意:如果您对 unittest 模块有任何疑问,可以去文档中解惑。 事不宜迟,让我们使用 unittest 模块。
使用 unittest 在 Python 中进行单元测试
我们将首先编写一些函数,然后我们将专注于编写测试。 首先,在您喜欢的代码编辑器中打开一个文件夹。 并创建一个名为utils.py的文件。 将以下代码粘贴到文件中。
import math def is_prime(n): if n < 0: return 'Negative numbers are not allowed' 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 "Hello, " + name 我们在utils.py文件中有三个不同的函数。 现在,我们必须用不同的测试用例来测试每个函数。 让我们为第一个函数is_prime编写测试。

#1. 在示例文件夹中创建一个名为test_utils.py的文件作为utils.py 。
#2. 导入utils和unittest模块。
#3. 创建一个名为TestUtils的类,扩展unittest.TestCase类。 类的名称可以是任何东西。 试着给这个类起一个有意义的名字。
#4. 在类中,编写一个名为test_is_prime的方法,它接受self作为参数。
#5. 使用is_prime参数编写不同的测试用例,并将输出与预期输出进行比较。
#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), "Negative numbers are not allowed") 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模块中的一些比较函数。 您可以在此处找到完整列表。
我们已经学习了如何使用 unittest 模块编写单元测试。 现在,是时候看看运行测试的不同方法了。
如何使用 unittest 运行测试
我们已经在上一节中看到了一种运行测试用例的方法。 让我们看看其他两种使用 unittest 模块运行测试的方法。
#1. 使用文件名和 unittest 模块。
在此方法中,我们将使用 unittest 模块和文件名来运行测试。 运行测试的命令是python -m unittest filename.py 。 在我们的例子中,运行测试的命令是python -m unittest test_utils.py 。
#2. 使用发现方法
我们将使用 unittest 模块的discover方法来自动检测所有测试文件并运行它们。 要自动检测测试文件,我们需要以关键字test开头命名它们。
使用发现方法运行测试的命令是python -m unittest discover 。 该命令将检测名称以test开头的所有文件并执行它们。
结论
单元测试是编程世界中的基本测试。 现实世界中还有很多其他的测试。 试着一一学习。 我希望本教程可以帮助您使用 unittest 模块在 Python 中编写基本测试。 有pytest、Robot Framework、nose、nose2、slash等第三方库,大家可以根据项目需求自行探索。
快乐测试
您可能还对 Python 面试问题和答案感兴趣。
