第四章 TestNG测试用例分步解析(上)

------Web自动化测试之Webdriver+TestNG--从零到熟练(系列)

      经过前三章我们对自动化相关内容的学习,我们了解了什么是自动化测试,测试环境的搭建和WebDriver API的介绍,定位方法及检测点儿设置等相关知识点。从本章开始,我们讲探讨测试用例的编写,以及其相关的知识点。

4.1 第一个测试用例

     虽然我们在第二章在搭建测试环境的时候,写了一个简单的测试用例检测环境,不过那不算是一个完整的测试用例。下面我们以登录众筹网为例,开始我们测试用例的编写之旅!

   首先我们先写一下这个测试用例的手工测试步骤:

(1)用浏览器打开众筹网首页www.zhongchou.com。

(2)单击右上角的登录按钮,弹出登录浮层。

(3)输入用户名和密码,单击登录按钮,进行登录。

(4)检测是否登录成功,并打开了首页。

(5)退出登录。

   这是我们手工测试的步骤,如果要转化成自动化测试用例,需要转化成我们需要的脚本语言编写的程序。

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来录制测试用例,并且在开发环境下运行通过。可是我们发现这样录制测试用例还是存在问题的,转化后会有很多用不到的代码存在,而且不符合模块化编程的规范,有些功能还实现不了。所以我们还是喜欢自己编写测试用例,录制转化只能当作参考。

原文地址:https://www.cnblogs.com/hua-an/p/5169468.html