利用python+unittest生成測試報告並定時指定人發送郵件(python+smtplib+unittest+beautifulReport)
一、什麼是unittest
unittest是Python單元測試框架
1、Testcase:
一個TestCase的實例就是一個測試用例。什麼是測試用例呢?就是一個完整的測試流程,包括測試前準備環境的搭建(setUp),執行測試代碼 (run),以及測試後環境的還原(tearDown)。元測試(unit test)的本質也就在這裏,一個測試用例是一個完整的測試單元,通過運行這個測試單元,可以對某一個問題進行驗證。
2、Test suite:
多個測試用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
3、Test runner:
執行測試用例,其中的run(test)會執行TestSuite/TestCase中的run(result)方法。
4、TestLoader:
用來加載TestCase到TestSuite中的,其中有幾個loadTestsFrom__()方法,就是從各個地方尋找TestCase,創建它們的實例,然後add到TestSuite中,再返回一個TestSuite實例。
5、Test fixture:
對一個測試用例環境的搭建和銷燬,是一個fixture,通過覆蓋 TestCase的setUp()和tearDown()方法來實現。這個有什麼用呢?比如說在這個測試用例中需要訪問數據庫,那麼可以在setUp() 中建立數據庫連接以及進行一些初始化,在tearDown()中清除在數據庫中產生的數據,然後關閉連接。注意tearDown的過程很重要,要爲以後的 TestCase留下一個乾淨的環境。關於fixture,還有一個專門的庫函數叫做fixtures,功能更加強大。
使用unittest編寫python的單元測試代碼,包括如下幾個步驟:
1、編寫一個python類,繼承 unittest模塊中的TestCase類,這就是一個測試類
2、在上面編寫的測試類中定義測試方法(這個就是指的測試用例),每個方法的方法名要求以 test 打頭,沒有額外的參數。 在該測試方法中 調用被測試代碼,校驗測試結果,TestCase類中提供了很多標準的校驗方法,如 最常見的assertEqual。
3、執行 unittest.main() ,該函數會負責運行測試,它會實例化所有TestCase的子類,並運行其中所有以test打頭的方法。
二、簡單用法
unittest是python自帶的一個單元測試框架,基本用法如下:
1.直接導入unittest模塊:import unittest
2.需繼承自unittest.TestCase的測試用例類,如class xxx(unittest.TestCase):
3.定義setUp和tearDown,即如果定義了則會在每個測試case執行前先執行setUp方法,執行完畢後執行tearDown方法。
4.定義測試用例,名字以test開頭,unittest會自動將test開頭的方法放入測試用例集中。
5.一個測試用例應該只測試一個方面,測試目的和測試內容應很明確。主要是調用assertEqual、assertRaises等斷言方法判斷程序執行結果和預期值是否相符。
6.調用unittest.main()啓動測試或者利用suite集合執行
三、unittest模塊的常用方法
assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a, b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)
四、例子一
調用unittest.main()啓動測試
代碼展示:
四、例子二
利用suite集合執行並生成測試報告HTML
代碼展示:
執行結果:
其中BeautifulReport模塊是用來生成報告的:一個基於unittest.TestResult模塊實現的測試用例模板, 可把測試中的結果通過BeautifulReport整合成一個可視化的報表
報告生成展示:
五、將測試報告發送至指定郵箱
導入庫:import smtplib
代碼展示:
這裏講解一下重點:
1、message['Subject']是什麼意思呢?爲什麼可以這樣寫呢?
等號左邊的message['Subject']的變量是一個a['b']的代碼形式,它類似字典根據鍵取值的表達,但是這裏的message是一個MIMEText類的對象,並不是一個字典
需要注意的是,不是每一個類都可以這樣訪問其屬性的,之所以能這樣訪問是因爲這個MIMEText的類實現了這個功能。
message['Subject'] = XXXX 就是在爲message['Subject']這個屬性賦值。
2、注意:這裏的密碼並不是你郵箱的密碼,而是需將SMTP服務開啓,拿到授權碼
五、升級:將測試報告定時發送至指定人郵箱
導入第三方庫:import schedule
代碼展示:
while循環,是去檢查上面的任務部署情況,如果任務已經準備就緒,就去啓動執行。其中time.sleep(1)是讓程序按秒來檢查,如果檢查太快,會浪費計算機的資源。
執行效果: