python unittest自動化測試框架總結
一、unittest工作原理
unittest最核心的四部分是:TestCase,TestSuite,TestRunner,TestFixture
TestCase:使用者自定義的測試case的基類,呼叫run()方法,會依次呼叫setUp方法、執行用例的方法、tearDown方法。
TestSuite:測試用例集合,可以通過addTest()方法手動增加Test Case,也可以通過TestLoader自動新增Test Case,TestLoader在新增用例時,會沒有順序。
TestRunner:執行測試用例的驅動類,可以執行TestCase,也可以執行TestSuite,執行後TestCase和TestSuite會自動管理TESTResult。
TestFixture:簡單來說就是做一些測試過程中需要準備的東西,比如建立臨時的資料庫,檔案和目錄等,其中setUp()和setDown()是最常用的方法
整個的流程就是首先要寫好TestCase,然後由TestLoader載入TestCase到TestSuite,然後由TestTestRunner來執行TestSuite,執行的結果儲存在TextTestReusult中,整個過程整合在unittest.main模組中。
二、例子如下:
建立一個函式集mathfunc.pyc
def add(a,b): return a+b def minus(a, b): return a-b def multi(a, b): return a*b def divide(a, b): return a/b
接下來是為這些方法寫的一個測試:
test_mathfunc.py
# -*- coding: utf-8 -*- import unittest from mathfunc import * class TestMathFunc(unittest.TestCase): def setUp(self): print "do something befor test.prepare environment" def tearDown(self): print "do something after test.Clean up" def test_add(self): self.assertEqual(3,add(1,2)) self.assertNotEqual(3,add(2,2)) @unittest.skip("i don't want to run this case") def test_minus(self): self.assertEqual(1,minus(3,2)) def test_multi(self): self.assertEqual(6,multi(2,3)) def test_divide(self): self.assertEqual(2,divide(6,3)) self.assertEqual(2.5,divide(5,2)) if __name__ == '__main__': unittest.main()
執行結果如下:
組織TestSuite
上面的程式碼演示瞭如何編寫一個簡單的測試,下面說一下怎麼控制用例執行的順序。我們就要用到TestCase,新增到TestCaseDE中的case是會按照新增的順序執行的。
來個例子:
在資料夾中再新建一個檔案。test_suite.py
# -*- coding: utf-8 -*-
import unittest
from test_mathfunc import TestMathFunc
if __name__ == '__main__':
suite = unittest.TestSuite()
tests = [TestMathFunc("test_add"), TestMathFunc("test_minus"), TestMathFunc("test_divide")]
suite.addTests(tests)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
執行情況跟我們預料的一樣,執行了三個case,並且順序是按照我們新增進去suite的順序執行的。
將結果輸出到檔案中
修改test_suite.py
# -*- coding: UTF-8 -*-
import unittest
from test_mathfunc import TestMathFunc
from HTMLTestRunner import HTMLTestRunner
if __name__ == '__main__':
suite = unittest.TestSuite()
#使用這種方法可以對測試用例排序
#tests = [TestMathFunc("test_add"), TestMathFunc("test_minus"), TestMathFunc("test_divide")]
#suite.addTests(tests)
#使用TestLoader的方法傳入TestCase
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestMathFunc))
#在同目錄下生成txt格式的測試報告
#with open('UnittestTextReport.txt', 'a') as f:
#runner = unittest.TextTestRunner(stream=f, verbosity=2)
#runner.run(suite)
with open('HTMLReport.html','w') as f:
runner = HTMLTestRunner(stream = f,
title = u'測試報告',
description = u'測試用例的執行情況',
verbosity = 2
)
runner.run(suite)
執行此檔案,可以看到,在同目錄下生成了一個TXT檔案;也可以把測試結果以html的格式輸出到頁面上。
執行結果如下:
在網頁中開啟測試報告:
小結:
1、unittest是python自帶的單元測試框架,可以用來作為我們自動化測試框架的用例組織執行框架
2、unittest流程:寫好TestCase,然後由TestLoader載入TestCase到TestSuite,然後由TextTestRunner來執行TestSuite,執行的結果儲存在TextTestResult中,我們通過命令列或者unittest.main()執行時,main會呼叫TextTestRunner中的run來執行,或者我們可以直接通過TextTestRunner來執行用例。
3、一個class繼承unittest.TestCase即是一個TestCase,其中以 test
開頭的方法在load時被載入為一個真正的TestCase。
4、verbosity引數可以控制執行結果的輸出,0
是簡單報告、1
是一般報告、2
是詳細報告。
5、可以通過addTest和addTests向suite中新增case或suite,可以用TestLoader的loadTestsFrom__()方法。
6、用 setUp()
、tearDown()
、setUpClass()
以及 tearDownClass()
可以在用例執行前佈置環境,以及在用例執行後清理環境
7、我們可以通過skip,skipIf,skipUnless裝飾器跳過某個case,或者用TestCase.skipTest方法。
8、引數中加stream,可以將報告輸出到檔案:可以用TextTestRunner輸出txt報告,以及可以用HTMLTestRunner輸出html報告。