用python實現介面測試(八、Unittest測試框架)
- 2019 年 10 月 10 日
- 筆記
一、單元測試框架
不論對於開發還是測試,都離不開單元測試框架,對於開發而言使用單元測試框架,可以編寫測試程式碼來驗證驗證自己編寫的功能是否正確,對於測試而言,使用單元測試框架,可以編寫自動化的測試用例,在Python中單元測試框架是Pyunit,即unittest,unittest我一直認為是一個很優秀的單元測試框架。
官方詳細的地址是:https://docs.python.org/2/library/unittest.html
單元測試支援測試自動化、共享的安裝程式和關閉程式碼測試、 聚合成集合,測試和報告框架從測試的獨立性。單元測試模組提供可以很容易地支援這些素質的一組測試的類。
二、unittest框架間各個模組的聯繫

模組間的聯繫
在一個完整的單元測試用例中,是包含了測試韌體(setUp()和tearDown()),在測試執行的階段,我們更加願意使用測試套件(TestSuite())來組織每個測試用例來執行(TestRunner)並得到測試結果(TestReport),什麼 是測試韌體,在unittest中,setUp()與tearDown()被成為測試韌體,某些人稱為鉤子(僅僅只一個稱呼而已),它的主要目標初始化測試用例,執行測試用例後,對測試用例執行的結果做後期的處理。
三、測試用例
以下是二個測試用例,不管執行那個測試用例,都會執行setUp()和tearDown(),也就是說,在一個測試類中,如果有N個測試用例,在執行該測試類中的測試用例的時候,會執行N次setUp()和tearDown(),見程式碼:
#coding:utf-8 import unittest def div(a,b): return a/b class TestDiv(unittest.TestCase): def setUp(self): print u'開始...' def tearDown(self): print u'結束...' def test_001(self): self.assertEqual(div(1,1),1) def test_002(self): self.assertRaises(ZeroDivisionError,div,1,0) if __name__=='__main__': unittest.main(verbosity=2)
運行結果:

運行結果
可以看到,執行了二個測試用例,也執行了2次setUp()和tearDown()方法,如果這樣你感覺不明顯,可以結合selenium的測試框架來看更加直觀,見程式碼:
#coding:utf-8 import unittest from seleniumimport webdriver def div(a,b): return a/b class TestDiv(unittest.TestCase): def setUp(self): self.driver=webdriver.Chrome() self.driver.get('http://www.baidu.com') def tearDown(self): self.driver.quit() def test_001(self): self.assertEqual(self.driver.title,u'百度一下,你就知道') def test_002(self): self.assertRaises(self.driver.current_url,'http://www.baidu.com/') if __name__=='__main__': unittest.main(verbosity=2)
執程式碼後,會看到打開瀏覽器二次,當然關閉瀏覽器也是二次。
四、程式碼優化
在一個測試類中,測試用例是非常多的,這樣添加或者刪除實在是浪費時間,我們可以把源碼修改下,來實現執行一個測試,某些用例不執行的可以忽略,使用的方法是makeSuite()
#coding:utf-8 import unittest from seleniumimport webdriver def div(a,b): return a/b class TestDiv(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver=webdriver.Chrome() cls.driver.get('http://www.baidu.com') @classmethod def tearDownClass(cls): cls.driver.quit() def test_001(self): self.assertEqual(self.driver.title,u'百度一下,你就知道') @unittest.skip(u'忽略該測試用例,謝謝!') def test_002(self): self.assertEqual(self.driver.current_url,'https://www.baidu.com/') if __name__=='__main__': suite=unittest.TestSuite(unittest.makeSuite(TestDiv)) unittest.TextTestRunner(verbosity=2).run(suite)
運行結果:

makeSuite()運行結果
五、添加HTML測試報告
在python中,提供了HTMLTestRunner.py來生成測試報告,把該文件下載後,直接放到C:Python27的Lib的目錄下,就可以導入該模組使用了,見程式碼:
#coding:utf-8 import unittest from seleniumimport webdriver import HTMLTestRunner def div(a,b): return a/b class TestDiv(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver=webdriver.Chrome() cls.driver.get('http://www.baidu.com') @classmethod def tearDownClass(cls): cls.driver.quit() def test_001(self): self.assertEqual(self.driver.title,u'百度一下,你就知道') @unittest.skip(u'忽略該測試用例,謝謝!') def test_002(self): self.assertEqual(self.driver.current_url,'https://www.baidu.com/') if __name__=='__main__': suite=unittest.TestSuite(unittest.makeSuite(TestDiv)) #unittest.TextTestRunner(verbosity=2).run(suite) runner = HTMLTestRunner.HTMLTestRunner( stream=file('testReport.html', 'wb'), title=u'TestReport', description=u'測試報告詳細資訊' ) runner.run(suite)
運行程式碼後,會在當前工作目錄下生成testReport.html的測試報告,見截圖

測試報告截圖
註:
1.在打開Chrome瀏覽器中會提示如圖所示:

提示被控制
解決辦法如下:
1.在瀏覽器配置里加個參數,忽略掉這個警告提示語
option = webdriver.ChromeOptions()
option.add_argument('disable-infobars')
2.程式碼如下
#coding:utf-8 import unittest from seleniumimport webdriver import HTMLTestRunner def div(a,b): return a/b # 加啟動配置 option = webdriver.ChromeOptions() option.add_argument('disable-infobars') class TestDiv(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver=webdriver.Chrome(chrome_options=option) cls.driver.get('http://www.baidu.com')