使用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。为了让这种方法工作,我们需要在测试文件中调用unittestmain方法。
  • 最后,使用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. 导入utilsunittest模块。

#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感兴趣。

类似文章