本文的翻译是专门为Python QA工程师课程的学生准备的。
单元代码测试是软件开发生命周期不可或缺的一部分。 单元测试还构成进行回归测试的基础,也就是说,它们可以确保在添加新功能或更改现有功能时,系统将根据场景运行。
在本文中,我将在一堂课中演示单元测试的基本思想。 实际上,您将必须编写许多测试用例,将它们添加到测试套件中,然后一起运行它们。 测试用例管理将在下一篇文章中讨论。
今天,我们将专注于测试后端。 也就是说,开发人员已根据规范实施了一些项目(例如Calculator.py),而您的任务是确保开发的代码确实与它们匹配(例如,使用
TestCalculator.py
)。
假设您编写了Calculator类来执行基本的计算功能:加,减,乘和除。
此代码在此处(
Calculator.py
):
现在,我想运行一个单元测试,以了解上述类中的功能按计划工作。
Python通常随附
unittest
软件包。 如果它不在您的系统上,请使用pip进行安装。
单元测试具有以下结构:

setUp()
和
tearDown()
是unittest框架随附的标准方法(它们在unittest.TestCase类中定义)。 根据您的测试用例,默认情况下您可以覆盖或不覆盖这两种方法。
现在该来看一下测试用例的代码了。 这是文件
TestCalculator.py
。
import unittest from Calculator import Calculator
尽管这不是必需的,但通常我会以前缀Test(在我们的例子中为TestCalculator)调用测试类。 此类的一个关键要求是
unittest.TestCase
超类的存在。
每当执行此测试用例时,都会首先执行setUp()方法。 在我们的例子中,我们只创建了Calculator类的一个对象,并将其保存为该类的一个属性。 父类中还有其他几种默认方法,我们将在后面讨论。
现在,您要做的就是编写
test_xxx
方法来测试Calculator类中的每个方法。 请注意,所有测试方法
test_
前缀
test_
。 这告诉使用unittest框架的Python这些是测试方法。
在每种测试方法中,我都使用内置的
assertEqual
方法来检查计算器方法是否返回期望值。 如果返回值等于期望值,则测试成功,否则失败。
有许多内置的
assert
方法,我们将在后面讨论。
上面代码的最后一行只是启动
TestCalculator
测试用例。 它执行在类中定义的每个测试方法并返回结果。
python TestCalculator.py -v
您将看到类似于以下内容的结论:
test_add (__main__.TestCalculator) ... ok test_divide (__main__.TestCalculator) ... ok test_multiply (__main__.TestCalculator) ... ok test_subtract (__main__.TestCalculator) ... ok -------------------------------------------------------------------- Ran 4 tests in 0.000s OK
如果某些东西无法按预期工作怎么办? 让我们将
test_divide
从5更改为6(5是正确的值,现在我们将看到失败的情况。这不是源代码中的错误,而是测试套件中的错误,您可能在测试套件中也有错误,因此请始终检查测试脚本中的错误!)
import unittest from Calculator import Calculator
运行此测试用例时,将得到以下结果:
test_add (__main__.TestCalculator) ... ok test_divide (__main__.TestCalculator) ... FAIL test_multiply (__main__.TestCalculator) ... ok test_subtract (__main__.TestCalculator) ... ok ==================================================================== FAIL: test_divide (__main__.TestCalculator) -------------------------------------------------------------------- Traceback (most recent call last): File "TestCalculator.py", line 23, in test_divide self.assertEqual(self.calculator.divide(10,2), 6) AssertionError: 5.0 != 6 -------------------------------------------------------------------- Ran 4 tests in 0.001s FAILED (failures=1)
此处表示4个测试中有3个成功,但1个失败。 在实际情况下,假定您的测试用例是正确的,也就是说,以这种方式,它有助于识别未正确实现的功能。