Python单元测试完全指南:实例教程与最佳实践

今天我们将学习Python的单元测试并浏览Python单元测试示例程序。在上一篇教程中,我们学习了Python的zip函数。

Python单元测试

Python的unittest模块用于测试源代码的一个单元。假设您需要测试项目。您知道函数将返回什么类型的数据。在编写大量代码之后,您需要检查它是否正确输出。通常,我们会打印输出并将其与参考输出文件进行匹配,或者手动检查输出。为了减少这种痛苦,Python引入了unittest模块。使用这个模块,您可以通过一些简单的代码来检查函数的输出。在本教程中,我们将讨论Python unittest模块的基本用法,并编写一些Python单元测试用例来测试类的函数。

Python单元测试示例源代码

首先,我们需要编写一些代码来进行单元测试。我们会创建一个Python类。该类的主要目的是存储和获取人名。因此,我们编写set_name()函数来存储数据,编写get_name()函数来从该类中获取名字。

class Person:
    name = []

    def set_name(self, user_name):
        self.name.append(user_name)
        return len(self.name) - 1

    def get_name(self, user_id):
        if user_id >= len(self.name):
            return '没有此用户'
        else:
            return self.name[user_id]


if __name__ == '__main__':
    person = Person()
    print('用户Abbas已添加,ID为', person.set_name('Abbas'))
    print('与ID 0关联的用户是', person.get_name(0))

我们将这个类文件命名为Person.py。以上代码的输出将如下所示。

$ python3.6 Person.py 
用户Abbas已添加,ID为 0
与ID 0关联的用户是 Abbas
$

Python的单元测试结构

现在,让我们学习如何编写单元测试代码。通过继承 unittest.TestCase 类来创建一个个体的测试用例。通过重写或添加适当的函数,我们可以添加测试逻辑。如果 a 等于 b,以下代码将成功执行。

import unittest


class Testing(unittest.TestCase):
    def test_string(self):
        a = 'some'
        b = 'some'
        self.assertEqual(a, b)

    def test_boolean(self):
        a = True
        b = True
        self.assertEqual(a, b)

if __name__ == '__main__':
    unittest.main()

如何运行Python单元测试模块

Python单元测试,Python单元测试示例

Python单元测试结果和基本函数

这个单元测试有三种可能的结果。它们如下所示:

  1. 通过:如果所有的测试用例都通过,输出显示通过。
  2. 失败:如果任何一个测试用例失败并引发了AssertionError异常。
  3. 错误:如果引发了除AssertionError异常之外的任何异常。

在unittest模块下有几个函数。它们如下所示。

方法 检查条件
assertEqual(a,b) a==b
assertNotEqual(a,b) a != b
assertTrue(x) bool(x) 为 True
assertFalse(x) bool(x) 为 False
assertIs(a,b) a 是 b
assertIs(a,b) a 是 b
assertIsNot(a, b) a 不是 b
assertIsNone(x) x 为 None
assertIsNotNone(x) x 不为 None
assertIn(a, b) a 在 b 中
assertNotIn(a, b) a 不在 b 中
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)

Python的单元测试示例

现在是时候为我们的源类Person编写单元测试了。在这个类中,我们已经实现了两个函数 – get_name()和set_name()。现在,我们将使用unittest来测试这些函数。因此,我们为这两个函数设计了两个测试用例。请看下面的代码,您会很容易理解的。

import unittest

# 这是我们想要测试的类。所以,我们需要导入它
import Person as PersonClass


class Test(unittest.TestCase):
    """
    继承unittest.TestCase的基本类
    """
    person = PersonClass.Person()  # 实例化Person类
    user_id = []  # 存储获取的用户ID的变量
    user_name = []  # 存储人名的变量

    # 检查Person.set_name函数的测试用例函数
    def test_0_set_name(self):
        print("开始set_name测试\n")
        """
        任何以``test_``开头的方法都将被视为测试用例。
        """
        for i in range(4):
            # 初始化一个名字
            name = 'name' + str(i)
            # 将名字存储到列表变量中
            self.user_name.append(name)
            # 从函数获取用户ID
            user_id = self.person.set_name(name)
            # 检查获取的用户ID是否为空
            self.assertIsNotNone(user_id)  # 空的用户ID将导致测试失败
            # 将用户ID存储到列表中
            self.user_id.append(user_id)
        print("user_id长度 = ", len(self.user_id))
        print(self.user_id)
        print("user_name长度 = ", len(self.user_name))
        print(self.user_name)
        print("\n完成set_name测试\n")

    # 检查Person.get_name函数的测试用例函数
    def test_1_get_name(self):
        print("\n开始get_name测试\n")
        """
        任何以``test_``开头的方法都将被视为测试用例。
        """
        length = len(self.user_id)  # 存储的用户信息总数
        print("user_id长度 = ", length)
        print("user_name长度 = ", len(self.user_name))
        for i in range(6):
            # 如果i不超过总长度,则验证返回的名字
            if i < length:
                # 如果两个名字不匹配,测试用例将失败
                self.assertEqual(self.user_name[i], self.person.get_name(self.user_id[i]))
            else:
                print("测试get_name无用户情况")
                # 如果长度超过,则检查'无此用户'类型的消息
                self.assertEqual('没有此用户', self.person.get_name(i))
        print("\n完成get_name测试\n")


if __name__ == '__main__':
    # 开始unittest.main()
    unittest.main()

请注意,unittest模块按照函数名称的顺序执行测试函数,而不是按照定义的顺序执行。由于我们希望set_name测试首先执行,所以我们将测试用例函数命名为test_0_set_name和test_1_get_name。

Python单元测试示例的输出

Python单元测试教程
$ python3.6 -m unittest -v PersonTest.Test
test_0_set_name (PersonTest.Test) ... 开始set_name测试

user_id长度 =  4
[0, 1, 2, 3]
user_name长度 =  4
['name0', 'name1', 'name2', 'name3']

完成set_name测试

ok
test_1_get_name (PersonTest.Test) ... 
开始get_name测试

user_id长度 =  4
user_name长度 =  4
测试get_name无用户情况
测试get_name无用户情况

完成get_name测试

ok

----------------------------------------------------------------------
运行了 2 个测试,耗时 0.000 秒

OK
$

这就是关于Python单元测试教程的全部内容,如果想要了解更多,请阅读官方文档。若有任何进一步的疑问,请在评论框中提问。 🙂

bannerAds