unittest 组织单元测试用例

1.Test Suite()

if __name__ == '__main__':
    #unittest.main()
    print '111'
    #构造测试集
    suite = unittest.TestSuite()
    suite.addTest(TestCount("test_count2"))
    #执行测试
    runner = unittest.TextTestRunner()
    runner.run(suite)

2.MyPublic Test

如果每个类中的SetUp()和tearDown()所做的事情是一样的,可以封装一个自己的测试类

class MyPublicTest(unittest.TestCase):
    #测试前准备环境的搭建
    def setUp(self):
        print 'test start!'
    #测试后环境的还原
    def tearDown(self):
        print 'test end!'

class TestCount(MyPublicTest):
    #测试过程代码
可将注意力放在具体用例的编写上

3.拆分到不同的py文件/目录/类中

将用例按所测试的功能拆分到不同的py文件/目录

将不同的小功能划分为不同的测试类,在类下编写测试用例

待测py

测试功能点1py

测试功能点2py

runtest.py

4.让unittest单元测试框架自动识别测试用例

TestLoader 类中的 discover()方法:

自动根据测试目录递归匹配查找当前目录及子目录下测试用例文件(每个子目录下放一个__init__.py文件),并将查找到的测试用例组装到测试套件中;如果启动的不是顶层目录,则顶层目录必须单独指定


TestLoader 类:负责根据各种标准加载测试用例,并返回给测试套件;不需要创建这个类的实例

unittest提供了可以共享的defaultTestLoader类,可使用其子类和方法创建实例


#coding: utf-8
__author__ = 'KK'
import unittest

#定义测试用例的目录为当前目录
test_dir ='./'
discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')

#方便的将一个单元测试模块变成可以直接运行的测试脚本,main()使用TestLoader类来搜索所有包含在该模块中以test命名开头的测试方法并执行
if __name__ == '__main__':

    #执行测试
    runner = unittest.TextTestRunner()
    runner.run(discover)

5.用例执行的顺序

main()\discover()默认根据ASCII码的顺序加载测试用例,0-9,A-Z,a-z;故仅能通过测试用例的命名来提高被执行的优先级
使用TestSuite类的addTest()方法,先添加的先执行

6.跳过测试和预期失败

装饰器,也可作用于测试类,只需将他们定义在测试类上面即可

#coding: utf-8
__author__ = 'KK'
import unittest
from guopy05_test import j

class MyPublicTest(unittest.TestCase):
    #测试前准备环境的搭建
    def setUp(self):
        print 'test start!'
    #测试后环境的还原
    def tearDown(self):
        print 'test end!'

class TestCount(MyPublicTest):
    #测试过程代码
    @unittest.skip("直接跳过测试")
    def test_count1(self):
        sumData = j(2,3)
        self.assertEqual(sumData.add(),5)
    @unittest.skipIf(1>2,"当条件为True则跳过")
    def test_count2(self):
        sumData = j(-2,7)
        self.assertEqual(sumData.add(),5,msg = 'Failed guojunqi2!')
    @unittest.skipUnless(1>2,"当条件为True则执行")
    def test_count3(self):
        sumData = j(-2,9)
        self.assertEqual(sumData.add(),7,msg = 'Failed guojunqi3!')
    @unittest.expectedFailure
    #不管执行结果是否失败,均标记为失败,但不会抛出错误信息
    def test_count4(self):
        sumData = j(-2,9)
        self.assertEqual(sumData.add(),5,msg = 'Failed guojunqi4')

#方便的将一个单元测试模块变成可以直接运行的测试脚本,main()使用TestLoader类来搜索所有包含在该模块中以test命名开头的测试方法并执行
if __name__ == '__main__':
    unittest.main()
执行结果:

D:\Develop\Python27\pythonw.exe D:/WorkSpace/Python/guo/guoPackage/guopy06_unittest_TestSuite_skip.py
test start!
test end!
s.stest start!
test end!
x
----------------------------------------------------------------------
Ran 4 tests in 0.001s


OK (skipped=2, expected failures=1)


Process finished with exit code 0


7.fixtures

对于测试模块、类、用例的fixtures

#coding: utf-8
__author__ = 'KK'
import unittest

def setUpModule():
    print ("test module start>>>>>>>>>>>>>>>>")

def tearDownModule():
    print ("test module end>>>>>>>>>>>>>>>>>>>")

class Test(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        print ("test class start ==============>")
    @classmethod
    def tearDownClass(cls):
        print ("test class end ==============>")

    def setUp(self):
        print ("test case start ----------->")
    def tearDown(self):
        print ("test case end ------------->")
    def test_a(self):
        print ("test case1")
    def test_b(self):
        print ("test case2")

#方便的将一个单元测试模块变成可以直接运行的测试脚本,main()使用TestLoader类来搜索所有包含在该模块中以test命名开头的测试方法并执行
if __name__ == '__main__':
    unittest.main()
执行结果:
D:\Develop\Python27\pythonw.exe D:/WorkSpace/Python/guo/guoPackage/guopy06_unittest_fixtures.py
..
test module start>>>>>>>>>>>>>>>>
test class start ==============>
----------------------------------------------------------------------
test case start ----------->
Ran 2 tests in 0.000s


OK
test case1
test case end ------------->
test case start ----------->
test case2
test case end ------------->
test class end ==============>
test module end>>>>>>>>>>>>>>>>>>>


Process finished with exit code 0


8.带unittest的脚本分析

你可能感兴趣的:(Python)