Selenium2 Python 自己主动化測试实战学习笔记(五)
? ??
7.1 自己主動(dòng)化測(cè)試用例
???????? 無論是功能測(cè)試、性能測(cè)試和自己主動(dòng)化測(cè)試時(shí)都須要編寫測(cè)試用例,測(cè)試用例的好壞能準(zhǔn)確的體現(xiàn)了測(cè)試人員的經(jīng)驗(yàn)、能力以及對(duì)項(xiàng)目的深度理解。
7.1.1 手工測(cè)試用例與自己主動(dòng)化測(cè)試用例
???????? 手工測(cè)試用例是針對(duì)手工測(cè)試人員。自己主動(dòng)化測(cè)試用例是針對(duì)自己主動(dòng)化測(cè)試框架。前者是手工測(cè)試用例人員應(yīng)用手工方式進(jìn)行用例解析,后者是應(yīng)用腳本技術(shù)進(jìn)行用例解析。
???????? 前者具有較好的異常處理能力,并且可以基于測(cè)試用例,制造各種不同的邏輯推斷,并且人工測(cè)試步步跟蹤,可以仔細(xì)定位問題。后者全然依照測(cè)試用例的步驟進(jìn)行測(cè)試,僅僅能在已知的步驟和場(chǎng)景中發(fā)現(xiàn)問題。并且往往由于網(wǎng)絡(luò)問題或者功能的微小的變化導(dǎo)致用例運(yùn)行異常,自己主動(dòng)化的運(yùn)行也非常能發(fā)現(xiàn)新的bug。
???????? 手工測(cè)試用例和自己主動(dòng)化測(cè)試用對(duì)照:
???????? 手工測(cè)試用例:
l? 較好的異常處理能力,能通過人為的邏輯推斷校驗(yàn)當(dāng)前步驟的功能實(shí)現(xiàn)正確與否。
l? 人工運(yùn)行用例具有一定的步驟跳躍性。
l? 人工測(cè)試步步跟蹤,可以仔細(xì)的定位問題。
l? 主要用來發(fā)現(xiàn)功能缺陷
?
自己主動(dòng)化測(cè)試用例:
l? 運(yùn)行對(duì)象是腳本,不論什么一個(gè)推斷都須要編碼定義。
l? 用例步驟之間關(guān)聯(lián)性強(qiáng)。
l? 主要用來保證產(chǎn)品主體功能正確完整和讓測(cè)試人員從繁瑣反復(fù)的工作中解脫出來。
l? 眼下自己主動(dòng)化測(cè)試階段定位在冒煙測(cè)試和回歸測(cè)試。
?
自己主動(dòng)化測(cè)試用例選型注意事項(xiàng):
1.??不是全部的手工用例都要轉(zhuǎn)為自己主動(dòng)化測(cè)試用例。
2.?考慮到腳本開發(fā)的成本,不要選擇流程太復(fù)雜的用例。
假設(shè)有必要。能夠考慮把流程拆分多個(gè)用例來實(shí)現(xiàn)腳本。
3.??????選擇的用例最好能夠構(gòu)建成場(chǎng)景。比如一個(gè)功能模塊。分n 個(gè)用例,這n 個(gè)用例使用同一個(gè)場(chǎng)景。這種優(yōu)點(diǎn)在于方便構(gòu)建keyword測(cè)試模型。
4.??????選擇的用例能夠帶有目的性,比如這部分用例是用例做冒煙測(cè)試,那部分是回歸測(cè)試等,當(dāng)然,會(huì)存在重疊的關(guān)系。假設(shè)當(dāng)前用例不能滿足需求,那么唯有改動(dòng)用例來適應(yīng)腳本和需求。
5.??????選取的用例能夠是你覺得是反復(fù)運(yùn)行,非常繁瑣的部分,比如字段驗(yàn)證,提示信息驗(yàn)證這類。這部分適用回歸測(cè)試。
6.??????選取的用例能夠是主體流程,這部分適用冒煙測(cè)試。
7.?自己主動(dòng)化測(cè)試也能夠用來做配置檢查,數(shù)據(jù)庫(kù)檢查。這些可能超越了手工用例,可是也算用例拓展的一部分。項(xiàng)目負(fù)責(zé)人能夠有選擇地添加。
8.?假設(shè)平時(shí)在手工測(cè)試時(shí)。須要構(gòu)造一些復(fù)雜數(shù)據(jù),或反復(fù)一些簡(jiǎn)單機(jī)械式動(dòng)作,告訴自己主動(dòng)化腳本。讓他來幫你。也許你的效率因此又提高了。
7.1.2 測(cè)試類型
?靜態(tài)內(nèi)容測(cè)試是最簡(jiǎn)單的測(cè)試,用于驗(yàn)證靜態(tài)的、不變化的UI 元素的存在性。比如:
?每一個(gè)頁(yè)面都有其預(yù)期的頁(yè)面標(biāo)題?這能夠用來驗(yàn)證鏈接指向一個(gè)預(yù)期的頁(yè)面。
?應(yīng)用程序的主頁(yè)包括一個(gè)應(yīng)該在頁(yè)面頂部的圖片嗎?
?站點(diǎn)的每個(gè)頁(yè)面是否都包括一個(gè)頁(yè)腳區(qū)域來顯示公司的聯(lián)系方式,隱私政策,以及商標(biāo)信息?
?每一頁(yè)的標(biāo)題文本都使用的<h1>標(biāo)簽嗎?每一個(gè)頁(yè)面有正確的頭部文本內(nèi)嗎?
您可能須要或也可能不須要對(duì)頁(yè)面內(nèi)容進(jìn)行自己主動(dòng)化測(cè)試。假設(shè)您的網(wǎng)頁(yè)內(nèi)容是不易受到影響手工對(duì)內(nèi)容進(jìn)行測(cè)試就足夠了。假設(shè),比如您的應(yīng)用文件的位置被移動(dòng),內(nèi)容測(cè)試就很有價(jià)值。
?
測(cè)試鏈接:Web 網(wǎng)站的一個(gè)常見錯(cuò)誤為的失效的鏈接或鏈接指向無效頁(yè)。鏈接測(cè)試涉及點(diǎn)各個(gè)鏈接和驗(yàn)證預(yù)期的頁(yè)面是否存在。假設(shè)靜態(tài)鏈接不常常更改,手動(dòng)測(cè)試就足夠。可是,假設(shè)你的網(wǎng)頁(yè)設(shè)計(jì)師常常改變鏈接,或者文件不時(shí)被重定向,鏈接測(cè)試應(yīng)該實(shí)現(xiàn)自己主動(dòng)化。
?
功能測(cè)試一般是須要自己主動(dòng)化測(cè)試的最復(fù)雜的測(cè)試類型,但也一般是最重要的。典型的測(cè)試是登錄,注冊(cè)站點(diǎn)賬戶,用戶帳戶操作,帳戶設(shè)置變化,復(fù)雜的數(shù)據(jù)檢索操作等等。功能測(cè)試通常相應(yīng)著您的應(yīng)用程序的描寫敘述應(yīng)用特性或設(shè)計(jì)的使用場(chǎng)景。
?
測(cè)試動(dòng)態(tài)元素:通常一個(gè)網(wǎng)頁(yè)元素都有一個(gè)唯一的標(biāo)識(shí)符,用于唯一地定位該網(wǎng)頁(yè)中的元素。
通常情況下,唯一標(biāo)識(shí)符用HTML 標(biāo)記的’id’屬性或’name’屬性來實(shí)現(xiàn)。這些標(biāo)識(shí)符能夠是一個(gè)靜態(tài)的,即不變的、字符串常量。
?
Ajax 的測(cè)試:Ajax 是一種支持動(dòng)態(tài)改變用戶界面元素的技術(shù)。頁(yè)面元素能夠動(dòng)態(tài)更改,但不須要瀏覽器又一次載入頁(yè)面,如動(dòng)畫,RSS源,其它實(shí)時(shí)數(shù)據(jù)更新等等。Ajax 有不計(jì)其數(shù)的更新網(wǎng)頁(yè)上的元素的方法。可是了解AJAX的最簡(jiǎn)單的方式,能夠這樣想,在Ajax 驅(qū)動(dòng)的應(yīng)用程序中,數(shù)據(jù)能夠從應(yīng)用server檢索,然后顯示在頁(yè)面上,而不需又一次載入整個(gè)頁(yè)面。
僅僅有一小部分的頁(yè)面,或者僅僅有元素本身被又一次載入。
?
在編寫用例過程中應(yīng)該遵守下面幾點(diǎn)原則:
1、一個(gè)腳本是一個(gè)完整的場(chǎng)景。從用戶登陸操作到用戶退出系統(tǒng)關(guān)閉瀏覽器。
2、一個(gè)腳本腳本僅僅驗(yàn)證一個(gè)功能點(diǎn)。不要試圖用戶登陸系統(tǒng)后把全部的功能都進(jìn)行驗(yàn)證再退出系統(tǒng)
3、盡量?jī)H僅做功能中正向邏輯的驗(yàn)證。不要考慮太多逆向邏輯的驗(yàn)證,逆向邏輯的情況非常多(比如手號(hào)輸錯(cuò)有非常多種情況),驗(yàn)證一方面比較復(fù)雜。須要編寫大量的腳本,還有一方面自己主動(dòng)化腳本本身比較脆弱。非常多非正常的邏輯的驗(yàn)證能力不強(qiáng)。
(我們盡量遵循用戶正常使用原則編寫腳本就可以)
4、腳本之間不要產(chǎn)生關(guān)聯(lián)性,也就是說編寫的每個(gè)腳本都是獨(dú)立的,不能依賴或影響其它腳本。
5、假設(shè)對(duì)數(shù)據(jù)進(jìn)行了改動(dòng),須要對(duì)數(shù)據(jù)進(jìn)行還原。
6、在整個(gè)腳本中僅僅對(duì)驗(yàn)證點(diǎn)進(jìn)行驗(yàn)證。不要對(duì)整個(gè)腳本每一步都做驗(yàn)證。
?
?
8.1? 使用HTMLTestRunner生成測(cè)試報(bào)告
HTMLTestRunner 是Python 標(biāo)準(zhǔn)庫(kù)的unittest 單元測(cè)試框架的一個(gè)擴(kuò)展。它生成易于使用的HTML 測(cè)試報(bào)告。HTMLTestRunner 是在BSD 許可證下公布。
首先要下HTMLTestRunner.py 文件,下載地址:
http://tungwaiyip.info/software/HTMLTestRunner.html
HTMLTestRunner.py 本是一個(gè).py 文件,將它放到Python 安裝文件夾下就可以調(diào)用。
Windows :將下載的文件放入...\Python27\Lib文件夾下。
?
在Python 交互模式引入HTMLTestRunner 包,假設(shè)沒有報(bào)錯(cuò),則說明加入成功。
>>> importHTMLTestRunner
8.1.1??? 生成HTMLTestRunner測(cè)試報(bào)告
testBaidu.py
#coding=utf-8 fromselenium import webdriver importunittest,time importHTMLTestRunner classMyTest(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.driverdriver.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'百度搜索測(cè)試報(bào)告',description=u'用例運(yùn)行情況:')runner.run(testSuite)fp.close()???????? 首先將HTMLTestRunner 模塊imoport 進(jìn)來。定義測(cè)試報(bào)告的存放路徑fiename,通過file()將文件以讀寫的方式打開。
接著調(diào)用HTMLTestRunner 模塊下的HTMLTestRunner 方法。
stream 指定測(cè)試報(bào)告文件。title 用于定義測(cè)試報(bào)告的標(biāo)題。description 用于定義測(cè)試報(bào)告的副標(biāo)題。
如今通過HTMLTestRunner 的run()方法來執(zhí)行測(cè)試套件中所組裝的測(cè)試用例。
最后fp.close()來關(guān)閉測(cè)試報(bào)告文件。
?
通過Python 提供的help()來查看類和方法的說明。
??????? >>> import HTMLTestRunner
? ? ? ?>>>help(HTMLTestRunner)
?????? 每次執(zhí)行測(cè)試之前之前都要手動(dòng)的去改動(dòng)報(bào)告的名稱,假設(shè)忘記改動(dòng)就會(huì)把之前的報(bào)告覆蓋。這樣做顯然會(huì)麻煩。那么有沒有辦法使每次生成的報(bào)告名稱都不一樣而且更有意義,我們能夠在報(bào)告名稱中增加當(dāng)前時(shí)間,這樣報(bào)告不會(huì)重疊而且更清晰的知道生成的前后時(shí)間.
? ? ? ??time.time()?獲取當(dāng)前時(shí)間戳。
time.ctime()?當(dāng)前時(shí)間的字符串形式。
time.localtime()?當(dāng)前時(shí)間的struct_time形式。
time.strftime()?用來獲得當(dāng)前時(shí)間,能夠?qū)r(shí)間格式化為字符串。
Python?中時(shí)間日期格式化符號(hào):
%a ??????????????????星期幾的簡(jiǎn)寫
%A ??????????????????星期幾的全稱
%w ?????????????????十進(jìn)制表示的星期幾(值從0到6,星期天為0)
%d ??????????????????十進(jìn)制表示的每月的第幾天
%b ??????????????????月份的簡(jiǎn)寫
%B ??????????????????月份的全稱
%m ?????????????????十進(jìn)制表示的月份
%y ??????????????????不帶世紀(jì)的十進(jìn)制年份(值從0到99)
%Y ??????????????????帶世紀(jì)部分的十制年份
%H 24 ????????????小時(shí)制的小時(shí)
%I 12 ??????????????小時(shí)制的小時(shí)
%p ??????????????????本地的AM或PM?的等價(jià)顯示
%M ?????????????????十時(shí)制表示的分鐘數(shù)
%S ??????????????????十進(jìn)制的秒數(shù)
%f ???????????????????十進(jìn)制的微秒,零填充左邊
%Z ??????????????????當(dāng)前時(shí)區(qū)的名稱
%j ???????????????????十進(jìn)制表示的每年的第幾天
%U ?????????????????一年中的星期數(shù)(00-53)星期天為星期的開始
%W ?????????????????一年中的星期數(shù)(00-53)星期一為星期的開始
%x ??????????????????本地對(duì)應(yīng)的日期表示
%X ??????????????????本地對(duì)應(yīng)的時(shí)間表示
%% ???????????????? %號(hào)本身
獲取當(dāng)前時(shí)間:now = time.strftime("%Y-%m-%d %H_%M_%S")
? 眼下測(cè)試報(bào)告僅僅集成到了單個(gè)測(cè)試文件里,我們的終于目的是將其集成表all_test.py 文件里。以下打開all_test.py 文件,做例如以下改動(dòng):UnitTest\Project\all_test.py
#coding=utf-8 import unittest import HTMLTestRunner import timedef 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 testunitnow = time.strftime("%Y-%m-%d%H_%M_%S") filename ='.\\report\\'+now+'result.html' fp = file(filename, 'wb') runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'百度搜索測(cè)試報(bào)告',description=u'用例運(yùn)行情況:')if __name__=="__main__":alltest=creatSuite()runner.run(alltest)8.2 創(chuàng)建定時(shí)任務(wù)
為了讓自己主動(dòng)化測(cè)試“自己主動(dòng)化”起來。如今我們來創(chuàng)建定時(shí)任務(wù),使自己主動(dòng)化測(cè)試腳本在指定的時(shí)間自己主動(dòng)化執(zhí)行。創(chuàng)建定時(shí)任務(wù)的方法有非常多,比方,我們能夠?qū)懸欢纬绦蜃屍湓谥付ǖ臅r(shí)間執(zhí)行all_test.py 文件。或者使用系統(tǒng)的定時(shí)任務(wù)功能在指定的時(shí)間執(zhí)行all_test.py文件。
總結(jié)
以上是生活随笔為你收集整理的Selenium2 Python 自己主动化測试实战学习笔记(五)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 棕榈蜡有什么作用
- 下一篇: websocket python爬虫_p