qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          解決多通道測試的挑戰(zhàn)

           簡介:隨著移動(dòng)以及有 Web 功能的應(yīng)用程序的飛速傳播,多通道測試出現(xiàn)了新的挑戰(zhàn),或是單個(gè)測試場景跨幾個(gè)界面交叉。業(yè)務(wù)流程以及這些流程內(nèi)的任務(wù)在更為多樣的平臺上執(zhí)行,這就要求能夠在界面間無縫移動(dòng),尤其是從移動(dòng)到 Web 以及反向移動(dòng)。過去曾經(jīng)有效的那些舉措導(dǎo)致了應(yīng)對未來的討論。

            多通道 描述的是具有多個(gè)界面的應(yīng)用程序。隨著我們從桌面發(fā)展到基于 Web 的計(jì)算甚至是移動(dòng)計(jì)算,多通道越來越常見。由于設(shè)備(平板、手機(jī)、 筆記本電腦、臺式計(jì)算機(jī))以及與設(shè)備交互方式(特定于設(shè)備的 “應(yīng)用程序”、瀏覽器和傳統(tǒng)的客戶端應(yīng)用程序)的組合,同一個(gè)應(yīng)用程序的界面越來越多。比如,使用相同業(yè)務(wù)邏輯的面向 Web 應(yīng)用程序、移動(dòng)應(yīng)用程序甚至是一個(gè) CLI(命令行界面)的銀行應(yīng)用程序。由于面向服務(wù)的架構(gòu) (SOA) 和 Web 服務(wù)日益流行,在很多情況下,集成者要做的工作就是把服務(wù)與新的前端重新組合。但業(yè)務(wù)邏輯(亦稱服務(wù))則保持相同。

            以開發(fā)團(tuán)隊(duì)重用代碼來減少維護(hù)成本并提高生產(chǎn)效率相同的方式,要跟上開發(fā)團(tuán)隊(duì),測試團(tuán)隊(duì)就需要一些方法來重用測試場景并實(shí)現(xiàn)自動(dòng)化。

            應(yīng)對多通道測試的挑戰(zhàn)

            幾年前,我是一名自動(dòng)化測試架構(gòu)師,負(fù)責(zé)為具有多個(gè)界面的兩個(gè)(而不是一個(gè))應(yīng)用程序構(gòu)建所有的自動(dòng)化。二者都有遺留的 “本地” 用戶界面,使用的是 Microsoft Windows 32 位 MFC (Microsoft Foundation Class) 控件、一個(gè)使用了 JavaScript 的 Web 界面、ASP 和 JSP(Active Server Pages 和 JavaServer Pages)、一個(gè)新的(更新的)Eclipse SWT (Standard Widget Toolkit) 界面以及一個(gè)命令行界面。當(dāng)然,不可能找到對所有這些界面均有效的自動(dòng)化工具,但我們可以暫時(shí)將其放到一邊。

            編程時(shí),您往往會(huì)專注于通 過促進(jìn)重用減少需要維護(hù)的代碼量。有了面向?qū)ο蟮木幊毯椭貥?gòu),很少有理由需要在多個(gè)地方具有相同的代碼了。但是需要設(shè)計(jì)一個(gè)架構(gòu),這樣我就可以考慮如何從 一個(gè)單一的測試自動(dòng)化代碼庫解決多個(gè)界面的測試。首先,盡管它們是同一個(gè)應(yīng)用程序的所有界面,但并不是所有的界面都會(huì)浮現(xiàn)相同的功能,更不用說使用同樣的 方式了。但也有許多以客戶為中心的場景(用例),這對跨所有界面進(jìn)行測試很有意義。

            然而,負(fù)責(zé)設(shè)計(jì)測試用例和測試計(jì)劃的測試團(tuán)隊(duì)沒有以這種方式考慮他們的測試。事實(shí)上,他們是分離的,并根據(jù)他們所要處理的界面以豎井方式分離。構(gòu)建并測試了該 CLI 的團(tuán)隊(duì)認(rèn)為他們只需要少量的客戶場景測試。他們主要集中于單元測試, 并沒有真正考慮通過 CLI 的一個(gè)客戶流。負(fù)責(zé) Eclipse UI 的測試團(tuán)隊(duì)想要大量的 UI 特性和自動(dòng)化的功能。他們有一長串需要執(zhí)行的測試用例,要實(shí)現(xiàn)這個(gè)目標(biāo),需要完全專注于客戶流。但是,我們?yōu)槭裁淳筒荒苁褂糜芍黝}專家 (SME) 為應(yīng)用程序煞費(fèi)苦心完成的用來測試所有界面的這些信息呢?

            一種層次結(jié)構(gòu)方式

            使用 面向?qū)ο蟮木幊?(OOP) 的典型測試自動(dòng)化框架一般會(huì)抽象化控制集的實(shí)現(xiàn)細(xì)節(jié),而不是通過控件表達(dá)的概念性操作。這實(shí)際上是許多商業(yè) GUI 自動(dòng)化工具使用的方式。例如,所有文本字段會(huì)接受文本,用 setText(string) 方法定義一個(gè)文本字段類,并在此應(yīng)用程序的所有版本上使用它。但這并不適用于跨界面構(gòu)建自動(dòng)化測試的所有情況。當(dāng)一個(gè) GUI 使用單選按鈕而另一個(gè)使用復(fù)選框時(shí)會(huì)發(fā)生什么呢?您實(shí)際上不能對于相同操作依靠于同一界面。以下顯示了這種傳統(tǒng)的 OOP 方式。

          圖 1. GUI 控制層次結(jié)構(gòu)

             在我們的示例中,界面的差異很大,但所代表的操作和業(yè)務(wù)流程則實(shí)質(zhì)上相同。為了最大化重用,我們選定了一個(gè)業(yè)務(wù)邏輯層次結(jié)構(gòu)(參見圖 2)以跨多個(gè)界面重用測試場景。這不僅能最大化我們的代碼重用,還意味著將會(huì)依賴測試工具來管理 GUI 界面,而這正是他們的設(shè)計(jì)初衷。圖 2 顯示了此方式,您可能已經(jīng)識別出了這個(gè)抽象工廠模式。

          圖 2. 業(yè)務(wù)邏輯層次結(jié)構(gòu)

          通過采用業(yè)務(wù)邏輯的方式,通過應(yīng)用程序的每個(gè)流都可以表示成操作集,而操作又被定義為抽象類上的方法。雖然每個(gè)界面都可能在操作內(nèi)具有一些不同的步 驟,但它們都允許、理解和需要這些相同的操作。這就相當(dāng)于為了測試而構(gòu)建一個(gè)特定于應(yīng)用程序的測試框架來代表測試業(yè)務(wù)任務(wù)下的這個(gè)應(yīng)用程序。這種方法意味 著要定義一組對象,在應(yīng)用程序中執(zhí)行操作所需的數(shù)據(jù)和信息就可以封裝在對象之中。然后,我們需要在這些對象內(nèi)定義一組方法來描述操作,并收集操作專門需要 的任何額外的數(shù)據(jù),如圖 3 中的代碼片段所定義的。

          圖 3. 抽象類的代碼示例

            Query 是一個(gè)抽象類,收集創(chuàng)建和執(zhí)行查詢所需的有趣數(shù)據(jù),以及有趣操作,如運(yùn)行、創(chuàng)建、編輯和重命名。重命名方法需要新名稱的額外參數(shù),但當(dāng)它成功后,會(huì)自動(dòng)更 新此查詢對象的名稱值。在這個(gè)級別對用戶界面沒有假設(shè)。用戶界面的細(xì)節(jié)只在特定于界面的具體類內(nèi)表達(dá)。要在一個(gè)給定的界面上執(zhí)行,需要在運(yùn)行時(shí)為每個(gè)界面 實(shí)例化一個(gè)具體類并調(diào)用此操作,具體類似于如下所示:

          Query myQuery = (parent_location, findRecords);
          myQuery.rename(renamedQuery);

            基于應(yīng)用程序的框架

            定義用來描述測試所需操作的抽象業(yè)務(wù)邏輯類的一個(gè)后果是可以將所定義的方法重組成新的流。此外,還可以指定在運(yùn)行時(shí)運(yùn)行哪個(gè)界面。這是一個(gè)強(qiáng)大的組合,可以完成幾件事情:

            ● 針對此應(yīng)用程序的操作只定義一次

            ● GUI元素只被發(fā)現(xiàn)和處理一次

            ● 為一個(gè)界面設(shè)計(jì)的測試場景可以在另一個(gè)界面上運(yùn)行

            ● 因重用的增加,維護(hù)顯著減少

            當(dāng)然,這其中的訣竅是在每個(gè)要測試的界面內(nèi)如何對任何給定的操作進(jìn)行編碼。這需要面對大量的工作,但在一個(gè)界面完成后,有許多測試腳本可用于任何其他的界面。而這就是必須為每個(gè)后續(xù)界面要實(shí)現(xiàn)的全部步驟:

            ● 添加在該界面上執(zhí)行操作所需的實(shí)際步驟

            ● 補(bǔ)充此框架來涵蓋其他界面內(nèi)所沒有的任何功能

           該方法的另一個(gè)好處是:盡管仍然被表示為代碼,但它在一個(gè)足夠高的抽象級別可讀取為偽代碼,這對非編程人員 SME 很有意義。這讓非編程人員能夠創(chuàng)建新的自動(dòng)化腳本,以及運(yùn)行和理解自動(dòng)化團(tuán)隊(duì)所交付的測試腳本。

            清單 1 是與 Eclipse 視圖交互的一個(gè)示例代碼。

            清單 1. 與 Eclipse 視圖交互的代碼

          Perspective resource = new Perspective("Resource");
          Perspective general = new Perspective("General");
          app.start();
          EclipseView bookmarks = new EclipseView("Bookmarks", resource);
          EclipseView explorer = new EclipseView("Project Explorer",general);
          resource.open();
          resource.reset();
          bookmarks.open();
          explorer.open();
          bookmarks.switchTo();
          explorer.switchTo();
          bookmarks.maximize();
          bookmarks.restore();
          bookmarks.minimize();
          bookmarks.restore();
          bookmarks.close();
          resource.reset();
          app.exit();

            采用這種方法可以降低維護(hù)成本,并能確保對于 GUI 的任何部分,在自動(dòng)化測試代碼內(nèi)都只需在一個(gè)地方進(jìn)行調(diào)整。但這種方法的好處只有在 CLI 上實(shí)現(xiàn)了進(jìn)行業(yè)務(wù)邏輯的具體步驟之后才會(huì)變得真正清晰。

            負(fù)責(zé)測試該特性的團(tuán)隊(duì)已宣布 “完成”,且沒有明顯的缺陷。自動(dòng)化的實(shí)現(xiàn)是為了為未來版本確保一個(gè)回歸測試套件。但是當(dāng)我們運(yùn)行用來針對此 CLI 實(shí)現(xiàn)測試 GUI 的測試腳本時(shí),就會(huì)發(fā)現(xiàn) 50 多個(gè)缺陷!這些都是重要的缺陷,肯定會(huì)被我們的客戶發(fā)現(xiàn)。

            作為測試人員,我們總是很興奮能首先發(fā)現(xiàn)缺陷,因?yàn)樵缙诎l(fā)現(xiàn)問題能明顯節(jié)約成本。另外,構(gòu)建不只能驗(yàn)證產(chǎn)品穩(wěn)定性的測試自動(dòng)化也很令人興奮。同樣重要的就是信譽(yù)、既有的顧客滿意度,以及此測試自動(dòng)化所帶來的整體質(zhì)量改進(jìn)方面的商業(yè)利益。

            如今的多通道測試

            在上述的項(xiàng)目過程中,我們可以在運(yùn)行時(shí)只選擇一個(gè)界面。一個(gè)測試腳本必須是完全自動(dòng)化的,且必須要有為每個(gè)需要測試的界面實(shí)現(xiàn)的一個(gè)完整的業(yè)務(wù) 邏輯操作集。這種方式在當(dāng)時(shí)是合理的也是可以接受的,這是因?yàn)樽罱K用戶一般不會(huì)在一組操作期間從一個(gè)桌面客戶端切換到一個(gè) Web 客戶端。

            但時(shí)過境遷。現(xiàn)在考慮一個(gè)可能開始于 Web 客戶端、穿過一個(gè)移動(dòng)應(yīng)用程序、然后再回到 Web 的測試場景,甚或是一個(gè)針對數(shù)據(jù)庫后端的獨(dú)立驗(yàn)證已不再符合實(shí)際了。

            考慮這樣一個(gè)場景:有人在 eBay 競價(jià)。使用一個(gè)臺式計(jì)算機(jī)和瀏覽器(Web 客戶端)對商品進(jìn)行搜索和研究更容易。一旦決定了想要的商品,就可以進(jìn)行競價(jià)。您可以離開計(jì)算機(jī),并在您的智能手機(jī)收到一個(gè)通知,告知您競價(jià)勝出,于是您 從手機(jī)上更新出價(jià)。當(dāng)贏得競價(jià)時(shí),您再回到計(jì)算機(jī)前,在瀏覽器中輸入付款信息。

            這是一個(gè)測試場景,與其從屏幕上此界面的一個(gè)部分(使用屏幕抓取或?qū)ο髮傩裕┲序?yàn)證交易的成功,還不如直接使用數(shù)據(jù)庫并檢查記錄。這種獨(dú)立于界 面的驗(yàn)證更健壯,也更穩(wěn)定。我們可以把這種方式稱為 “混合” 測試場景。并且,從理論上來說,當(dāng)自動(dòng)化一些產(chǎn)品區(qū)域太難(或過于昂貴)時(shí),混合場景應(yīng)該允許混合進(jìn)手動(dòng)測試執(zhí)行來提高測試覆蓋率。

            所以,我已經(jīng)開始幻想如何能實(shí)現(xiàn)這樣一個(gè)流,于是我將不同的界面和操作實(shí)現(xiàn)拼裝成一個(gè)能在界面之間無縫移動(dòng)的復(fù)雜流。可以肯定的是,的確存在挑 戰(zhàn),并且挑戰(zhàn)可能會(huì)不可逾越。而了解了當(dāng)運(yùn)行時(shí)環(huán)境受制約時(shí)哪些數(shù)據(jù)在操作間移動(dòng)則會(huì)相對簡單得多。而當(dāng)跨越界面時(shí),哪些數(shù)據(jù)可能需要在操作間傳輸則不能 立即清晰。使用上面的示例,將需要先登錄到一個(gè) Web 客戶端和移動(dòng)電話。身份驗(yàn)證明顯是個(gè)問題,但實(shí)現(xiàn)這些混合測試場景注定會(huì)有很多并發(fā)問題。

          posted on 2013-06-03 13:31 順其自然EVO 閱讀(502) 評論(0)  編輯  收藏 所屬分類: 測試學(xué)習(xí)專欄 、管理方向

          <2013年6月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 昆明市| 江门市| 舟山市| 澄城县| 桃园县| 甘肃省| 青州市| 哈巴河县| 富宁县| 武威市| 东安县| 资兴市| 宜兰县| 德令哈市| 芜湖市| 四子王旗| 无棣县| 龙门县| 加查县| 东兰县| 明溪县| 克山县| 清水县| 平潭县| 敦煌市| 北碚区| 仪征市| 华亭县| 依安县| 威远县| 建瓯市| 甘孜县| 霍邱县| 华池县| 和林格尔县| 儋州市| 江川县| 雅江县| 赤水市| 永仁县| 罗定市|