Python Unittest设置
单元测试检查一个特定的代码单元或模块是否按照开发人员的预期执行。大多数情况下,我们测试的代码单元是一个函数。
同样,我们也可以测试所有的功能。作为一个最佳实践,至少在开发过程中,我们应该进行单元测试。
因此,在开发过程的早期阶段,它可以检测到bug,我们可以不花很多时间就能修复它们。如果我们跳过这些测试,在继续进行项目时就很难修复错误。
Pythonunittest
设置
Python为单元测试提供了一个不同的框架,叫做unittest
。unittest
框架提供了一些功能。
我们使用这种方法进行的测试是相互独立的。换句话说,一个测试的成功,或失败,都不依赖于其他的测试结果。
它还提供了setup()
和teardown()
函数和测试自动化。setup()
函数允许我们设置在每个测试方法之前执行的指令。
teardown()
函数将描述每个测试方法之后运行的指令。
unittest
给了我们一些在单元测试中使用的基本概念,如测试夹具、测试案例、测试套件和测试运行器。本文讨论了使用 框架建立一个用于单元测试的 函数。unittest
setup()
创建要测试的函数
首先,我们需要建立一些函数来测试。让我们创建四个函数,用于加、减、乘、除两个数字,并得到余数。
def add(a, b):
return a + b
def subtract(a, b):
return a - b
def multiply(a, b):
return a * b
def divide(a, b):
return a / b
def remainder(a, b):
return a % b
我们可以使用print()
函数来测试上述函数,但关于成百上千的代码,这不是很实用。因此,让我们创建一个模块来测试这些函数。
创建测试模块
我们应该根据命名规则来命名我们的测试模块。我们用test_
作为名字的第一部分,然后是模块的名字。
让我们将本教程的测试模块创建为test_calc.py
。
命名规则:
test_<name>
然后我们要把unittest
框架和numCal
模块导入我们的测试模块。unittest
包括在标准库中,所以我们可以直接导入它。numCal
是我们需要测试的模块。
import unittest
import numCal
作为下一步,我们可以创建一个继承自unittest.TestCase
的类,这样我们就可以在该类中获得更多的测试能力。
class TestNumCal(unittest.TestCase):
在这个类中,我们为每个函数创建方法。在命名方法时,我们需要根据命名规则来命名这些方法。
当我们运行测试模块时,它将知道哪个方法代表测试,因为名称的第一部分是测试。否则,它将无法识别测试方法并跳过它们。
首先,让我们为add()
函数创建一个测试方法。
def test_add(self):
self.assertEqual(numCal.add(10, 5), 15)
和每个方法一样,self
是test_add()
方法的第一个参数。我们在第二行中使用了assertEqual()
方法。
由于我们的TestNumCal
类继承于unittest.TestCase
,我们可以访问所有可用的断言方法。诸如assertEqual()
,assertNotEqual()
,assertTrue()
,assertFalse()
和assertIn()
等方法可以在单元测试中使用,而且还有很多。
assertEqual()
方法检查从函数返回的值和我们期望的值之间是否相等。
然后我们需要设置测试模块直接从编辑器中运行。否则,当我们试图执行测试模块时,它将不会运行。
所以,为此,我们可以使用下面的代码。
if __name__ == '__main__':
unittest.main()
现在我们的代码应该是这样的。
import unittest
import numCal
class TestNumCal(unittest.TestCase):
def test_add(self):
self.assertEqual(numCal.add(10, 5), 15)
if __name__ == '__main__':
unittest.main()
现在我们可以通过运行test_calc.py
模块来测试add()
功能。
输出:
这里,点表示测试通过。如果测试失败,F
,如果有错误,会出现错误信息。
下面,点表示测试了多少个单元。
现在让我们再创建四个测试方法来测试其余的功能。
import unittest
import numCal
class TestNumCal(unittest.TestCase):
def test_add(self):
self.assertEqual(numCal.add(10, 5), 15)
def test_subtract(self):
self.assertEqual(numCal.subtract(10, 5), 5)
def test_multiply(self):
self.assertEqual(numCal.multiply(10, 5), 50)
def test_divide(self):
self.assertEqual(numCal.divide(10, 5), 2)
def test_remainder(self):
self.assertEqual(numCal.remainder(10, 5), 0)
if __name__ == '__main__':
unittest.main()
根据每个功能,我们应该改变测试方法的名称。
输出:
这里最难的部分是每个函数的值需要在每个测试方法中设置。当我们有数百个测试方法时,这将是一个问题。
如果需要改变这些值,我们必须审查每个测试方法并改变它们。
我们可以建立setup()
函数来克服这个问题。通过这个方法,我们只需要声明一次数值。然后在每个方法之前,它都会执行。
创建setUp()
函数
def setUp(self):
print("nsetUp")
self.num1 = 10
self.num2 = 5
在建立了setup()
函数之后,还需要改变函数的参数。首先,我们来改变test_add
方法。
def test_add(self):
print("Add")
self.assertEqual(numCal.add(self.num1, self.num2), 15)
如上所述,我们可以对其余的方法进行修改,我们的完整代码应该是下面的样子。
完整的代码:
import unittest
import numCal
class TestNumCal(unittest.TestCase):
def setUp(self):
print("nsetUp")
self.num1 = 10
self.num2 = 5
def test_add(self):
print("Add")
self.assertEqual(numCal.add(self.num1, self.num2), 15)
def test_subtract(self):
print("Subtract")
self.assertEqual(numCal.subtract(self.num1, self.num2), 5)
def test_multiply(self):
print("Multiply")
self.assertEqual(numCal.multiply(self.num1, self.num2), 50)
def test_divide(self):
print("Divide")
self.assertEqual(numCal.divide(self.num1, self.num2), 2)
def test_remainder(self):
print("remainder")
self.assertEqual(numCal.remainder(self.num1, self.num2), 0)
if __name__ == '__main__':
unittest.main()
输出:
在输出中,五个点表示测试已经通过,以及运行的测试数量。在它的下面,在每个测试之前都已经设置了值;为了识别,我们把print()
函数。
因此,在测试方法开始之前,setup()
函数执行所定义的指令,测试使用这些指令发生。
总结
在这篇文章中,我们已经了解了什么是单元测试和unittest
框架,以及如何建立一个测试模块。最重要的是,我们学会了如何使用setup()
函数来设置一些定义的指令,在每个测试方法之前执行。
当有许多测试要运行,并且我们需要改变参数值时,setup()
函数就会派上用场。