標籤:多個用例執行 unit 第一步 資料 path 檔案 html open _id
一. 一個.py檔案批量執行測試案例(一個.py檔案下多個用例執行)
如果直接使用:unittest.main(),則按字母順序執行,
對於前後之間又依賴關係的用例,需要按特定的順序執行,則使用 suite.addTest(類名("方法名")),如這裡按照新增,修改,刪除的順序,可以避免執行完畢後的測試資料處理。
def test_modifyCategory(self): ...
def test_addCategory(self): ...
def test_delCategory(self): ...
if __name__=="__main__":#unittest.main() suite=unittest.TestSuite() suite.addTest(test_category("test_addCategory"))
suite.addTest(test_category("test_modifyCategory"))
suite.addTest(test_category("test_delCategory"))
二.單個.py檔案如何產生html測試報告
(下載 HTMLTestRunner.py檔案,放到 python安裝包的 lib 目錄下,開啟IDLE ,輸入 " import HTMLTestRunner "若不報錯,則說明匯入成功)
1.在測試報告名中顯示時間:(引入time包) now=time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))
time.time():擷取目前時間戳
time.ctime():擷取目前時間的字串
time.localtime():目前時間的struct_time形式
time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime()):擷取特定格式的時間,通常用這個
2.TestSuite是個容器,往裡面用addTest()添加測試案例
3.fielname定義報告儲存的路徑以及檔案名稱
file是file類的建構函式,file(name[, mode[, buffering]])
file()函數用於建立一個file對象,它有一個別名叫open(),它們是內建函數。來看看它的參數。它參數都是以字串的形式傳遞的。
name是檔案的名字。mode是開啟的模式,可選的值為r w a U,分別代表讀(預設) 寫 添加支援各種分行符號的模式。
用w或a模式開啟檔案的話,如果檔案不存在,那麼就自動建立。
此外,用w模式開啟一個已經存在的檔案時,原有檔案的內容會被清空因為一開始檔案的操作的標記是在檔案的開頭的,這時候進行寫操作,無疑會把原有的內容給抹掉。
在模式字元的後面,還可以加上+ b t這兩種標識,分別表示可以對檔案同時進行讀寫操作和用二進位模式、文字模式(預設)開啟檔案。
這裡常用的為 file(filename,‘wb‘):以二進位形式開啟檔案 filename
4.runner定義測試報告格式,stream定義報告寫入的二進位檔案,title為報告的標題,description為報告的說明,runner.run()用來運行測試case,注意最後用fp.close()將檔案關閉!!
5.添加測試案例的中文注釋: 在每個測試方法後面添加: u""" 測試案例中文說明 """ 即可!!!!!!
if __name__=="__main__":#unittest.main() suite=unittest.TestSuite()
suite.addTest(test_category("test_addCategory"))
suite.addTest(test_category("test_modifyCategory"))
suite.addTest(test_category("test_delCategory"))
now=time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))
filename=‘C:\\Users\\DELL\\Desktop\\2.a .py a report\\‘+now+"category.html"
fp=file(filename,"wb")
runner=HTMLTestRunner.HTMLTestRunner( stream=fp, title=u"產品分類測試", description=u"用例執行情況")
runner.run(suite)
fp.close()
測試報告如下:
三.多個.py檔案如何執行,如何產生一個測試報告,結構最佳化
測試報告最佳化思路:(1)所有的測試案例(包括共通是登入)放到用例檔案夾下(2)執行用例的py檔案單獨列出 (3) 所有產生的報告放到Report檔案夾下
檔案結構如下:建立一個__init__.py檔案(注意是雙底線,裡面匯入所有的用例),和所有的測試案例一起放到 test_case檔案夾下
建立一個 test_all.py執行檔案,代碼如下:
#coding=utf-8import syssys.path.append("\test_case")from test_case import *import unittestimport HTMLTestRunnerimport time#注意使用套件時,在單個py檔案中下的多個用例用 (類名("方法名")),#匯入多個py的類下,用(py名.類名)suite=unittest.TestSuite()suite.addTest(unittest.makeSuite(category.test_category))suite.addTest(unittest.makeSuite(product.test_product))now=time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))filename=‘C:\\Users\\DELL\\Desktop\\Report\\‘+now+"test_all.html"fp=file(filename,‘wb‘)runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u‘產品管理和分類管理的自動化測試報告‘,description=u‘測試案例結果‘)runner.run(suite)fp.close()
1.如果不建立__init__.py檔案,用例執行的py檔案將找不到引入的包,這裡我們來普及一下包的匯入處理程序中執行了什麼操作:
(1)建立一個新的,空的module(類)對象
(2)將該對象加入到sys(系統)的module(類)中
(3)裝載加入的module,此時會現在目前的目錄下尋找,後在python的path中尋找,而建立引用__init__.py 是為了標識它所在的檔案夾(目錄)是可引用的module!!!!!
2.把模組的路徑通過sys.path.append(路徑)添加到程式中,這裡使用的是相對路徑: \用例所在檔案夾
3.當重新添加一個py檔案一起執行時,需要兩個地方改動:
(1)首先需要在 __init__.py檔案下引入該py
(2)在用例執行的檔案(test_all.py)下使用: suite.addTest(unittest.makeSuite(py名.類名)) 將此檔案下的用例添加上去並執行!!!!!
第一步簡化:使用數組進行loop
all=[category.test_category,product.test_product]suite=unittest.TestSuite()for a in all: suite.addTest(a)
第二步簡化:將上述操作專門寫到一個py檔案中,直接調用
第三步簡化:實現自動尋找用例檔案夾下的py檔案,自動添加到addTest中,(只需在__init__.py中匯入包即可),不用每次都兩個地方進行設定!!!!!!!
實現思路如下:
使用TestLoader:測試案例載入器,可以載入多個測試案例,返回一個測試套件
discover=unittest.defaultTestLoader.discover(allcase,pattern=‘start_*.py‘,top_level_dir=None) 找到指定目錄下的指定的測試模組,如果不在頂級目錄下,需要指定。
實現代碼如下:
#coding=utf-8import sysimport unittestimport HTMLTestRunnerimport time,os#注意使用套件時,在單個py檔案中下的多個用例用 (類名("方法名")),#匯入多個py的類下,用(py名.類名)allcase=‘C:\\Users\\DELL\\Desktop\\test_casea‘ #指明要自動尋找的py檔案所在檔案夾路徑def createSuite(): #產生測試套件 testunit=unittest.TestSuite() #使用discover找出用例檔案夾下test_casea的所有用例 discover=unittest.defaultTestLoader.discover(allcase, #尋找的檔案夾路徑
pattern=‘start_*.py‘, #要測試的模組名,以start開頭的.py檔案 top_level_dir=None) #測試模組的頂層目錄,即測試案例不是放在多級目錄下,設定為none
for suite in discover: #使用for迴圈出suite,再迴圈出case for case in suite: testunit.addTests(case) print testunit return testunitallcasenames=createSuite()now=time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime(time.time()))filename=‘C:\\Users\\DELL\\Desktop\\Report\\‘+now+"test_all.html"fp=file(filename,‘wb‘)runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u‘產品管理和分類管理的自動化測試報告‘,description=u‘測試案例結果‘)runner.run(allcasenames) #執行casefp.close()
可以看到運行結果如下:
四.問題匯總
截止到現在,涉及測試報告的所有內容介紹完畢,下面介紹一下上述過程中遇到的問題:
1.element not visible :頁面上有兩個結構類似的元素
解決方案:使用全路徑的xpath(或者是往前定位,直到能區分出元素1和元素2)
2.搜尋結果的數量為空白,一定要在點擊搜尋按鈕前後都設定等待,設定等待很重要!!!!!
3.新增產品時有多個下拉框選擇,導致上一個選擇後使下一個被覆蓋,無法點擊,
解決方案: 剛開始使用ul/li的定位方式時由於點兩次,第一項點擊後的覆蓋到第二項導致第二項不可見,所以此方法導致部分項下拉選中失敗為空白!!
所以對於select的最好使用 Select(driver.find_element_by_id("gender")).select_by_value("2") ,注意匯入包
from selenium.webdriver.support.ui import Select
下面說一下兩種下拉框:下拉框分為兩種
(1)select下時option的
from selenium.webdriver.support.ui import Select
...
# 通過index進行選擇
Select(driver.find_element_by_id("gender")).select_by_index(1)
# 通過value進行選擇
Select(driver.find_element_by_id("gender")).select_by_value("2")
# 通過選項文字進行選擇
Select(driver.find_element_by_id("gender")).select_by_visible_text("Male")
註:Select only works on <select> elements(Select只對<select>標籤的下拉式功能表有效).
(2)ul下的li
定位非<select>標籤的下拉式功能表中的選項,需要兩個步驟,先定位到下拉式功能表,再對其中的選項進行定位。
定位代碼(選擇碩士):
# 先定位到下拉式功能表
drop_down = driver.find_element_by_css_selector("div#select2_container > ul")
# 再對下拉式功能表中的選項進行選擇
drop_down.find_element_by_id("li2_input_2").click()
註:也可以用此方法定位<select>標籤的下拉式功能表。
4.產生報告為空白(python在安裝時,預設的編碼是ascii,當程式中出現非ascii編碼時,python的處理常常會報這樣的錯)
UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe5 in position 97: ordinal not in range(128)
在python的Lib\site-packages檔案夾下建立一個sitecustomize.py,內容為:
Python代碼
# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding(‘utf8‘)
此時重啟python解譯器,執行sys.getdefaultencoding(),發現編碼已經被設定為utf8的了,多次重啟之後,效果相同,這是因為系統在python啟動的時候,自行調用該檔案,設定系統的預設編碼,而不需要每次都手動的加上解決代碼,屬於一勞永逸的解決方案。
截止到現在,總結一下自動化測試的思路與檔案架構:
1.設計測試case: (按照正向思維,每個用例必須形成一個完整的流程,包括瀏覽器執行case,然後關閉)
分類管理為一個.py檔案:裡麵包含4個用例(搜尋,新增,修改,刪除),按此執行順序可以減少對測試資料的後續處理(如新增的需要進行刪除),產品管理以此類推,此時有兩個py檔案。
.py檔案的最佳化:
(1)登入模組化,直接在setUp方法中引用即可
(2)所有的共用模組都放到setUp方法中,直到登入到要測試的頁面
2.一共需要三個檔案夾:
測試案例檔案夾:放所有的.py文,且有用例的py檔案以start開頭,並新增一個__init__.py檔案
報告執行檔案夾:使用discover對用例進行loop,測試報告設定
測試報告:專門放每天執行的檔案測試報告
python執行個體編寫---測試報告與測試套件(多個py檔案,1個py檔案內多個用例)