一峡钓、單元測試框架
不論對于開發(fā)還是測試,都離不開單元測試框架若河,對于開發(fā)而言使用單元測試框架能岩,可以編寫測試代碼來驗證驗證自己編寫的功能是否正確,對于測試而言萧福,使用單元測試框架拉鹃,可以編寫自動化的測試用例,在Python中單元測試框架是Pyunit鲫忍,即unittest,unittest我一直認(rèn)為是一個很優(yōu)秀的單元測試框架膏燕。
官方詳細(xì)的地址是:https://docs.python.org/2/library/unittest.html
單元測試支持測試自動化、共享的安裝程序和關(guān)閉代碼測試悟民、 聚合成集合坝辫,測試和報告框架從測試的獨立性。單元測試模塊提供可以很容易地支持這些素質(zhì)的一組測試的類射亏。
二近忙、unittest框架間各個模塊的聯(lián)系
在一個完整的單元測試用例中竭业,是包含了測試固件(setUp()和tearDown()),在測試執(zhí)行的階段及舍,我們更加愿意使用測試套件(TestSuite())來組織每個測試用例來執(zhí)行(TestRunner)并得到測試結(jié)果(TestReport)未辆,什么 是測試固件,在unittest中锯玛,setUp()與tearDown()被成為測試固件咐柜,某些人稱為鉤子(僅僅只一個稱呼而已),它的主要目標(biāo)初始化測試用例更振,執(zhí)行測試用例后炕桨,對測試用例執(zhí)行的結(jié)果做后期的處理。
三肯腕、測試用例
以下是二個測試用例献宫,不管執(zhí)行那個測試用例,都會執(zhí)行setUp()和tearDown()实撒,也就是說姊途,在一個測試類中,如果有N個測試用例知态,在執(zhí)行該測試類中的測試用例的時候捷兰,會執(zhí)行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'結(jié)束...'
? ? 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)
運行結(jié)果:
可以看到负敏,執(zhí)行了二個測試用例贡茅,也執(zhí)行了2次setUp()和tearDown()方法,如果這樣你感覺不明顯其做,可以結(jié)合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)
執(zhí)代碼后妖泄,會看到打開瀏覽器二次驹沿,當(dāng)然關(guān)閉瀏覽器也是二次。
四蹈胡、代碼優(yōu)化
在一個測試類中渊季,測試用例是非常多的,這樣添加或者刪除實在是浪費時間罚渐,我們可以把源碼修改下却汉,來實現(xiàn)執(zhí)行一個測試,某些用例不執(zhí)行的可以忽略荷并,使用的方法是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)
運行結(jié)果:
五、添加HTML測試報告
在python中璧坟,提供了HTMLTestRunner.py來生成測試報告既穆,把該文件下載后,直接放到C:Python27的Lib的目錄下雀鹃,就可以導(dǎo)入該模塊使用了幻工,見代碼:
#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'測試報告詳細(xì)信息'
? ? )
runner.run(suite)
運行代碼后黎茎,會在當(dāng)前工作目錄下生成testReport.html的測試報告囊颅,見截圖
注:
1.在打開Chrome瀏覽器中會提示如圖所示:
解決辦法如下:
1.在瀏覽器配置里加個參數(shù),忽略掉這個警告提示語
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')