Python高级用法:使用unittest进行单元测试

前言

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()后会自动调用这个子类当中的类方法去进行测试。

在类方法中使用的assertTrueassertFalse是一种断言的方式,用来判断返回值是否为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

你可能感兴趣的:(python高级用法,python,单元测试,开发语言)