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