參考內容:蟲師:《selenium2自動化測試實戰——基於python語言》
PS:書中的代碼,只能做參考,最好還是自己碼一碼,不一定照搬就全是對的,實踐出真知啊,踩了很多坑的說。。。
隨着軟件不斷迭代功能越來越多,對應的測試用例也會呈指數增長。一個實現幾十個功能的項目,對應的用例可能有上百個甚至更多,如果全部集成在一個文件中,那么這個文件就很臃腫且維護麻煩。
一個很好的方法就是將這些用例按照功能類型進行拆分,分散到不同測試文件中,即一個項目,對應多個分支。
一、分拆后的實現代碼
1、testbaidu.py
1 from selenium import webdriver 2 import unittest 3 import time 4 5 class MyTest(unittest.TestCase): 6 def setUp(self): 7 self.driver = webdriver.Chrome("F:\安裝工具\python\chromedriver.exe") 8 self.driver.maximize_window() 9 self.driver.implicitly.wait(10) 10 self.base_url = "http://www.baidu.com" 11 12 def test_baidu(self): 13 driver = self.driver 14 driver.get(self.base_url + "/") 15 driver.find_element_by_id("kw").clear() 16 driver.find_element_by_id("kw").send_key("unittest") 17 driver.find_element_by_id("su").click() 18 time.sleep(2) 19 title = assertEqual(title,"unittest_百度搜索") 20 21 def tearDown(self): 22 self.driver.quit()
2、testyoudao.py
1 from selenium import webdriver 2 import unittest 3 import time 4 5 class Mytest(unittest.TestCase): 6 7 def setUp(self): 8 self.driver = webdriver.Chrome("F:\安裝工具\python\chromedriver.exe") 9 self.driver.maximize_window() 10 self.driver.implicitly_wait(10) 11 self.base_url = "http://www.youdao.com" 12 13 def test_youdao(self): 14 driver = self.driver 15 driver.get(self.base_url + "/") 16 driver.find_element_by_id("query").clear() 17 driver.find_element_by_id("query").send.keys("webdriver") 18 driver.find_element_by_id("qb").click() 19 time.sleep(2) 20 title = driver.title 21 self.assertEqual(title, "webdriver - 有道搜索") 22 23 def tearDown(self): 24 self.driver.close()
二、創建用於執行所有用例的ALL_HTMLtest.py文件
1、ALL_HTMLtest.py
1 # coding=utf-8 2 import unittest 3 import time 4 from HTMLTestRunner import HTMLTestRunner 5 6 # 加載用例testbaidu,testyoudao 7 import testbaidu 8 import testyoudao 9 10 # 將測試用例添加到測試集中 11 suite = unittest.TestSuite() 12 13 suite.addTest(testbaidu.MyTest("test_baidu")) 14 suite.addTest(testyoudao.Mytest("test_youdao")) 15 16 if __name__ == '__main__': 17 # 執行測試 18 runner = unittest.TextTestRunner() 19 runner.run(suite)
拆分帶來的好處顯而易見,可以根據不同功能創建不同的測試文件,甚至不同的目錄,還可以將不同的小功能划分為不同的測試類,在類下編寫測試用例,整體結構更加清晰。
但依然存在缺陷(當用例達到成百上千條時,在ALL_HTMLtest.py中addTest()添加測試用例就變得很麻煩)。。。
2、TestLoader類
unittest單元測試框架提供了TestLoader類,該類負責根據各種標准加載測試用例,並將它們返回給測試套件。
unittest提供了可以共享的defaultTestLoader類,可以使用其子類和方法創建實例,discover()方法就是其中之一。
discover(start_dir, pattern='test*.py', top_level_dir=None)
找到指定目錄下的所有測試模塊,並遞歸查找子目錄下的測試模塊,只有匹配到文件名才能被加載,如果啟動的不是頂層目錄,則頂層目錄必須單獨指定。
start_dir:要測試的模塊名或測試用例目錄;
pattern='test*.py':表示用例文件名的匹配原則,下面的例子中匹配文件名為以“test”開頭的“.py”文件,星號“*”表示任意多個字符;
top_level_dir=None:測試模塊的頂層目錄,如果沒有頂層目錄,默認為None;
1 # coding=utf_8 2 import unittest 3 from unittest import defaultTestLoader 4 # 定義測試用例的目錄為當前目錄 5 test_dir = './' 6 discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py') 7 8 if __name__ == '__main__': 9 runner = unittest.TextTestRunner() 10 runner.run(discover)
三、集成測試報告
1 # coding=utf_8 2 import unittest 3 import time 4 from unittest import defaultTestLoader 5 from HTMLTestRunner import HTMLTestRunner 6 7 # 定義測試用例的目錄為當前目錄 8 test_dir = './report' 9 discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py') 10 11 if __name__ == '__main__': 12 now = time.strftime("%Y-%m-%d %H_%M_%S") 13 filename = test_dir + '/' + now + 'result.html' 14 fp = open(filename, 'wb') 15 runner = HTMLTestRunner(stream=fp,title='集成測試報告demo',description= '用例執行情況:') 16 runner.run(discover) 17 fp.close()
執行后,結果如下:
PS:請忽略報錯,這里主要是舉個例子,具體的實踐請以實際業務場景進行調整。。。