Python学习之UnitTest【使用,生成HTML测试报告】
目錄
1、 UnitTest
1.1 TestCase
1.2 TestSuite
1.3 TextTestRunner
1.4 TestLoader
2、Fixture
2.1 方法級別
2.2 類級別
2.3 模塊級別
2.4 總結(jié)
3、斷言
3.1 UnitTest 常用斷言方法
3.2 使用方式
4、參數(shù)化
4.1 安裝 類庫
4.2 使用
5、跳過
6、生成HTML測試報告
UnitTest 是 Python 自帶的一個單元測試框架,用它來做單元測試。
為什么使用UnitTest框架?
-
能夠組織多個用例去執(zhí)行;
-
提供豐富的斷言方法;
-
能夠生成測試報告;
1、 UnitTest
UnitTest 核心要素 :
TestCase;
TestSuite;
TestRunner;
TestLoader;
Fixture;
1.1 TestCase
TestCase 就是測試用例的意思。
示例:
我們可以定義一個實現(xiàn)加法操作的函數(shù),并對該函數(shù)進行測試。
# 導(dǎo)包 import unittest# 定義函數(shù)(方法) def my_sum(i, j):return i + j;# 定義測試類 注:必須繼承unittest.TestCase class my_test(unittest.TestCase):# 定義測試方法 注: 測試方法名稱命名以 test 開頭;def test_01(self):print(my_sum(1, 2))def test_02(self):print(my_sum(3, 4))1.2 TestSuite
TestSuite 翻譯過來的意識就是 測試套件,多條測試用例集合在一起,就是一個 TestSuite。
使用:
1、實例化(suite:為 TestSuite 實例化的名稱,你可以叫a,b,c 都可以)
suite = unittest.TestSuite()2、添加用例(ClassName:為類名;MethodName:為方法名)
suite.addTest(ClassName("MethodName"))3、添加擴展:(搜索指定 ClassName 內(nèi) test 開頭的方法并添加到測試套件中)
suite.addTest(unittest.makeSuite(ClassName))注:
TestSuite 需要配合 TextTestRunner 才能被執(zhí)行
1.3 TextTestRunner
TextTestRunner 是用來執(zhí)行測試用例和測試套件的
使用:
1、實例化: runner = unittest.TextTestRunner()
2、執(zhí)行: runner.run(suite) # suite:為測試套件名稱
示例:
這里我們多寫將測試類分模塊。
Test01.py
# 導(dǎo)包 import unittest# 定義函數(shù)(方法) def my_sum(i, j):return i + j;# 定義測試類 my_test 注:必須繼承unittest.TestCase class my_test(unittest.TestCase):# 定義測試方法 注: 測試方法名稱命名以 test 開頭;def test_01(self):print("結(jié)果:%s" % my_sum(1, 2)+" my_test的test_01")def test_02(self):print("結(jié)果:%s" % my_sum(3, 4)+" my_test的test_02")Test02.py
# 導(dǎo)包 import unittest# 定義函數(shù)(方法) def my_sum(i, j):return i + j;class my_test02(unittest.TestCase):def test_01(self):print("結(jié)果:%s" % my_sum(1, 2)+" my_test02的test_01")def test_02(self):print("結(jié)果:%s" % my_sum(1, 2)+" my_test02的test_02")Test.py :執(zhí)行測試用例
import unittest import Test01 import Test02# 實例化TestSuite suite = unittest.TestSuite() # 添加用例 suite.addTest(Test01.my_test("test_01")) # 添加 my_test02 類中所有 test 開頭的方法 suite.addTest(unittest.makeSuite(Test02.my_test02)) # 實例化TextTestRunner runner = unittest.TextTestRunner() # 執(zhí)行 runner.run(suite)1.4 TestLoader
用來加載 TestCase 到 TestSuite 中,即加載滿足條件的測試用例,并把測試用例封裝成測試套件。
使用 unittest.TestLoader,通過該類下面的 discover()方法自動搜索指定目錄下指定開頭的.py 文件,并將查找到的測試用例組裝到測試套件;
使用:
suite = unittest.TestLoader().discover(test_dir, pattern='test*.py')
test_dir: 為指定的測試用例的目錄;
pattern:為查找的.py 文件的格式;
注:
如果文件名默認為'test*.py' 也可以使用 unittest.defaultTestLoader 代替 unittest.TestLoader()
示例:
import unittest# 實例化 TestLoader suite = unittest.TestLoader().discover("./", "test0*.py") # 實例化TextTestRunner runner = unittest.TextTestRunner() # 執(zhí)行 runner.run(suite)TestSuite 與 TestLoader 區(qū)別
-
TestSuite 需要手動添加測試用例(可以添加測試類,也可以添加測試類中某個測試方法);
-
TestLoader 搜索指定目錄下指定開頭.py 文件,并添加測試類中的所有的測試方法,不能指定添加測試方法;
2、Fixture
Fixture 是一個概述,對一個測試用例環(huán)境的初始化和銷毀就是一個Fixture 。
Fixture有三個控制級別:
2.1 方法級別
在TestCase,也就是測試用例所在的class中定義方法,如果一個TestCase中有多個測試用例,那么setUp和tearDown就會被自動調(diào)用多次。
使用:
-
初始化(前置處理): def setUp(self) --> 首先自動執(zhí)行;
-
銷毀(后置處理): def tearDown(self) --> 最后自動執(zhí)行;
運行于測試方法的始末,即:運行一次測試方法就會運行一次 setUp 和tearDown
示例:
# 導(dǎo)包 import unittest# 定義函數(shù)(方法) def my_sum(i, j):return i + j;# 定義測試類 my_test 注:必須繼承unittest.TestCase class my_test(unittest.TestCase):# 初始化方法def setUp(self):print("setUP 執(zhí)行初始化")# 銷毀方法def tearDown(self):print("tearDown 執(zhí)行銷毀")# 定義測試方法 注: 測試方法名稱命名以 test 開頭;def test_01(self):print("結(jié)果:%s" % my_sum(1, 2) + " my_test的test_01")def test_02(self):print("結(jié)果:%s" % my_sum(3, 4) + " my_test的test_02")2.2 類級別
不管類中有多少方法,一個類開始的時候自動調(diào)用函數(shù),結(jié)束的之后自動調(diào)用函數(shù)。
使用:
-
初始化(前置處理): @classmethod def setUpClass(cls): --> 首先自動執(zhí)行
-
銷毀(后置處理): @classmethod def tearDownClass(cls): --> 最后自動執(zhí)行
-
運行于測試類的始末 , 即: 每個測試類只會運行 一次 setUpClass 和 tearDownClass.
# 導(dǎo)包 import unittest# 定義函數(shù)(方法) def my_sum(i, j):return i + j;# 定義測試類 my_test 注:必須繼承unittest.TestCase class my_test(unittest.TestCase):# 初始化@classmethoddef setUpClass(cls):print("setUP 執(zhí)行初始化")# 銷毀方法@classmethoddef tearDownClass(cls):print("tearDown 執(zhí)行銷毀")# 定義測試方法 注: 測試方法名稱命名以 test 開頭;def test_01(self):print("結(jié)果:%s" % my_sum(1, 2) + " my_test的test_01")def test_02(self):print("結(jié)果:%s" % my_sum(3, 4) + " my_test的test_02")2.3 模塊級別
不管py文件中有多少個類,以及類中有多少方法,只自動執(zhí)行一次
使用:
-
初始化(前置處理): def setUpModule(): --> 首先自動執(zhí)行
-
銷毀(后置處理): def tearDownModule(): --> 最后自動執(zhí)行
2.4 總結(jié)
-
必須繼承 unittest.TestCase 類,setUp、tearDown 才是一個 Fixture;
-
方法級:setUp,tearDown:如果一個類中有多個測試用例,每執(zhí)行一個測試用例之前會調(diào)用一次 setUp,之后會調(diào)用一次 tearDown;
-
類級:setUpClass,tearDownClass:如果一個類中有多個測試用例,執(zhí)行所有測試用例之前只會調(diào)用一次 setUpClass,之后只會調(diào)用一次 tearDownClass;
-
模塊級:setUpModule,tearDownModule:只在 import 導(dǎo)入這個模塊時會調(diào)用一次 setUpModule,模塊使用完成之后會調(diào)用一次 tearDownModule;
-
setUpXXX:一般做初始化工作; tearDownXXX:一般做結(jié)束工作;
3、斷言
讓程序代替人為判斷測試程序執(zhí)行結(jié)果是否符合預(yù)期結(jié)果的過程。
為什么要學習斷言呢?
因為自動化腳本在執(zhí)行的時候一般都是無人值守狀態(tài),我們不知道執(zhí)行結(jié)果是否符合預(yù)期結(jié)果,所以我們需要讓程序代替人為檢測程序執(zhí)行的結(jié)果是否符合預(yù)期結(jié)果,這就需要使用斷言。
3.1 UnitTest 常用斷言方法
UnitTest 中提供了非常豐富的斷言方法,復(fù)雜的斷言方法在自動化測試中幾乎使用不到,所以我們只需要掌握幾個常用的即可。
常用的 UnitTest 斷言方法:
| 1 | assertTrue(expr, msg=None) | 驗證 expr 是 true,如果為 false,則 fail |
| 2 | assertFalse(expr, msg=None) | 驗證 expr 是 false,如果為 true,則 fail |
| 3 | assertEqual(expected, actual, msg=None) | 驗證 expected==actual,不等則 fail |
| 4 | assertNotEqual(first, second, msg=None) | 驗證 first != second, 相等則 fail |
| 5 | assertIsNone(obj, msg=None) | 驗證 obj 是 None,不是則 fail |
| 6 | assertIsNotNone(obj, msg=None) | 驗證 obj 不是 None,是則 fail |
| 7 | assertIn(member, container, msg=None) | 驗證是否 member in container |
| 8 | assertNotIn(member, container, msg=None) | 驗證是否 member not in container |
3.2 使用方式
斷言方法已經(jīng)在 unittest.TestCase 類中定義好了,而且我們自定義的測試類已經(jīng)繼承了 TestCase,所以在測試方法中直接調(diào)用即可。
# 導(dǎo)包 import unittest# 定義函數(shù)(方法) def my_sum(i, j):return i + j;# 定義測試類 my_test 注:必須繼承unittest.TestCase class my_test(unittest.TestCase):# 定義測試方法 注: 測試方法名稱命名以 test 開頭;def test_01(self):num = my_sum(1, 2)# 如果 num為4,正確self.assertEqual(3, num);def test_02(self):num = my_sum(3, 4)# 如果 num為7,正確self.assertEqual(7, num);def test_03(self):num = my_sum(1, 2)# 如果 num在列表中,正確self.assertIn(num,[1,2,3,4,5])4、參數(shù)化
上面的測試用例都存在一個問題,都是一條測試數(shù)據(jù)定義一個測試函數(shù),代碼冗余度太高。
我們可以通過參數(shù)化的方式來傳遞數(shù)據(jù),從而實現(xiàn)數(shù)據(jù)和腳本分離。
并且可以實現(xiàn)用例的重復(fù)執(zhí)行。unittest測試框架,本身不支持參數(shù)化,但是可以通過安裝 unittest擴展插件 parameterized 來實現(xiàn)。
4.1 安裝 類庫
方式一:
我們可以直接打開命令提示符輸入:pip install parameterized
方式二 :
使用PyCharm 安裝,直接看圖
?
?
4.2 使用
方式一:
import unittest from parameterized import parameterizeddef my_sum(i, j):return i + jclass my_test(unittest.TestCase):# a是調(diào)用my_sum的第一個參數(shù)# b是調(diào)用my_sum的第二個參數(shù)# c是預(yù)期結(jié)果@parameterized.expand([(1, 2, 3), (5, 6, 110), (-1, 3, 2)])def test_001(self, i, j, k):# 定義變量num得到my_sum函數(shù)的返回值num = my_sum(i, j)# num1里存放的是實際結(jié)果,k是預(yù)期結(jié)果self.assertEqual(num, k)# 實際結(jié)果與預(yù)期結(jié)果相符,代表測試用例測試通過# 不相符代表測試用例測試失敗方式二:
就是直接定義好一個列表,列表里面有元組。
方式三:
就是定義一個函數(shù)(方法),然后直接返回元組。
5、跳過
對于一些未完成的或者不滿足測試條件的測試函數(shù)和測試類,可以跳過執(zhí)行。
使用方式:
@unittest.skip('代碼未完成'):直接將測試函數(shù)標記成跳過
@unittest.skipIf(condition, reason):根據(jù)條件判斷測試函數(shù)是否跳過
示例:
6、生成HTML測試報告
HTML 測試報告就是執(zhí)行完測試用例后,以 HTML(網(wǎng)頁)方式將執(zhí)行結(jié)果生成報告。
為什么要生產(chǎn)測試報告?
因為測試報告是本次測試結(jié)果的體現(xiàn)形態(tài),然后測試報告內(nèi)包含了有關(guān)本次測試用例的詳情;
HTML 生成報告方式
一種是TextTestRunner (UnitTest 自帶),另外的就是其他的第三方模板HTMLTestRunner。
首先我們先來看看TextTestRunner如何生成測試報告的。
import unittest# 生成測試套件 suite = unittest.TestLoader().discover("./", "test0*.py") # 以只寫方式打開測試報告文件 f = open("C:/Users/jie/Desktop/test.txt", "w", encoding="utf-8") # 實例化TextTestRunner stream為open函數(shù)打開的文件流; verbosity 為不同模板編號 runner = unittest.TextTestRunner(stream=f,verbosity=2) # 執(zhí)行 runner.run(suite) # 關(guān)閉 f.close()結(jié)果
我們再來看看HTMLTestRunner 測試報告
首先要安裝HTMLTestRunner,這里要注意的是由于HTMLTestRunner是一個第三方的unittest HTML報告庫,用pip是死活安裝不了的,得去網(wǎng)上下載HTMLTestRunner.py放到存放python源代碼的Lib目錄下。大家也可以用我下好的。
HTMLTestRunner: 這是python HTMLTestRunner
import unittest from HTMLTestRunner import HTMLTestRunner# 生成測試套件 suite = unittest.TestLoader().discover("./", "test*.py") # 以只寫方式打開測試報告文件 f = open("C:/Users/jie/Desktop/test01.html", "wb") # 實例化 HTMLTestRunner 對象 stream:open 函數(shù)打開的文件流; title:[可選參數(shù)],為報告標題; description:[可選參數(shù)],為報告描述信息;比如操作系統(tǒng)、瀏覽器等版本; runner = HTMLTestRunner(stream=f, title="自動化測試報告", description="Chrome 瀏覽器") # 執(zhí)行 runner.run(suite) # 關(guān)閉 f.close()?效果
總結(jié)
以上是生活随笔為你收集整理的Python学习之UnitTest【使用,生成HTML测试报告】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html实现视频录制,保存和回放
- 下一篇: 《美国职业橄榄球大联盟》:NFL·王牌四