JWebUnit使用:jWebUnit是基於Java的Web應用程式的測試框架 .

zm_21發表於2014-05-26
1什麼是JWebUnit 
jWebUnit是基於Java的Web應用程式的測試框架。 它包裝現有的測試框架如 HtmlUnit 和 Selenium,用一個統一的,簡單的測試介面,讓您可以快速測試您的Web應用程式的正確性。 


2JWebUnit的作用 
JWebUnit提供一個高層次的Java API,用於嚮導的Web應用程式結合的斷言,以驗證應用程式的正確性。 這包括通過連結,表單輸入和提交,驗證表的內容,和其他典型的商業Web應用程式的功能嚮導。 
簡單的嚮導方法和準備使用的斷言允許超過只使用快速測試的建立JUnit或HtmlUnit 。 



3使用JWebUnit HelloWorld 
http://jwebunit.sourceforge.net/apidocs/index.html 

測試版本:jwebunit-3.0-release 
匯入jar:jwebunit-3.0-release\lib 
(servlet-api-2.5.jar一般你如果建立web工程就會已經有了) 

HelloWorld: 
  1. jsp:  
  2. index.jsp  
  3.   <body>  
  4.     <a href="login.jsp" id="login">login</a>  
  5.   </body>  
  6.     
  7. login.jsp  
  8. <html>  
  9.   <head>  
  10.     <title>Login</title>  
  11.   </head>  
  12.     
  13.   <body>  
  14.     <form action="servlet/LoginServlet" method="post">  
  15.         username:<input type="text" name="username"/><br/>  
  16.         password:<input type="password" name="pass"/>  
  17.         <input type="submit"/>  
  18.     </form>  
  19.       
  20.   </body>  
  21. </html>    
  22.   
  23. welcome.jsp  
  24. <html>  
  25.   <head>  
  26.     <title>Welcome</title>  
  27.   </head>  
  28.     
  29.   <body>  
  30.     welcome! <br>  
  31.   </body>  
  32. </html>  
  33.   
  34. LoginServlet  
  35. public class LoginServlet extends HttpServlet {  
  36.   
  37.     @Override  
  38.     protected void service(HttpServletRequest request, HttpServletResponse response)  
  39.             throws ServletException, IOException {  
  40.         String username = request.getParameter("username");  
  41.         String passsword = request.getParameter("pass");  
  42.         System.out.println(username + " login ,pass is" + passsword);  
  43.         String path = request.getContextPath();  
  44.         response.sendRedirect(path + "/welcome.jsp");  
  45.     }  
  46.       
  47. }  
  48.   
  49. LoginServletTest  
  50. package com.partner4java.servlet;  
  51.   
  52. import static net.sourceforge.jwebunit.junit.JWebUnit.*;  
  53.   
  54. import org.junit.Before;  
  55. import org.junit.Test;  
  56.   
  57. public class LoginServletTest {  
  58.       
  59.     @Before  
  60.     public void prepare(){  
  61.         setBaseUrl("http://localhost:8080/jwebunit");  
  62.     }  
  63.       
  64.     @Test  
  65.     public void testLogin(){  
  66.         beginAt("index.jsp");  
  67.         clickLink("login");  
  68.         assertTitleEquals("Login");  
  69.         setTextField("username""hello");  
  70.         setTextField("pass""world");  
  71.         submit();  
  72.         assertTitleEquals("Welcome");  
  73.     }  
  74. }  
  75.   
  76.   
  77. Junit3:  
  78. import net.sourceforge.jwebunit.junit.WebTestCase;  
  79.   
  80. public class ExampleWebTestCase extends WebTestCase {  
  81.       
  82.     public void setUp() {  
  83.         super.setUp();  
  84.         setBaseUrl("http://localhost:8080/test");  
  85.     }  
  86.   
  87.     public void test1() {  
  88.         beginAt("home.xhtml"); //Open the browser on http://localhost:8080/test/home.xhtml  
  89.         clickLink("login");  
  90.         assertTitleEquals("Login");  
  91.         setTextField("username""test");  
  92.         setTextField("password""test123");  
  93.         submit();  
  94.         assertTitleEquals("Welcome, test!");  
  95.     }  
  96. }  
  97.   
  98.       




4選擇您要使用的外掛 
JWebUnit可以使用不同的外掛來執行你寫的測試。通過一個設定來進行區分: 
  1. import net.sourceforge.jwebunit.util.TestingEngineRegistry;  
  2. import org.junit.Before;  
  3.   
  4. import static net.sourceforge.jwebunit.junit.JWebUnit.*;  
  5.   
  6. public class ExampleWebTestCase {  
  7.   
  8.     @Before  
  9.     public void prepare() {  
  10.         setTestingEngineKey(TestingEngineRegistry.TESTING_ENGINE_HTMLUNIT);    // use HtmlUnit  
  11.         setTestingEngineKey(TestingEngineRegistry.TESTING_ENGINE_SELENIUM);    // use Selenium  
  12.     }  
  13. }  


如果在你的環境變數裡面就一種外掛,上面的設定是可以省略的,JWebUnit能夠自動尋找到這個唯一的外掛。 


5部署你的測試嚮導上下文 
JWebUnit允許您測試您的Web應用程式的主要方式,是通過應用程式本身的嚮導。 通過測試嚮導的管理,可以在每個測試用例裡面取得測試環境。 
第一步是就是在一個統一資源管理的地方為測試嚮導指明嚮導的資源位置。 
  1. @Before  
  2.    public void prepare() {  
  3.        setBaseUrl("http://myserver:8080/myapp");  
  4.    }  
一般我們的地址就是一個測試伺服器的地址。 
現在,測試環境裡面就存在了一個測試嚮導,測試嚮導管理了你的應用資源,那麼你就可以查詢這裡面的一些資源是否存在或者是否正確。 
例如向下面這樣:設定一個導航起點,並且判斷每步的內容是否正確。 
  1. @Test  
  2. public void testIndexLogin() {  
  3.     beginAt("index.html");        // start at index.html  
  4.     assertTitleEquals("Home");     // the home page should be titled "Home"  
  5.     assertLinkPresent("Login");    // there should be a "Login" link  
  6.     clickLink("Login");            // click the link  
  7.     assertTitleEquals("Login");    // we should now be on the login page  
  8. }  

assertLinkPresent()搜尋一個字串ID的連結; assertLinkPresentWithText()連結包含一個文字字串搜尋。 
具體查閱:http://jwebunit.sourceforge.net/apidocs/index.html 



6使用表單 
現在,我們可以訪問登入頁面,我們可以使用JWebUnit填寫表格,並斷言,它的結果如預期。 
  1. @Test  
  2. public void testFormSubmission() {  
  3.     beginAt("login.html");  
  4.     assertTitleEquals("Login");    // we should be on the login page  
  5.       
  6.     // fill out the form  
  7.     assertLinkNotPresent("Logout");     // we should not be logged in  
  8.     assertFormPresent("login_form");  
  9.     assertFormElementPresent("username");  
  10.     assertFormElementPresent("password");  
  11.     setTextField("username""test");  
  12.     setTextField("password""test123");  
  13.     assertFormElementEquals("username""test");  
  14.     submit();  
  15.       
  16.     // now that we have filled out the form,  
  17.     // we can assert that we can logout  
  18.     assertLinkPresent("Logout");        // we should now be logged in  
  19. }  

JWebUnit通過 HtmlUnit/Selenium,自動保持跟蹤cookies和Web應用程式指定的會話變數,允許您遍歷訪問您的網站,因為你就像一個普通使用者 
如果一個網頁裡面有多個form,JWebUnit還可以通過form的id或者name進行區分: 
  1. @Test  
  2. public void testBottomFormSubmission() {  
  3.     beginAt("twoForm.html");  
  4.     setWorkingForm("bottomForm");  
  5.     submit();  
  6. }  


你還可以觸發非提交按鍵 (type='button'): 
  1. @Test  
  2. public void testPopupButton() {  
  3.     beginAt("info.html");  
  4.     assertButtonPresent("popupButtonId"); // clickButton() will also check this  
  5.     clickButton("popupButtonId");  
  6.     assertWindowPresent("popupWindow");  
  7. }  




7Working With Frames and Windows 
You can assert the presence of and navigate to windows by name. For instance, if clicking on a button on the root page should open a window, you could test for this and go to the popup window as follows: 
  1.     @Test  
  2.     public void testPopupWindow() {  
  3.         beginAt("rootPage.html");  
  4.         clickLink("popupLink");  
  5.         assertWindowPresent("popupWindow):  // optional - gotoWindow will  
  6.                                             // also perform this assertion.  
  7.         gotoWindow("popupWindow");  
  8.         ...  
  9.         gotoRootWindow();  //Use this method to return to root window.  
  10.     }  
  11. You can work with frames in a similar manner:  
  12.   
  13.     @Test  
  14.     public void testFrame() {  
  15.         beginAt("info.html");  
  16.         assertFramePresent("contentFrame");  
  17.         gotoFrame("contentFrame");  
  18.         ...  
  19.     }  



8驗證網頁內容 
一旦你已經瀏覽到的頁面,你想測試,你可以呼叫JWebUnit提供的斷言,以驗證它的正確性。 
  1. @Test  
  2. public void testCorrectness() {  
  3.      beginAt("mainPage.xhtml");  
  4.      assertTitleEquals("Main Page");  
  5.      assertLinkPresentWithText("Add Widget");  
  6.      clickLinkWithText("Add Widget");  
  7.      setTextField("widgetName""My Widget");  
  8.      submit();  
  9.      assertTextPresent("Widget successfully added."):  
  10. }  



9驗證表單的內容 
JWebUnit還提供了驗證介面中表單內容的斷言。 
你可以驗證簡單的內容或者佈局。HttpUnit可以清楚你表達的空格,便於你的測試。 
The below test validates against this html table (the table id attribute is "ageTable"): 

Name Age 
Jim 30ish 
Wilkes 20ish 
  1. @Test  
  2. public void testAgeTable() {  
  3.     beginAt("agePage.html");  
  4.     // check that table is present  
  5.     assertTablePresent("ageTable");  
  6.       
  7.     // check that a single string is present somewhere in table  
  8.     assertTextInTable("ageTable""Jim");  
  9.       
  10.     // check that a set of strings are present somewhere in table  
  11.     assertTextInTable("ageTable",  
  12.                       new String[] {"Jim""Wilkes"});  
  13.                         
  14.     // check composition of table rows/columns  
  15.     assertTableEquals("ageTable",  
  16.                       new String[][] {{"Name""Age"},  
  17.                                       {"Jim""30ish"},  
  18.                                       {"Wilkes""20ish"}});  
  19. }  



如果您需要驗證非空白的表格單元格跨度超過單個列,類提供代表預期的表,行和單元格。 
Age Table 
Name Age 
Jim 30ish 
Wilkes 20ish 
  1. @Test  
  2.   public void testAgeTable() {  
  3.       beginAt("agePage.html");  
  4.       ExpectedTable ageTable = new Table(new Object[][] {  
  5.           {new Cell("Age Table"21)},  
  6.           {"Name""Age"},  
  7.           {"Jim""30ish"},  
  8.           {"Wilkes""20ish"}  
  9.       });  
  10.       assertTableEquals("ageTable", expectedAgeTable);  
  11.   }      




10使用元素ID來驗證內容 

JWebUnit允許您檢查任何HTML元素的存在,其ID或元素的文字。 這可以是一個有用的技巧,檢查存在的一些頁面的邏輯部分。 即使在自由浮動的文字的情況下,一個span元素可以用來環繞文字,並給它一個邏輯ID: 
<span id="welcomeMessage">Welcome, Joe User!</span> 
  1. @Test  
  2. public void testWelcomeMessage() {  
  3.     beginAt("mainPage.xhtml");  
  4.       
  5.     // check for presence of welcome message by text  
  6.     assertTextPresent("Welcome, Joe User!");  
  7.       
  8.     // check for presence of welcome message by element id  
  9.     assertElementPresent("welcomeMessage");  
  10.       
  11.     // check for text within an element  
  12.     assertTextInElement("welcomeMessage""Joe User");  
  13. }  



11使用屬性檔案來驗證內容 
JWebUnit提供了一種非硬編碼的方式來校驗內容,通過來配置屬性檔案,通過獲取property的key來獲取值: 
  1. @Before  
  2. public void prepare() {  
  3.     setbaseUrl("http://myserver:8080/myapp");  
  4.     getTestContext().setResourceBundleName("ApplicationResources");  
  5. }  
  6.   
  7. @Test  
  8. public void testMainPage() {  
  9.     beginAt("mainPage.html");  
  10.     assertTitleEqualsKey("title.mainPage");  
  11.     assertKeyPresent("message.welcome");  
  12.     assertKeyInTable("mainPageTable""header.mainPageTable");  
  13. }  


還可以通過WebTester, WebTestCase 和 JWebUnit的getMessage方法獲取資源內容繫結到你的測試化境中。 

Whether to check for a given logical chunk of text by hard-coded string, property file lookup, or by use of an element id is up to you. 



相關文章