Python自动化单元测试


Python单元测试框架(The Python unit testing framework),简称为PyUnit。Python 2.1 版本后,PyUnit成为 Python标准库的一部分。

###简单的例子

import random
import unittest

class TestSequenceFunctions(unittest.TestCase):

    def setUp(self):
        # c初始化环境
        self.seq = range(10)
        
    def tearDown(self):
        # 清理环境
        pass
    
    """
    以下是具体的测试用例
    """
    def test_shuffle(self):
        # make sure the shuffled sequence does not lose any elements
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, range(10))

        # should raise an exception for an immutable sequence
        self.assertRaises(TypeError, random.shuffle, (1,2,3))

    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)

    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)

if __name__ == '__main__':
    # 进行测试
    unittest.main()

setUp()用来初始化环境,而tearDown()则用来清理环境。如果setUp()抛出异常,则runTest()不会执行。当setUp()执行成功, 那么无论runTest是否成功,tearDown()方法都将被执行。
测试时,会使用assert*()当中的一种方法。如果在测试用例运行时抛出AssertionError异常,测试框架会认为测试用例失败。而其它异常会被测试框架认为是“errors”。

###Skipping tests and expected failures

这是2.7版本的一个新特性。使用skip()装饰器可以跳过某个测试。也可以把某个测试的失败当成是「意料之中」的,这样就不会将这个测试当成不通过的例子(be counted as a failure).

class MyTestCase(unittest.TestCase):

@unittest.skip("demonstrating skipping")
def test_nothing(self):
    self.fail("shouldn't happen")

@unittest.skipIf(mylib.__version__ < (1, 3),
                 "not supported in this library version")
def test_format(self):
    # Tests that work for only a certain version of the library.
    pass

@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")
def test_windows_support(self):
    # windows specific testing code
    pass

###assert方法

assert是断言,用来声明某个条件或者表达式是真的,如果不是真的,则会引发AssertionError。

assert 1 == 1

但是TestCase还有很多可以用的assert*方法:

  • assertEqual(first, second, msg=None)
  • assertNotEqual(first, second, msg=None)
  • assertTrue(expr, msg=None)
  • assertFalse(expr, msg=None)
  • assertGreater(first, second, msg=None)
  • assertGreaterEqual(first, second, msg=None)
  • assertLess(first, second, msg=None)
  • assertLessEqual(first, second, msg=None)

参考:Unit testing framework
里面提到了例如怎么复用测试代码等的其他技巧