unittest測試框架

unittest框架解析

unittest 是python 的單元測試框架,unittest 單元測試提供了創建測試用例,測試套件以及批量執行的方案, unittest 在安裝pyhton 以後就直接自帶了,直接import unittest 就可以使用。

作爲單元測試的框架, unittest 也是可以對程序最小模塊的一種敏捷化的測試。在自動化測試中,必須需要知道所使用語言的單元測試框架。利用單元測試框架,創建一個類,該類繼承unittest的TestCase,這樣可以把每個case看成是一個最小的單元, 由測試容器組織起來,到時候直接執行,同時引入測試報告。

在這裏插入圖片描述

構建測試套件

addTest() 的應用
當有多個或者幾百測試用例的時候, 這樣就需要一個測試容器( 測試套件) ,把測試用例放在該容器中進行執行,unittest 模塊中提供了TestSuite 類來生成測試套件,使用該類的構造函數可以生成一個測試套件的實例,該類提供了addTest來把每個測試用例加入到測試套件中。

def createsuite():
suite = unittest.TestSuite()
#將測試用例加入到測試容器(套件)中
suite.addTest(testbaidu1.Baidu1("test_baidusearch"))
suite.addTest(testbaidu1.Baidu1("test_hao"))
suite.addTest(testbaidu2.Baidu2("test_baidusearch"))
return suite

if __name__=="__main__":
suite=createsuite()
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)

makeSuite()和TestLoader()的應用
在unittest 框架中提供了makeSuite() 的方法,makeSuite可以實現把測試用例類內所有的測試case組成的測試套件TestSuite ,unittest 調用makeSuite的時候,只需要把測試類名稱傳入即可。

TestLoader 用於創建類和模塊的測試套件,一般的情況下,使TestLoader().loadTestsFromTestCase(TestClass)來加載測試類。

#手工添加案例到套件,
def createsuite():
suite = unittest.TestSuite()
#將測試用例加入到測試容器(套件)中
suite.addTest(unittest.makeSuite(testbaidu1.Baidu1))
suite.addTest(unittest.makeSuite(testbaidu2.Baidu2))
return suite
'''
suite1 =unittest.TestLoader().loadTestsFromTestCase(testbaidu1.Baidu1)
suite2 = unittest.TestLoader().loadTestsFromTestCase(testbaidu2.Baidu2)
suite = unittest.TestSuite([suite1, suite2])
return suite

``

discover()的應用

discover 是通過遞歸的方式到其子目錄中從指定的目錄開始, 找到所有測試模塊並返回一個包含它們對象的TestSuite ,然後進行加載與模式匹配唯一的測試文件,discover 參數分別爲discover(dir,pattern,top_level_dir=None)

def createsuite():
discover=unittest.defaultTestLoader.discover('../test',pattern='test*.py',top_level_dir=None)
print discover
return discover

用例的執行順序
unittest 框架默認加載測試用例的順序是根據ASCII 碼的順序,數字與字母的順序爲: 09,AZ,a~z 。所以, TestAdd 類會優先於TestBdd 類被發現, test_aaa() 方法會優先於test_ccc() 被執行。對於測試目錄與測試
文件來說, unittest 框架同樣是按照這個規則來加載測試用例。
addTest()方法按照增加順序來執行
忽略用例的執行

@unittest.skip("skipping")

unittest斷言

自動化的測試中, 對於每個單獨的case來說,一個case的執行結果中, 必然會有期望結果與實際結果, 來判斷該case是通過還是失敗, 在unittest 的庫中提供了大量的實用方法來檢查預期值與實際值, 來驗證case的結果, 一般來說, 檢查條件大體分爲等價性, 邏輯比較以及其他, 如果給定的斷言通過, 測試會繼續執行到下一行的代碼, 如果斷言失敗, 對應的case測試會立即停止或者生成錯誤信息( 一般打印錯誤信息即可) ,但是不要影響其他的case執行。

在這裏插入圖片描述

HTML報告生成

腳本執行完畢之後,還需要看到HTML報告,下面我們就通過HTMLTestRunner.py 來生成測試報告

if __name__=="__main__":
curpath=sys.path[0]
#取當前時間
now=time.strftime("%Y-%m-%d-%H %M %S",time.localtime(time.time()))
if not os.path.exists(curpath+'/resultreport'):
os.makedirs(curpath+'/resultreport')
filename=curpath+'/resultreport/'+now+'resultreport.html'
with open(filename,'wb') as fp:
#出html報告
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'測試報告',description=u'用例執行
情況',verbosity=2)
suite=createsuite()
runner.run(suite)

異常捕捉與錯誤截圖

用例不可能每一次運行都成功,肯定運行時候有不成功的時候。如果可以捕捉到錯誤,並且把錯誤截圖保存,這將是一個非常棒的功能,也會給我們錯誤定位帶來方便。

def savescreenshot(self,driver,file_name):
if not os.path.exists('./image'):
os.makedirs('./image')
now=time.strftime("%Y%m%d-%H%M%S",time.localtime(time.time()))
#截圖保存
driver.get_screenshot_as_file('./image/'+now+'-'+file_name)
time.sleep(1)

數據驅動

之前我們的case都是數據和代碼在一起編寫。考慮如下場景:
需要多次執行一個案例,比如baidu搜索,分別輸入中文、英文、數字等進行搜索,這時候需要編寫3個案例嗎?有沒有版本一次運行?
python 的unittest 沒有自帶數據驅動功能。所以如果使用unittest,同時又想使用數據驅動,那麼就可以使用DDT來完成。

@ddt
class Baidu1(unittest.TestCase):
    def setUp(self):
     self.driver=webdriver.Chrome()
     self.url="http://www.baidu.com/"
     self.driver.implicitly_wait(5)
     # self.verificationErrors = []
     # self.accept_next_alert = True
    def tearDown(self):
        self.driver.quit()
        # self.assertEqual([], self.verificationErrors)
    # @unittest.skip("skipping")
    @data("Lisa","張一凡","蔣欣")
    def test_baidu1(self,value):
        self.driver.get(self.url)
        self.driver.find_element_by_id("kw").clear()
        self.driver.find_element_by_id("kw") .send_keys(value)
        self.driver.find_element_by_id("su") .click()
        time.sleep(5)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章