本文將以下方面,闡述UnitTest框架的初級操作:
UnitTest介紹:
unittest單元測試框架不僅可以適用於單元測試,還可以適用WEB自動化測試用例的開發與執行,該測試框架可組織執行測試用例,並且提供了豐富的斷言方法,判斷測試用例是否通過,最終生成測試結果。
UnitTest框架的優點
- 能夠組織多個用例去執行
- 提供豐富的斷言方法
- 提供豐富的日志與測試結果
需要注意的地方
- UnitTesrt框架是python自帶庫不需要下載,使用時import即可
- 新建一個測試類是需要繼承unittest.TestCase類
UnitTest框架使用:
TestCase類中定義的幾個特殊方法
- setUp():每個測試方法運行前運行,測試前的初始化工作。
- tearDown():每個測試方法運行結束后運行,測試后的清理工作。
- setUpClass():所有的測試方法運行前運行,單元測試前期准備,必須使用 @classmethod裝飾器進行修飾,setUp()函數之前執行,整個測試過程只執行一次。比如:實例化瀏覽器、瀏覽器最大化、隱式等待設置
- tearDownClass():所有的測試方法運行結束后執行,單元測試后期清理,必須使用 @classmethod裝飾器進行修飾,tearDown()之后執行,整個測試過程只執行一次。
執行用例
將功能相關的測試用例組合到一起成為一個測試用例集,unittest框架中通過TestSuite類來組裝所有的測試用例集。(也就是說,使用測試集合可 以同時執行同一個py文件中的多個測試用例類)
- TestLoader類:測試用例加載器,返回一個測試用例集合
- loadTestsFromTestCase類:根據給定的測試類,獲取其中的所有以‘test’開頭的測試方法,並返回一個測試集合
- TestSuite類:組裝測試用例的實例,支持添加和刪除用例,最后將傳遞給test runner進行測試執行
- TextTestRunner類:測試用例執行類,其中Text 表示以文本形式輸出測試結果
測試結果
. (點):執行成功,一個點表示一個測試方法
F:執行失敗,如斷言失敗(輸出日志中 failures=1表示一條用例執行失敗)
E:用例本身有異常,如除數為零(輸出日志中 errors=1表示一條用例異常)
skipped:有幾條用例被跳過執行
斷言
assertEqual(a, b,[msg = '測試失敗時打印的信息']) :斷言a和b是否相等,相等則測試用例通過。 assertNotEqual(a, b,[msg = '測試失敗時打印的信息']) :斷言a和b是否相等,不相等則測試用例通過。 assertTrue(x,[msg = '測試失敗時打印的信息']) :斷言x是否True,是True則測試用例通過。 assertFalse(x,[msg = '測試失敗時打印的信息']) :斷言x是否False,是False則測試用例通過。 assertIs(a, b,[msg = '測試失敗時打印的信息']) :斷言a是否是b,是則測試用例通過。 assertNotIs(a, b,[msg = '測試失敗時打印的信息']) :斷言a是否是b,不是則測試用例通過。 assertIsNone(x,[msg = '測試失敗時打印的信息']) :斷言x是否None,是None則測試用例通過。 assertIsNotNone(x,[msg = '測試失敗時打印的信息']) :斷言x是否None,不是None則測試用例通過。 assertIn(a, b,[msg = '測試失敗時打印的信息']) :斷言a是否在b中,在b中則測試用例通過。 assertNotIn(a, b,[msg = '測試失敗時打印的信息']) :斷言a是否在b中,不在b中則測試用例通過。 assertIsInstance(a, b,[msg = '測試失敗時打印的信息']) :斷言a是是b的一個實例,是則測試用例通過。 assertNotIsInstance(a, b,[msg = '測試失敗時打印的信息']) :斷言a是是b的一個實例,不是則測試用例通過。
HTML報告
這個模塊不能用pip進行安裝,只能下載
http://tungwaiyip.info/software/HTMLTestRunner.html
將HTMLTestRunner.py文件復制至Python安裝路徑下的lib文件夾中
執行 import HTMLTestRunner驗證
運用以上所述做個練習:
import os import sys import time import unittest import selenium import HTMLTestRunner # 繼承unittest.TestCase類 class NumberTest(unittest.TestCase): def setUp(self): self.a = 10 self.b = 15 # Unittest默認運行以test開頭的測試用例 def test_a(self): # 使用unittest.TestCase類下面的斷言方法對測試結果的判斷 self.assertEqual(self.a+self.b, 10, msg="輸入的數字不是10") # @unittest.skip('跳過用例b') def test_b(self): self.assertEqual(self.a-self.b, 20, msg="輸入的數字不是20") def test_c(self): self.assertEqual(self.a*self.b, 30, msg="輸入的數字不是30") # 在每個測試用例執行完成后都打印"結束" def tearDown(self): print("結束") class LoaderTest(unittest.TestCase): def test_d(self): print("測試LoaderTest") if __name__ == "__main__": # # 執行用例的方法:unittest.main() # # 搜索該模塊下所有以test開頭的測試用例方法,並按照ASCLL碼排序執行用例。 # unittest.main() ''' # 實例化測試套件方法 suite = unittest.TestSuite() # 一次加載多個測試用例並實例化 testlist = [NumberTest("test_a"), NumberTest("test_b")] suite.addTests(testlist) # 一次加載一個測試用例並實例化 # suite.addTest(NumberTest("test_a")) # suite.addTest(NumberTest("test_b")) # 實例化執行測試用例方法 runner = unittest.TextTestRunner() runner.run(suite) ''' # 測試套件運行測試類中的測試方法 ''' # 加載測試用例並實例化 testCase = unittest.TestLoader().loadTestsFromTestCase(NumberTest) testCase01 = unittest.TestLoader().loadTestsFromTestCase(LoaderTest) # 組裝被加載的測試用例並實例化 suite = unittest.TestSuite([testCase, testCase01]) # 運行suite unittest.TextTestRunner().run(suite) ''' # 測試套件運行測試類 ''' # 加載測試用例並實例化 testCase = unittest.TestLoader().loadTestsFromTestCase(NumberTest) # 組裝被加載的測試用例並實例化 suite1 = unittest.TestSuite([testCase]) # 實例化創建時間 cur_time = time.strftime('%Y-%m-%d_%H_%M_%S') # 實例化HTML文件的信息屬性 filename = os.path.dirname(os.path.abspath('.')) + '\\學習筆記\\' + cur_time + '.html' # 實例化打開HTML的文件操作 f = open(filename, "wb") # 實例化生成HTML的操作 runner = HTMLTestRunner.HTMLTestRunner(stream=f, title="測試報告", description='測試報告描述') # 執行用例 runner.run(suite1) ''' # HTML報告