一. 一個.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-8 import sys sys.path.append("\test_case") from test_case import * import unittest import HTMLTestRunner import 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-8 import sys import unittest import HTMLTestRunner import 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 testunit allcasenames=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) #執行case fp.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,測試報告設置
測試報告:專門放每天執行的文件測試報告
還有so many 問題------》》
1.即使是多個py文件放一起,也是按順序執行,如何實現並行測試,減少執行時間?
2.如何進行測試的持續集成,進行定時任務每天都執行一次?
2.如何將每天執行的報告發送到指定的郵箱中?
下一節將會具體介紹這些問題的處理!!