unittest生成測試報告
1.單元測試
- 單元測試是指對軟體中的最小可測試單元進行檢查和驗證,Python中有一個自帶的單元測試框架unittest模組,不僅可以適用於單元測試,還可以適用WEB自動化測試用例的開發與執行,該測試框架可組織執行測試用例,並且提供了豐富的斷言方法,判斷測試用例是否通過,最終生成測試結果;
2.unittest庫中的基本元件
unittest.TestCase()
:是所有測試用例類繼承的基本類,一個類只要繼承了unittest中的TestCase類就是一個測試用例類,就可以在類中寫測試用例;
from unittest import TestCase, main class MyTest(TestCase): # 繼承unittest.TestCase def setUp(self): # 測試用例執行前的初始化工作 print('開始執行') def tearDown(self): # 測試用例執行之後的善後工作 print('執行完畢') def testWay(self): print('這是測試用例') if __name__ == '__main__': main() # 執行所有的測試用例
-
unittest.TestSuite()
:用來建立測試套件,其中有一個addTest()方法可以將一個或多個測試用例新增到測試套件中,先新增的哪個方法就先執行哪個方法; -
unittest.TextTextRunner()
:通過該類中的run()方法來執行suite所組裝的測試用例; -
unittest.defaultTestLoader()
:通過該類下面的discover()方法可自動根據測試目錄start_dir匹 配查詢測試用例模組(以test開頭,以.py結尾的檔案,例如:test*.py), 並將查詢到的測試用例 組裝到測試套件,因此可以直接通過run()方法執行discover; -
unittest.skip()
:裝飾器,可過濾不需要執行的用例,使這個用例不執行; -
unittest.main()
:可以方便的將一個單元測試模組變為可直接執行的測試指令碼,main()方法使 用TestLoader類來搜尋所有包含在該模組中以“test”命名開頭的測試方法,並自動執行他們 ;
3.TestCase類中的方法
-
setUp()
方法:用於測試用例執行前的初始化。如測試用例中需要訪問資料庫,可以在setUp中建立資料庫連線並進行初始化。如果測試用例需要登入web,可以先獲取cookie,獲取檔案控制代碼; -
tearDown()
方法:用於測試用例執行之後的善後工作,如關閉資料庫連線,關閉檔案; -
assert*()
:斷言方法,相當於if-else裡面的條件判斷,在執行測試用例的過程中,最終用例是否執行通過,是通過判斷測試得到的實際結果和預期結果是否相等決定的;
4.unittest中常用的斷言方法
-
assertEqual(self, first, second, msg=None)
:判斷兩個引數是否相等,如果相等則測試用例通過; -
assertNotEqual(self, first, second, msg=None)
:判斷兩個引數是否相等,如果不相等則測試用例通過; -
assertTrue(self, expr, msg=None)
:判斷是否為真,為真則測試用例通過; -
assertFalse(self, expr, msg=None)
:判斷是否為假,為假則測試用例通過; -
assertIs(a, b, msg=None)
:斷言a是否是b,如果是則測試用例通過。 -
更多的斷言方法可以檢視官網:https://docs.python.org/3/library/unittest.html#assert-methods
5.編寫測試用例
-
首先從unittest模組中匯入TestCase、main等需要用到的類;
-
然後自定義一個類繼承TestCase類;
-
可以重寫TestCase類中的setUp()初始化方法,和tearDown()清理方法,這兩個方法是成對出 現的;
-
然後編寫以字母開頭的測試用例,執行順序預設是根據ASCII碼的順序載入測試用例,數字與字母的順序為:0-9,A-Z,a-z;
-
最後呼叫unittest.main()方法將一個單元測試模組變成可以直接執行的測試指令碼,然後自動執行測試用例;
from unittest import TestCase, main
class MyTestCase(TestCase):
# setUp、tearDown每次執行一個test開頭的方法時,都會呼叫一次
def setUp(self):
print('setup')
def tearDown(self):
print('tearDown')
def test_1(self):
print('第一個測試用例')
def test_2(self):
print('第二個測試用例')
if __name__ == '__main__':
main()