1. 程式人生 > 其它 >【unittest】unittest基礎01

【unittest】unittest基礎01

一、什麼是unittest

unittest是Python單元測試框架,類似於JUnit框架。

unittest中有4個重要的概念:test fixture、 test case、 test suite,、test runner

Testcase:一個TestCase的例項就是一個測試用例(包括測試前準備環境的搭建(setUp),執行測試程式碼 (run),以及測試後環境的還原(tearDown)。

Test suite:多個測試用例集合在一起,就是TestSuite,而且TestSuite也可以巢狀TestSuite。

Test runner:其中的run(test)會執行TestSuite/TestCase中的run(result)方法。

Test fixture:對一個測試用例環境的搭建和銷燬,是一個fixture,通過覆蓋 TestCase的setUp()和tearDown()方法來實現

TestLoader:是用來載入TestCase到TestSuite中的,其中有幾個loadTestsFrom__()方法,就是從各個地方尋找TestCase,建立它們的例項,然後add到TestSuite中,再返回一個TestSuite例項。

二、簡單用法

unittest是python自帶的一個單元測試框架,類似於java的junit,基本結構是類似的。基本用法如下:

1.用import unittest匯入unittest模組

2.定義一個繼承自unittest.TestCase的測試用例類,如class xxx(unittest.TestCase):

3.定義setUp和tearDown,這兩個方法與junit相同,即如果定義了則會在每個測試case執行前先執行setUp方法,執行完畢後執行tearDown方法。

4.定義測試用例,名字以test開頭,unittest會自動將test開頭的方法放入測試用例集中。

5.一個測試用例應該只測試一個方面,測試目的和測試內容應很明確。主要是呼叫assertEqual、assertRaises等斷言方法判斷程式執行結果和預期值是否相符。

6.呼叫unittest.main()啟動測試

三、unittest模組的常用方法

assertEqual(a, b)     a == b

assertNotEqual(a, b)     a != b

assertTrue(x)     bool(x) is True

assertFalse(x)     bool(x) is False

例項展示01:

import unittest
class TestSample(unittest.TestCase):
    #類共享的fixture,在整個測試類開頭執行一次
    @classmethod
    def setUpClass(cls):
        print('整個測試類只執行一次 --start')

    #測試用例fixture
    def setUp(self):
        print('每給測試開始前執行一次')

    #測試用例預設以test開頭
    def test_equal(self):
        self.assertEqual(1,1)
    def test_not_equal(self):
        self.assertNotEqual(1,0)

    #測試用例fixture
    def tearDown(self):
        print('每個測試結束後執行一次')

    #整個測試列結束執行一次
    @classmethod
    def tearDownClass(cls):
        print('整個測試類只執行一次 --End')


if __name__ == '__main__':
    unittest.main()

實戰參考程式碼:

新建lagouTest專案:

itesting_test程式碼:

import unittest
class ITestingTest(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("整個測試類支援一次 --start")
    def setUp(self) -> None:
        print('整個測試開始前執行一次')

    # 測試用例預設以test開頭
    def test_equal(self):
        self.assertEqual(1, 1)

    def test_not_equal(self):
        self.assertNotEqual(1, 0)

    # 測試用例fixture
    def tearDown(self):
        print('每個測試結束後執行一次')

    # 整個測試列結束執行一次
    @classmethod
    def tearDownClass(cls):
        print('整個測試類只執行一次 --End')

test_to_run程式碼參考:

import unittest
class TestToRun(unittest.TestCase):
    def setUp(self) -> None:
        #setUp()方法,通常開啟瀏覽器,初始化API請求或者準備測試資料
        pass

    def testAssertNotEqual(self):
        #這裡具體的測試方法,此處只是演示
        self.assertEqual(1,2)
    def testAssertEqual(self):
        self.assertEqual(1,1)
    def tearDown(self) -> None:
        #定義測試後的清理動作
        pass

  

main.py檔案:

解析tests資料夾,手動查詢並載入測試用例到測試套件

import os
import unittest
import importlib.util
#解析tests資料夾並且返回module的字元列表
def get_module_name_string(file_dir):
    return_list=[]

    for root,dirs,file in os.walk(file_dir):
        #root 所指的是當前正在遍歷的這個資料夾的本身的地址
        #dirs 是一個 list ,內容是該資料夾中所有的目錄的名字(不包括子目錄)
        #file 同樣是 list , 內容是該資料夾中所有的檔案(不包括子目錄)
        for i in file:
            if not (i.endswith('__init__.py') or i.endswith('.pyc'))  and  i.startswith('test'):
                f=os.path.join(root,i)
                mod ='tests.' + f.split('\\tests\\')[1].replace('.py','')
                return_list.append(mod)
        return return_list



if __name__ == '__main__':
    #定義suite測試套件
    suites=unittest.TestSuite()
    #使用package.mod方式獲取所有模組的string
    #os.path.join(os.path.dirname(__file__) 獲取當前目錄
    mod_sting_list=get_module_name_string(os.path.join(os.path.dirname(__file__),'tests'))
    print(mod_sting_list)
    #遍歷每一個mod string 先匯入再把他加入測試用例
    for mod_string in  mod_sting_list:
        print(mod_string)
        #m為對應的test用例檔案目錄
        m =importlib.import_module(mod_string)
        #測試載入器TestLoader
        test_case =unittest.TestLoader().loadTestsFromModule(m)
        #新增測試用例到測試套件
        suites.addTest(test_case)
    #runner測試執行器,指定runner為TextTestRunner
    runner=unittest.TextTestRunner(verbosity=2)
    #執行suite
    runner.run(suites)

動態載入檔案

if __name__ == '__main__':
    #動態查詢測試用例檔案
    loader =unittest.defaultTestLoader
    #生成測試suite
    #os.path.join(os.path.dirname(__file__) 起始檔案位置,top_level_dir必須指定
    suite=loader.discover(os.path.join(os.path.dirname(__file__),'tests'),pattern='test*.py',top_level_dir=None)
    #runner測試執行器,指定runner為TextTestRunner
    runner=unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

執行結果展示(兩種方式結果一樣):

  

  

 

 

  

奔跑的蝸牛