文章目錄
1、關於unittest的4個重要概念
(1)test fixture 測試固件:執行前的準備、執行後的清理
(2)test case 測試用例:完整的測試流程,通過繼承unittest的TestCase類,創建新的測試用例
(3)test suite 測試套件:測試用例的集合,將測試用例集合在一起,然後一次性執行集合中的所有測試用例
(4)test runner 測試運行器:執行測試用例,生成測試結果
2、關於 TestCase
TestCase 作爲基類,自定義的子類中實現測試用例的方法,方法名需要以 testxxx 命名
3、重寫TestCase幾個特殊的方法
setUp() 每個測試方法運行前執行,測試前的初始化工作
tearDown() 每個測試方法運行結束後執行,測試後的清理工作
@classMethod
setUpClass() 單元測試的前期準備,在setUp之前執行,並且整個測試只運行一次
@classMethod
tearDownClass() 所有測試方法運行結束後執行,只運行一次
def testxxx1():
.......
def testxxx2():
.......
可以用裝飾器忽略某些測試方法
4、構建測試集 TestSuite
構建測試集,有多種方法
4.1
方法1:suite = unittest.TestSuite(列表)
if __name__ == '__main__':
suite1 = unittest.TestLoader().loadTestsFromTestCase(AClass)
suite2 = unittest.TestLoader().loadTestsFromTestCase(BClass)
suite = unittest.TestSuite([suite1,suite2])
4.2
方法2:suite.addTest(類(‘方法’))
TestSuite 實例調用 suite.addTest(…)
優點:通過這種方式,可以指定測試用例的執行順序
缺點:需要手動指定的太多
suite.addTest(…) 傳入的參數是方法
if __name__ == "__main__":
suite = unittest.TestSuite()
suite.addTest(MyTest('test_mul'))
suite.addTest(MyTest('test_add'))
#.....
4.3
方法3:suite.addTest(unittest.makeSuite(類,‘方法開頭字符串’))
用到 makeSuite 來篩選方法,篩選什麼類、以什麼開頭的方法,然後將篩選出來的方法,傳入suite.addTest(…)中
if __name__ == '__main__':
suite = unittest.TestSuite()
for n in range(1,6):
suite.addTest(unittest.makeSuite(AClass,'aaa'))
# 這樣增加了AClass中,5個以aaa開頭的方法
# 而且,不需要以 test 開頭
4.4
方法4:批量執行測試模塊(稱爲“測試發現”)
要求:其他定義了測試用例的 .py 文件,以test開頭命名
#加載當前目錄下所有有效的測試模塊,"."表示當前目錄
suite = unittest.TestLoader().discover(".")
5、運行自動化測試
5.1 單個文件的測試用例
這個文件繼承了TestCase,寫了很多 testxxx() 方法,並且想要執行其中的全部 testxxx() 方法
if __name__ == '__main__':
unittest.main()
5.2 構造測試集,然後執行
suite = .....
runner = ...
runner.run(suite)
5.2.1 TextTestRunner
runner = unittest.TextTestRunner(verbosity=2)
5.2.2 HTMLTestRunner
filename = "C:\\Test.html"
fp = file(filename,"wb")
runner = HTMLTestRunner.HTMLTestRunner(
stream = fp,
title = "Report_title",
description = "Report_description")
runner.run(suite)
fp.close()
或者,指定到當前目錄下
fp = file("./result.html",'w')
runner = HTMLTestRunner(fp,title=u'自動化測試報告')
runner.run(suite)
fp.close()