Python中含有一个单元测试模块unittest,我们可以使用其中的工具来测试代码。在编写测试用例后,可以查看一系列输入是否得到了预期的输出。单元测试专注于测试软件单元,软件单元可以被理解为应用程序代码的最小可测试部分。
import unittest
def is_prime(number):
if number < 0 or number in (0, 1):
return False
for element in range(2, number):
if number % element == 0:
return False
return True
class MyTests(unittest.TestCase):
def test_is_prime(self):
self.assertTrue(is_prime(5))
self.assertTrue(is_prime(7))
self.assertFalse(is_prime(8))
self.assertFalse(is_prime(0))
self.assertFalse(is_prime(1))
self.assertFalse(is_prime(-1))
self.assertFalse(is_prime(-3))
self.assertFalse(is_prime(-6))
if __name__ == "__main__":
unittest.main()
在代码中我们需要测试的是一个数字是否为质数的函数is_prime
。使用unittest进行单元测试时首先要创建一个unittest.TestCase
的子类(这里是MyTests),随后调用unittest.main()
后会自动调用这个子类当中的类方法去进行测试。
在类方法中使用的assertTrue
和assertFalse
是一种断言的方式,用来判断返回值是否为True或False。其他的断言方式有
方法 | 用途 |
---|---|
assertEqual(a, b) | 核实a == b |
assertNotEqual(a, b) | 核实a != b |
assertTrue(x) | 核实x 为True |
assertFalse(x) | 核实x 为False |
assertIn(item , list ) | 核实 item 在 list 中 |
assertNotIn(item , list ) | 核实 item 不在 list 中 |
运行结果如下:
Ran 1 test in 0.001s
OK
在以往的Python中,有这样一个约定,测试模块提供一个test_suite函数,该函数返回一个TestSuite实例,当模块被命令提示符调用或被测试运行器使用时,在__main__部分会调用它。
import unittest
def is_prime(number):
if number < 0 or number in (0, 1):
return False
for element in range(2, number):
if number % element == 0:
return False
return True
class PrimesTests(unittest.TestCase):
def test_is_prime(self):
self.assertTrue(is_prime(5))
self.assertTrue(is_prime(7))
self.assertFalse(is_prime(8))
self.assertFalse(is_prime(0))
self.assertFalse(is_prime(1))
self.assertFalse(is_prime(-1))
self.assertFalse(is_prime(-3))
self.assertFalse(is_prime(-6))
class OtherTests(unittest.TestCase):
def test_true(self):
self.assertTrue(True)
def test_suite():
"""构建测试套件"""
suite = unittest.TestSuite()
suite.addTests(unittest.makeSuite(PrimesTests))
suite.addTests(unittest.makeSuite(OtherTests))
return suite
if __name__ == '__main__':
unittest.main(defaultTest='test_suite')
在上述代码中构建了一个测试套件test_suite
,其中构建了一个unittest.TestSuite()的类的实例化,随后将两个待测试的方法添加到这个实例化的对象中。
运行结果
Ran 2 tests in 0.001s
OK