1. 程式人生 > >python unittest自動化測試框架總結

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報告。

相關推薦

no