第四章 TestNG測試用例分步解析(上)

------Web自動化測試之Webdriver+TestNG--從零到熟練(系列)css

      通過前三章咱們對自動化相關內容的學習,咱們瞭解了什麼是自動化測試,測試環境的搭建和WebDriver API的介紹,定位方法及檢測點兒設置等相關知識點。從本章開始,咱們講探討測試用例的編寫,以及其相關的知識點。java

4.1 第一個測試用例

     雖然咱們在第二章在搭建測試環境的時候,寫了一個簡單的測試用例檢測環境,不過那不算是一個完整的測試用例。下面咱們以登陸衆籌網爲例,開始咱們測試用例的編寫之旅!編程

   首先咱們先寫一下這個測試用例的手工測試步驟:瀏覽器

(1)用瀏覽器打開衆籌網首頁www.zhongchou.com。模塊化

(2)單擊右上角的登陸按鈕,彈出登陸浮層。函數

(3)輸入用戶名和密碼,單擊登陸按鈕,進行登陸。學習

(4)檢測是否登陸成功,並打開了首頁。測試

(5)退出登陸。網站

   這是咱們手工測試的步驟,若是要轉化成自動化測試用例,須要轉化成咱們須要的腳本語言編寫的程序。ui

4.2 Selenium IDE錄製測試用例

   如咱們前面講到的,能夠利用Selenium IDE來錄製測試步驟,而後添加上檢測點,就能夠造成一個測試用例。轉化成咱們須要的腳本語言格式,如java,而後保存文件,放到咱們的開發環境下就能夠調試運行了。

具體的錄製方法以下:

(1)打開火狐瀏覽器,打開Selenium IDE,在IDE的Base URL中輸入要錄製的網站地址:http://www.zhongchou.com

(2)IDE默認是處於錄製狀態的,若是沒有,單擊紅色按鈕,錄製。在火狐瀏覽器的地址欄中輸入http://www.zhongchou.com,打開百度首頁。

(3)單擊右上角的登陸按鈕,彈出登陸浮層。

(4)在彈出的浮層中輸入 用戶名:183****8905,密碼:a****00,而後單擊登陸按鈕。

(5)在打開的首頁中,右擊右上角的暱稱,如圖4.2.1所示,選擇assert判斷項,設置檢測點。而後退出登陸。

 


4.2.1 設置檢測點

(6)單擊Selenium IDE的回放按鈕,檢測錄製的測試步驟,如圖4.2.2所示,不過此時檢測點會報錯,緣由是執行太快,頁面沒有刷新出來。

 


4.2.2 回放錄製的測試步驟

(7)爲了解決這個問題,咱們在檢測點前添加一個等待。等待咱們要檢測的內容出現後,再去執行判斷。如圖:4.2.3所示,回放驗證成功。

 


4.2.3 添加等待命令

(8)如今說明咱們錄製的測試用例沒有問題,導出錄製的測試用例爲java/Junit/WebDriver格式的,保存爲login.java.如圖4.2.4所示:

 


4.2.4 導出錄製的測試用例

(9)檢查導出的代碼,Selenium IDE幫咱們導出的代碼以下:

 

#login.java

package com.example.tests;

 

import java.util.regex.Pattern;

import java.util.concurrent.TimeUnit;

import org.junit.*;

import static org.junit.Assert.*;

import static org.hamcrest.CoreMatchers.*;

import org.openqa.selenium.*;

import org.openqa.selenium.firefox.FirefoxDriver;

import org.openqa.selenium.support.ui.Select;

 

public class Login {

  private WebDriver driver;

  private String baseUrl;

  private boolean acceptNextAlert = true;

  private StringBuffer verificationErrors = new StringBuffer();

 

  @Before

  public void setUp() throws Exception {

    driver = new FirefoxDriver();

    baseUrl = "http://www.zhongchou.com/";

    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

  }

 

  @Test

  public void testLogin() throws Exception {

    driver.get(baseUrl + "/");

    driver.findElement(By.id("headerLogin")).click();

    driver.findElement(By.name("username")).clear();

    driver.findElement(By.name("username")).sendKeys("18311338905");

    driver.findElement(By.name("user_pwd")).clear();

    driver.findElement(By.name("user_pwd")).sendKeys("a000000");

    driver.findElement(By.cssSelector("a.zc")).click();

    for (int second = 0;; second++) {

           if (second >= 60) fail("timeout");

           try { if ("潛龍9527".equals(driver.findElement(By.cssSelector("div.siteLgInner")).getText())) break; } catch (Exception e) {}

           Thread.sleep(1000);

    }

 

    assertEquals("潛龍9527", driver.findElement(By.cssSelector("div.siteLgInner")).getText());

    driver.findElement(By.cssSelector("div.siteLgInner")).click();

driver.findElement(By.linkText("退出")).click();

  }

 

  @After

  public void tearDown() throws Exception {

    driver.quit();

    String verificationErrorString = verificationErrors.toString();

    if (!"".equals(verificationErrorString)) {

      fail(verificationErrorString);

    }

  }

 

  private boolean isElementPresent(By by) {

    try {

      driver.findElement(by);

      return true;

    } catch (NoSuchElementException e) {

      return false;

    }

  }

 

  private boolean isAlertPresent() {

    try {

      driver.switchTo().alert();

      return true;

    } catch (NoAlertPresentException e) {

      return false;

    }

  }

 

  private String closeAlertAndGetItsText() {

    try {

      Alert alert = driver.switchTo().alert();

      String alertText = alert.getText();

      if (acceptNextAlert) {

        alert.accept();

      } else {

        alert.dismiss();

      }

      return alertText;

    } finally {

      acceptNextAlert = true;

    }

  }

}

 

代碼講解:

  • Ø 最前面是引用Webdriver相關的一些兒函數或方法。
  • Ø 建立一個測試類Login,類裏是具體的測試方法testLogin()。
  • Ø 函數中是一步步的具體操做。
  • Ø 函數setUp()和tearDown,是測試用例執行前和執行後要作的操做。
  • Ø 函數isElementPresent(),isAlertPresent()和closeAlertAndGetItsText()是selenium IDE本身產生的,對測試用例沒有任何用處,能夠忽略。

(10)      將代碼導入到開發環境中。打開Eclipse,新建java工程如:Test。將剛剛保存的login.java文件導入到這個工程中,如圖4.2.5所示:

 


圖4.2.5導入保存的文件

(11)      運行驗證剛剛導入的代碼,右擊這個文件,「Run as」-->」TestNG test」,查看運行結果。程序沒有任何輸出,經分析,咱們得出緣由:由於咱們導出的是WebDriver格式的,TestNG不識別,若是咱們直接導出TestNG格式的,又沒有WebDriver相關的引用。因此,咱們就修改一下代碼,將「@Before,@After」修改爲「@BeforeTest,@AfterTest」便可運行。但運行過程當中會報錯,如圖4.2.6所示:

 


圖4.2.6 程序運行結果

這個錯誤緣由是:咱們退出時,先須要將鼠標移到暱稱,會拉出下拉菜單,而後單擊退出菜單進行退出。而Selenium IDE是錄製不到鼠標over到暱稱上的操做的,因此找不到退出按鈕。而mouseover()操做須要導入另外的包,因此咱們採出如下操做來完成退出:

//退出連接:http://www.zhongchou.com/usernew-loginout

driver.get(baseUrl + "usernew-loginout");

(12)      再次執行測試用例,則會打開火狐瀏覽器,登陸到衆籌網,而後檢測登陸是否成功,然後退出。此是測試用例會有如圖4.2.7所示的輸出結果:

 


圖4.2.7 修改後的測試用例輸出

(12)至此,利用Selenium IDE來錄製測試用例,而且在開發環境下運行經過。但是咱們發現這樣錄製測試用例仍是存在問題的,轉化後會有不少用不到的代碼存在,並且不符合模塊化編程的規範,有些功能還實現不了。因此咱們仍是喜歡本身編寫測試用例,錄製轉化只能看成參考。

相關文章
相關標籤/搜索