关于单元测试的一些东西

刚进公司的时候第一次听说自动化测试和自动化运帷的概念。后来项目大了之后,平凡上下线,最耗时的事情就是测试了。之前就听说过TDD(Test-Dtriven Development),但是那个时候也只是听听,知道那么回事。近段时间交易项目平凡上下线,改动较大,由于测试不完全,导致了不少问题。于是我决定在项目中加入单元测试。

Python中标准库自带的单元测试模块(unittest也叫pyunit)。

pyunit中又四个重要的概念

test fixture : 每个固件执行完之后都会调用清理函数tearDown,在执行之前都会执行初始化函数setUp。

test case : 测试用例,就是一个最小单元的测试。注意:这里的测试用例的概念和unittest.TestCase的概念不一样,这里的test case是unittest.TestCase中以test开头的函数,TestCase之所叫TestCase只不过是因为很多初始化和清理的函数相同,可以写到一起。

test suite : 这是一些test case的集合。

test runner : 测试执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

def setUpModule():
print 'setUpModule() executed'

def tearDownModule():
print 'tearDownModule() executed'

class ElevenTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print 'setUpClass() executed'

@classmethod
def tearDown(cls):
print 'tearDownClass() executed'

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

def tearDwon(self):
print 'tearDown() executed'

def test_test1(self):
self.assertEqual(1, 2)

def test_test2(self):
self.assertEqual(1, 2)

这里的ElevenTest类继承自TestCase,但是这个类不是一个测试用例,它里面又两个测试方法,这里的测试方法才是测试用例。注意,只有方法名以test开头的才会被当成是测试方法,不然不会记录统计。

这里的每一个测试方法都是一个text fixture,也就是说没执行一个测试方法都会调用setUp和tearDown方法。ElevenTest也是一个text fixture,当ElevenTest执行完之后,会执行setUpClass和tearDownClass。同时这整个文件(module)也是一个text fixture,当这个module执行完之后会调用setUpModule和tearDownModule方法。

当然test suite可以包含很多unittest.TestCase,同时它也能包含其他TestSuite。

unittest模块只是争对单元测试开发的,用起来很方便,但是对于集成测试没有什么十分大的作用。之前我的做法是事先将所有的环境建好,所有的测试用力全部放在一套单独的数据库中,后来想想既然模块中提供了setUp和tearDown方法,就在初始化的时候就把测试的环境建好了,然后在tearDown将环境恢复。创建环境的大部分操作都是有相同部分的。所以可以单独给自己写一个测试基类。另外环境相同的测试方法可以放在同一个TestCase中。

unittest: https://docs.python.org/2/library/unittest.html#