单元测试 Unittest

2018-11-16  本文已影响14人  SingleDiego

文档:https://docs.python.org/3/library/unittest.html




基本概念




简单例子

编写单元测试时,我们需要编写一个测试类,从 unittest.TestCase 继承。

test 开头的方法就是测试方法,不以 test 开头的方法不被认为是测试方法,测试的时候不会被执行。

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        # 检查 'foo'.upper() 和 'FOO' 是否相等
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        # 检查 'FOO'.isupper() 是否为 True
        self.assertTrue('FOO'.isupper())
        # 检查 'Foo'.isupper() 是否为 Flase
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        # 捕捉 TypeError 错误
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    unittest.main()

我们把代码保存为 test.py 文件,现在这样运行它:

$ python test.py

运行结果:

...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

另一种更常见的方法是在命令行通过参数 -m unittest 直接运行单元测试:

$ python -m unittest test

这是推荐的做法,因为这样可以一次批量运行很多单元测试,并且,有很多工具可以自动来运行这些单元测试。

加上参数 -v 可以看到更详细的输出:

$ python -m unittest test -v
test_isupper (test.TestStringMethods) ... ok
test_split (test.TestStringMethods) ... ok
test_upper (test.TestStringMethods) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK




setUp 与 tearDown

可以在单元测试中编写两个特殊的 setUp()tearDown() 方法。这两个方法会分别在每调用一个测试方法的前后分别被执行。

setUp()tearDown() 方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在 setUp() 方法中连接数据库,在 tearDown() 方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码。

class TestDict(unittest.TestCase):

    def setUp(self):
        print('setUp...')

    def tearDown(self):
        print('tearDown...')
上一篇 下一篇

猜你喜欢

热点阅读