介绍
在本实验中,我们将学习如何使用 Python 内置的 unittest
模块为代码编写单元测试。我们将从一个简单的函数开始,逐步扩展到测试更复杂的代码,包括与数据库交互的代码。
前提条件
在开始本实验之前,你应该对 Python 编程语言有基本的了解。你还应该熟悉如何在 Python 中编写函数。
在本实验中,我们将学习如何使用 Python 内置的 unittest
模块为代码编写单元测试。我们将从一个简单的函数开始,逐步扩展到测试更复杂的代码,包括与数据库交互的代码。
在开始本实验之前,你应该对 Python 编程语言有基本的了解。你还应该熟悉如何在 Python 中编写函数。
首先,我们需要为测试创建一个新的 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 代码编写测试,以确保其按预期工作,并在开发过程中尽早发现错误。