测试你的代码

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,我们将学习如何使用 Python 内置的 unittest 模块为代码编写单元测试。我们将从一个简单的函数开始,逐步扩展到测试更复杂的代码,包括与数据库交互的代码。

前提条件

在开始本实验之前,你应该对 Python 编程语言有基本的了解。你还应该熟悉如何在 Python 中编写函数。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/arguments_return("Arguments and Return Values") python/ModulesandPackagesGroup -.-> python/importing_modules("Importing Modules") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/custom_exceptions("Custom Exceptions") python/FileHandlingGroup -.-> python/file_operations("File Operations") subgraph Lab Skills python/function_definition -.-> lab-247{{"测试你的代码"}} python/arguments_return -.-> lab-247{{"测试你的代码"}} python/importing_modules -.-> lab-247{{"测试你的代码"}} python/catching_exceptions -.-> lab-247{{"测试你的代码"}} python/raising_exceptions -.-> lab-247{{"测试你的代码"}} python/custom_exceptions -.-> lab-247{{"测试你的代码"}} python/file_operations -.-> lab-247{{"测试你的代码"}} end

数字相加

准备工作

首先,我们需要为测试创建一个新的 Python 文件。我们将其命名为 test_my_code.py。同时,我们还需要创建一个包含待测试代码的模块。我们将这个模块命名为 my_code.py

简单测试

让我们从一个简单的函数开始,该函数返回两个数字的和。在 my_code.py 中,创建一个名为 add_numbers 的函数,该函数接受两个参数并返回它们的和。

def add_numbers(a, b):
    return a + b

现在,让我们在 test_my_code.py 中为这个函数编写测试。首先,我们需要导入 unittest 模块以及 add_numbers 函数。

import unittest
from my_code import add_numbers

接下来,我们将创建一个名为 TestAddNumbers 的类,该类继承自 unittest.TestCase

class TestAddNumbers(unittest.TestCase):
    pass

在这个类中,我们将创建一个名为 test_add_numbers 的方法,用于测试 add_numbers 函数。我们将使用 assertEqual 方法来检查函数是否返回了正确的和。

class TestAddNumbers(unittest.TestCase):
    def test_add_numbers(self):
        result = add_numbers(2, 3)
        self.assertEqual(result, 5)

现在,我们可以使用以下命令运行测试:

python -m unittest test_my_code.py

如果测试通过,你应该会看到类似以下的输出:

...
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

. 表示一个测试通过了。

测试异常

接下来,让我们测试一个会抛出异常的函数。在 my_code.py 中,创建一个名为 divide 的函数,该函数接受两个参数并返回它们的商。如果第二个参数为零,函数应抛出 ZeroDivisionError 异常。

def divide(a, b):
    if b == 0:
        raise ZeroDivisionError('Cannot divide by zero')
    return a / b

现在,让我们在 test_my_code.py 中为这个函数编写测试。我们将使用 assertRaises 方法来检查当第二个参数为零时,函数是否抛出了 ZeroDivisionError 异常。

class TestDivide(unittest.TestCase):
    def test_divide_by_zero(self):
        with self.assertRaises(ZeroDivisionError):
            divide(1, 0)

现在,我们可以再次运行测试:

python -m unittest test_my_code.py

如果测试通过,你应该会看到类似以下的输出:

...
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

.. 表示两个测试通过了。

测试数据库交互

最后,让我们测试一些与数据库交互的代码。在这个例子中,我们将使用 SQLite 和 sqlite3 模块。

my_code.py 中,创建一个名为 create_table 的函数,该函数在 SQLite 数据库中创建一个新表。

import sqlite3

def create_table():
    conn = sqlite3.connect('my_database.db')
    c = conn.cursor()
    c.execute('CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, name TEXT)')
    conn.commit()
    conn.close()

在这段代码中,我们创建了一个名为 "my_table" 的 SQLite 数据库表,包含两列:"id" 和 "name"。然后,我们定义了一个名为 TestCreateTable 的测试类,并在其中添加了一个 setUp 方法,用于为测试创建一个 SQLite 数据库。

现在,让我们为 create_table 函数编写测试。首先,我们需要为测试创建一个新的数据库。我们将在每个测试运行前的 setUp 方法中完成这一操作。

class TestCreateTable(unittest.TestCase):
    def setUp(self):
        self.conn = sqlite3.connect('my_database.db')

    def test_create_table(self):
        create_table()
        c = self.conn.cursor()
        c.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='my_table'")
        result = c.fetchone()
        self.assertIsNotNone(result)

setUp 方法中,我们创建了一个新的 SQLite 数据库。

test_create_table 方法中,我们调用 create_table 函数,然后通过 SQL 查询检查表是否已创建。

现在,我们可以再次运行测试:

python -m unittest test_my_code.py

如果测试通过,你应该会看到类似以下的输出:

...
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

... 表示三个测试通过了。

总结

在本实验中,我们学习了如何使用 unittest 模块为 Python 代码编写单元测试。我们从简单的函数开始,逐步扩展到测试更复杂的代码,包括与数据库交互的代码。通过掌握这些知识,你可以为你的 Python 代码编写测试,以确保其按预期工作,并在开发过程中尽早发现错误。