python+unittest生成測試報告定時發送郵件(python+smtplib+unittest+beautifulReport)

利用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)是讓程序按秒來檢查,如果檢查太快,會浪費計算機的資源。

執行效果:
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章