標籤:cal disco 添加 tca name 隱私 選擇 項目 epo
7.1 自己主動化測試用例
無論是功能測試、效能測試和自己主動化測試時都須要編寫測試用例,測試用例的好壞能準確的體現了測試人員的經驗、能力以及對項目的深度理解。
7.1.1 手工測試用例與自己主動化測試用例
手工測試用例是針對手工測試人員。自己主動化測試用例是針對自己主動化測試架構。前者是手工測試用例人員應用手工方式進行用例解析,後者是應用指令碼技術進行用例解析。
前者具有較好的異常處理能力,並且可以基於測試用例,製造各種不同的邏輯推斷,並且人工測試步步跟蹤,可以仔細定位問題。後者全然依照測試用例的步驟進行測試,僅僅能在已知的步驟和情境中發現問題。並且往往由於網路問題或者功能的微小的變化導致用例運行異常,自己主動化的運行也非常能發現新的bug。
手工測試用例和自己主動化測試用對照:
手工測試用例:
l 較好的異常處理能力,能通過人為的邏輯推斷校正當前步驟的功能實現正確與否。
l 人工運行用例具有一定的步驟跳躍性。
l 人工測試步步跟蹤,可以仔細的定位問題。
l 主要用來發現功能缺陷
自己主動化測試用例:
l 運行對象是指令碼,不論什麼一個推斷都須要編碼定義。
l 用例步驟之間關聯性強。
l 主要用來保證產品主體功能正確完整和讓測試人員從繁瑣反覆的工作中解脫出來。
l 眼下自己主動化測試階段定位在冒煙測試和迴歸測試。
自己主動化測試用例選型注意事項:
1. 不是全部的手工用例都要轉為自己主動化測試用例。
2. 考慮到指令碼開發的成本,不要選擇流程太複雜的用例。
假設有必要。能夠考慮把流程拆分多個用例來實現指令碼。
3. 選擇的用例最好能夠構建成情境。比如一個功能模組。分n 個用例,這n 個用例使用同一個情境。這種優點在於方便構建keyword測試模型。
4. 選擇的用例能夠帶有目的性,比如這部分用例是用例做冒煙測試,那部分是迴歸測試等,當然,會存在重疊的關係。假設當前用例不能滿足需求,那麼唯有改動用例來適應指令碼和需求。
5. 選取的用例能夠是你覺得是反覆運行,非常繁瑣的部分,比如欄位驗證,提示資訊驗證這類。這部分適用迴歸測試。
6. 選取的用例能夠是主體流程,這部分適用冒煙測試。
7. 自己主動化測試也能夠用來做配置檢查,資料庫檢查。這些可能超越了手工用例,可是也算用例拓展的一部分。項目負責人能夠有選擇地添加。
8. 假設平時在手工測試時。須要構造一些複雜資料,或反覆一些簡單機械式動作,告訴自己主動化指令碼。讓他來幫你。也許你的效率因此又提高了。
7.1.2 測試類型
靜態內容測試是最簡單的測試,用於驗證靜態、不變化的UI 元素的存在性。比如:
?每一個頁面都有其預期的頁面標題?這能夠用來驗證鏈結接指向一個預期的頁面。
?應用程式的首頁包括一個應該在頁面頂部的圖片嗎?
?網站的每個頁面是否都包括一個頁尾地區來顯示公司的連絡方式,隱私政策,以及商標資訊?
?每一頁的標題文本都使用的<h1>標籤嗎?每一個頁面有正確的頭部文本內嗎?
您可能須要或也可能不須要對頁面內容進行自己主動化測試。假設您的網頁內容是不易受到影響手工對內容進行測試就足夠了。假設,比如您的應用檔案的位置被移動,內容測試就很有價值。
測試連結:Web 網站的一個常見錯誤為的失效的連結或連結指向無效頁。連結測試涉及點各個連結和驗證預期的頁面是否存在。假設靜態連結不常常更改,手動測試就足夠。可是,假設你的網頁設計師常常改變連結,或者檔案不時被重新導向,連結測試應該實現自己主動化。
功能測試一般是須要自己主動化測試的最複雜的測試類型,但也一般是最重要的。典型的測試是登入,注冊網站賬戶,使用者帳戶操作,帳戶設定變化,複雜的資料檢索操作等等。功能測試通常相應著您的應用程式的描寫敘述應用特性或設計的使用情境。
測試動態元素:通常一個網頁元素都有一個唯一的標識符,用於唯一地定位該網頁中的元素。
通常情況下,唯一識別碼用HTML 標籤的’id’屬性或’name’屬性來實現。這些標識符能夠是一個靜態,即不變的、字串常量。
Ajax 的測試:Ajax 是一種支援動態改變使用者介面元素的技術。頁面元素能夠動態更改,但不須要瀏覽器又一次載入頁面,如動畫,RSS源,其它即時資料更新等等。Ajax 有不計其數的更新網頁上的元素的方法。可是瞭解AJAX的最簡單的方式,能夠這樣想,在Ajax 驅動的應用程式中,資料能夠從應用server檢索,然後顯示在頁面上,而不需又一次載入整個頁面。
僅僅有一小部分的頁面,或者僅僅有元素本身被又一次載入。
在編寫用例過程中應該遵守下面幾點原則:
1、一個指令碼是一個完整的情境。從使用者登陸操作到使用者退出系統關閉瀏覽器。
2、一個指令碼指令碼僅僅驗證一個功能點。不要試圖使用者登陸系統後把全部的功能都進行驗證再退出系統
3、盡量僅僅做功能中正向邏輯的驗證。不要考慮太多逆向邏輯的驗證,逆向邏輯的情況非常多(比如手號輸錯有非常多種情況),驗證一方面比較複雜。須要編寫大量的指令碼,還有一方面自己主動化指令碼本身比較脆弱。非常多非正常的邏輯的驗證能力不強。
(我們盡量遵循使用者正常使用原則編寫指令碼就可以)
4、指令碼之間不要產生關聯性,也就是說編寫的每個指令碼都是獨立的,不能依賴或影響其它指令碼。
5、假設對資料進行了改動,須要對資料進行還原。
6、在整個指令碼中僅僅對驗證點進行驗證。不要對整個指令碼每一步都做驗證。
8.1 使用HTMLTestRunner產生測試報告
HTMLTestRunner 是Python 標準庫的unittest 單元測試架構的一個擴充。它產生便於使用的HTML 測試報告。HTMLTestRunner 是在BSD 許可證下公布。
首先要下HTMLTestRunner.py 檔案,:
http://tungwaiyip.info/software/HTMLTestRunner.html
HTMLTestRunner.py 本是一個.py 檔案,將它放到Python 安裝資料夾下就可以調用。
Windows :將下載的檔案放入...\Python27\Lib檔案夾下。
在Python 互動模式引入HTMLTestRunner 包,假設沒有報錯,則說明加入成功。
>>> importHTMLTestRunner
8.1.1 產生HTMLTestRunner測試報告
testBaidu.py
#coding=utf-8fromselenium import webdriverimportunittest,timeimportHTMLTestRunnerclassMyTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.implicitly_wait(10) self.base_url ="http://www.baidu.com" def test_baidu(self): driver = self.driver driver.get(self.base_url +"/") driver.find_element_by_id("kw").clear() driver.find_element_by_id("kw").send_keys("HTMLTestRunner") driver.find_element_by_id("su").click() def tearDown(self): self.driver.quit()if__name__=="__main__": testSuite=unittest.TestSuite() testSuite.addTest(MyTest("test_baidu")) Html=".\\result.htm" fp=file(Html,'wb') runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'百度搜尋測試報告',description=u'用例運行情況:') runner.run(testSuite) fp.close()
首先將HTMLTestRunner 模組imoport 進來。定義測試報告的存放路徑fiename,通過file()將檔案以讀寫的方式開啟。
接著調用HTMLTestRunner 模組下的HTMLTestRunner 方法。
stream 指定測試報告檔案。title 用於定義測試報告的標題。description 用於定義測試報告的副標題。
如今通過HTMLTestRunner 的run()方法來執行測試套件中所組裝的測試用例。
最後fp.close()來關閉測試報告檔案。
通過Python 提供的help()來查看類和方法的說明。
>>> import HTMLTestRunner
>>>help(HTMLTestRunner)
每次執行測試之前之前都要手動的去改動報告的名稱,假設忘記改動就會把之前的報告覆蓋。這樣做顯然會麻煩。那麼有沒有辦法使每次產生的報告名稱都不一樣而且更有意義,我們能夠在報告名稱中增加目前時間,這樣報告不會重疊而且更清晰的知道產生的前後時間.
time.time() 擷取目前時間戳。
time.ctime() 目前時間的字串形式。
time.localtime() 目前時間的struct_time形式。
time.strftime() 用來獲得目前時間,能夠將時間格式化為字串。
Python 中時間日期格式化符號:
%a 星期幾的簡寫
%A 星期幾的全稱
%w 十進位表示的星期幾(值從0到6,星期天為0)
%d 十進位表示的每月的第幾天
%b 月份的簡寫
%B 月份的全稱
%m 十進位表示的月份
%y 不帶世紀的十進位年份(值從0到99)
%Y 帶世紀部分的十制年份
%H 24 小時制的小時
%I 12 小時制的小時
%p 本地的AM或PM 的等價顯示
%M 十時製表示的分鐘數
%S 十進位的秒數
%f 十進位的微秒,零填充左邊
%Z 當前時區的名稱
%j 十進位表示的每年的第幾天
%U 一年中的星期數(00-53)星期天為星期的開始
%W 一年中的星期數(00-53)星期一為星期的開始
%x 本地對應的日期表示
%X 本地對應的時間表示
%% %號本身
擷取目前時間:now = time.strftime("%Y-%m-%d %H_%M_%S")
眼下測試報告僅僅整合到了單個測試檔案裡,我們的終於目的是將其整合表all_test.py 檔案裡。以下開啟all_test.py 檔案,做例如以下改動:UnitTest\Project\all_test.py
#coding=utf-8import unittestimport HTMLTestRunnerimport time def creatSuite(): testunit=unittest.TestSuite() test_dir="C:\\Users\\ewang\\Desktop\\Python_Selenium2\\UnitTest\\Project\\test_case" discover=unittest.defaultTestLoader.discover(test_dir,pattern="test*.py",top_level_dir=None) for test_suit in discover: for test_case in test_suit: testunit.addTest(test_case) return testunit now = time.strftime("%Y-%m-%d%H_%M_%S")filename ='.\\report\\'+now+'result.html'fp = file(filename, 'wb')runner=HTMLTestRunner.HTMLTestRunner( stream=fp, title=u'百度搜尋測試報告', description=u'用例運行情況:') if __name__=="__main__": alltest=creatSuite() runner.run(alltest)
8.2 建立定時任務為了讓自己主動化測試“自己主動化”起來。如今我們來建立定時任務,使自己主動化測試指令碼在指定的時間自己主動化執行。
建立定時任務的方法有非常多,比方,我們能夠寫一段程式讓其在指定的時間執行all_test.py 檔案。或者使用系統的定時任務功能在指定的時間執行all_test.py檔案。
Selenium2 Python 自己主動化測試實戰學習筆記(五)