譯者 | 陳峻
審校 | 孫淑娟
眾所周知,無論是桌面應(yīng)用、Web應(yīng)用、還是移動應(yīng)用,在投放到市場之前,都需要經(jīng)過嚴格的測試。而由于功能性測試能夠檢驗應(yīng)用程序的各項操作與功能,是否符合既定的需求規(guī)范,因此它往往被認為是在整個測試生命周期中,最關(guān)鍵且成本最高的一項活動。對此,自動化的功能性測試則能夠在提升軟件質(zhì)量的同時,降低有效的成本。下面,我將和您一起探討如何基于Web應(yīng)用,設(shè)計出功能性測試用例,并使用典型的測試工具對其自動化。
功能性測試的流程與分類
在功能性測試中,測試人員會根據(jù)所有的功能需求規(guī)范,驗證被測軟件是否符合要求,是否能夠按照預(yù)期工作,及時發(fā)現(xiàn)它與規(guī)范之間的“差異”。簡單而言,這是一種黑盒技術(shù),測試人員并不知道軟件的內(nèi)部邏輯與細節(jié)(如圖1),只需讓測試用例遵從規(guī)范開展即可。通常,功能性測試的流程包括:
1.向被測系統(tǒng)提供測試性輸入
2.從被測系統(tǒng)獲取結(jié)果輸出
3.驗證實際輸出是否符合規(guī)范所預(yù)期的輸出
圖1-功能性黑盒測試
從測試類型上分,功能性測試包括如下幾種(如圖2):
- 單元
- 冒用
- 健全測試(Sanity)
- 集成
- 系統(tǒng)
- 回歸測試
- 其他更多
圖2-功能性測試類型
在此,我將重點介紹用于測試應(yīng)用功能的集成性系統(tǒng)測試。
自動化功能性測試
從測試伊始,我們就知道可以采取手動與自動兩種不同的執(zhí)行方式。其中,手動測試是指測試人員需要直接與應(yīng)用程序進行交互;而自動化測試是指測試人員使用諸如Maveryx之類的自動化工具,通過編程的方式、或基于腳本來自動實現(xiàn),以及在無代碼的自動化(例如,關(guān)鍵字驅(qū)動方法)環(huán)境中實現(xiàn)。
注意,此處的基于腳本的測試是指用Java、C#和Python等編程語言來編寫測試腳本。當(dāng)然,這對測試人員的編程水平要求較高。而無代碼測試則是構(gòu)建在諸如:從下拉菜單中選擇,或者通過拖放測試組件等方式之上。因此,它對于測試人員的編程水平要求不高。
一個測試用例
許多Web應(yīng)用都離不開用戶登錄這一基本功能。下面,我將在https://opensource-demo.orangehrmlive.com/上,擬定如下功能規(guī)范:
- 用戶可以根據(jù)登錄頁面上的提示,使用用戶名和密碼憑證(如圖3)登錄并訪問OrangeHRM演示系統(tǒng)。
圖3-OrangeHRM演示網(wǎng)站
- 當(dāng)用戶輸入有效的用戶名和密碼,并單擊登錄按鈕時,用戶可以看到應(yīng)用的儀表板界面(如圖4)。
圖4-儀表板網(wǎng)頁
- 當(dāng)用戶輸入無效的名稱和/或密碼,并單擊登錄按鈕時,系統(tǒng)會顯示一條錯誤消息:“無效憑據(jù)”(如圖5)。
圖5-無效憑據(jù)錯誤
- 如果用戶名或密碼為空,單擊登錄按鈕,系統(tǒng)將顯示錯誤消息:“用戶名不能為空”或“密碼不能為空”(如圖6)。
圖6-用戶名和密碼為空的錯誤
由上述規(guī)范可知,我們需要設(shè)計針對如下方面的功能性測試用例:
測試用例名稱 | 測試用例的描述 | 預(yù)期輸出 |
TC_001號 | 輸入有效的用戶名和有效的密碼,然后單擊登錄按鈕。 | 用戶登錄到應(yīng)用程序,并訪問位于??https://opensource-demo.orangehrmlive.com/index.php/dashboard?? 的儀表板頁面 |
TC_002號 | 輸入無效用戶名和有效的密碼,然后單擊登錄按鈕。 | 錯誤:“無效憑據(jù)?!?/p> 用戶仍在登錄頁面??https://opensource-demo.orangehrmlive.com/index.php/auth/validateCredentials?? |
TC_003號 | 輸入有效的用戶名和無效密碼,然后單擊登錄按鈕。 | 錯誤:“無效憑據(jù)。” 用戶仍在登錄頁面??https://opensource-demo.orangehrmlive.com/index.php/auth/validateCredentials?? |
TC_004號 | 輸入無效用戶名和無效密碼,然后單擊登錄按鈕。 | 錯誤:“無效憑據(jù)?!?/p> 用戶仍在登錄頁面??https://opensource-demo.orangehrmlive.com/index.php/auth/validateCredentials?? |
TC_005號 | 留下空白的用戶名和空白的密碼,然后單擊登錄按鈕。 | 錯誤:“用戶名不能為空?!?/p> |
TC_006號 | 留下空白的用戶名并輸入有效的密碼,然后單擊登錄按鈕。 | 錯誤:“用戶名不能為空?!?/p> 用戶仍在登錄頁面上??https://opensource-demo.orangehrmlive.com/?? |
TC_007號 | 輸入有效的用戶名并留下空白的密碼,然后單擊登錄按鈕。 | 錯誤:“密碼不能為空?!?/p> 用戶仍在登錄頁面https://opensource-demo.orangehrmlive.com/ |
讓我們采取如下步驟來測試第一個測試用例(TC_001):
測試步驟(/輸入) | 預(yù)期輸出 |
啟動瀏覽器 | |
導(dǎo)航到OrangeHRM演示網(wǎng)站:??https://opensource-demo.orangehrmlive.com/?? | OrangeHRM演示網(wǎng)站將通過URL-- ??https://opensource-demo.orangehrmlive.com/?? 被打開 |
輸入有效用戶名?“Admin” | 用戶名字段被填如“Admin” |
輸入有效密碼?“ admin123” | 密碼字段已填充 |
單擊登錄按鈕 | 儀表板頁面通過??https://opensource-demo.orangehrmlive.com/index.php/dashboard??被顯示 |
自動化功能性測試腳本
我將使用??Maveryx???和??Java??來自動化其功能性測試。其中,Maveryx是一種自動化的功能和回歸測試工具。它提供了功能、回歸、用戶界面、無代碼、以及數(shù)據(jù)驅(qū)動測試等自動化測試功能。它能夠支持包括基于Web、.Net、Java等一系列應(yīng)用。下面我將通過代碼的形式,逐步展示編寫TC_001測試用例的腳本:
1.啟動瀏覽器。
Java
//launch Chrome browser
Bootstrap.startApplication(chrome);
//new browser instance
GuiBrowser browser = new GuiBrowser();
2.通過URL--https://opensource-demo.orangehrmlive.com/導(dǎo)航到OrangeHRM演示網(wǎng)站。
Java
//OrangeHRM demo Website page URL
String pageURL = "https://opensource-demo.orangehrmlive.com/";
//navigate to the OrangeHRM demo Website
browser.navigateTo(pageURL);
//check the landing page URL
assertEquals(pageURL, browser.getCurrentPageUrl());
在此,我建議您使用斷言,來驗證預(yù)期的結(jié)果(如圖7)。如果實際結(jié)果與斷言的預(yù)期結(jié)果相匹配,則該測試用例算作通過,否則算作失敗。
圖7-JUnit斷言列表
3.在用戶名字段處輸入合法的數(shù)值“Admin”。
Java
//the username
String username = "Admin";
//the Username text field
GuiText usrName = new GuiText("Username");
//set the username
usrName.setText(username);
//check that the username has been correctly inserted
assertEquals(username, usrName.getText());
不同于??Selenium??,Maveryx并不使用包括XPath的“定位器”,來識別它與測試腳本通過交互而復(fù)制過來用戶的操作元素。用戶可以直接使用Maveryx,來描述待測試的UI元素,就像它們出現(xiàn)在應(yīng)用程序中一樣。在本例中,我使用“username”作為用戶名文本字段的占位符,來識別對象(如圖8)。
測試對象通??梢栽谶\行時中被直接識別,而無需使用任何預(yù)先錄制(pre-recorded)的UI映射,或測試對象與鏡像存儲庫。
圖8-用戶名文本字段
4.輸入有效的Password=“admin123”來填充密碼字段。
Java
//the password
String pwd = "admin123";
//the Passoword text field
GuiPasswordText password = new GuiPasswordText("Password");
//set the password
password.setText(pwd);
//check that the password has been correctly inserted
assertEquals(pwd, password.getText());
密碼的文本字段由其占位符“password”來標(biāo)識(如圖9)。
圖9-密碼文本字段
5.單擊登錄按鈕,應(yīng)用將加載儀表板頁面https://opensource-demo.orangehrmlive.com/index.php/dashboard,如圖10。
Java
//click The Login button
new GuiButton("LOGIN").click();
//check that the header "Dashboard" is present (fig.10)
new GuiHtmlElement("Dashboard", AccessibleRoleMaveryx.WEB_H1).waitForObject(5, 1);
//the Dashboard page URL
String dashboardURL = "https://opensource-demo.orangehrmlive.com/index.php/dashboard";
//check the Dashboard page URL
assertEquals(dashboardURL, new GuiBrowser().getCurrentPageUrl());
圖10-“儀表板”的標(biāo)題
根據(jù)上述邏輯,我們便可以開始執(zhí)行測試腳本了。Maveryx將啟動Chrome瀏覽器,并在執(zhí)行代碼時,打開OrangeHRM的登錄頁面。然后,它將使用相關(guān)憑據(jù)進行登錄,并通過斷言檢查的方式,比較預(yù)期和實際結(jié)果。
同理,測試用例2(TC_002)將會生成如下Maveryx測試腳本:
Java
//invalid username
String username = "Admi";
//the Username text field
GuiText usrName = new GuiText("Username");
//set the invalid username
usrName.setText(username);
//check that the username has been correctly inserted
assertEquals(username, usrName.getText());
//the password (valid)
String pwd = "admin123";
//the Passoword text field
GuiPasswordText password = new GuiPasswordText("Password");
//set the password
password.setText(pwd);
//check that the password has been correctly inserted
assertEquals(pwd, password.getText());
//click The Login button
new GuiButton("LOGIN").click();
//check that the message "Invalid credentials" is present (fig.5)
new GuiHtmlElement("Invalid credentials").waitForObject(5, 1);
按照這樣的思路和方法,我們還可以編寫出適用于不同場景的測試用例。
結(jié)論
如前文所示,功能性測試是最容易發(fā)現(xiàn)軟件缺陷的一種測試類型,也是最考驗我們編寫測試用例的能力與邏輯的環(huán)節(jié)。希望上面探討的各個功能性測試案例,能夠協(xié)助您從現(xiàn)有的規(guī)范中,創(chuàng)建出能夠符合實際要求的自動化功能性測試用例。
譯者介紹
陳峻 (Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項目實施經(jīng)驗,善于對內(nèi)外部資源與風(fēng)險實施管控,專注傳播網(wǎng)絡(luò)與信息安全知識與經(jīng)驗;持續(xù)以博文、專題和譯文等形式,分享前沿技術(shù)與新知;經(jīng)常以線上、線下等方式,開展信息安全類培訓(xùn)與授課。
原文標(biāo)題:??Automated Functional Testing: A Step-by-Step Guide??,作者:Gabriele Piantadosi