------Web自动化测试之Webdriver+TestNG--从零到熟练(系列)
4.3 自己编写测试用例
还以上面的那个众筹登录的测试用例为例,我们来讲解一下如何自己编写测试用例 。
(1) 在第二章我们创建了一下java工程Test,那下面我们就在这个工程中编写我们的测试用例。右击工程文件夹下的Src文件夹,选择“new“à”other…”,在打开的对话框中选择“TestNG”à”TestNG Class”,单击”next”。如图4.3.1所示:
图4.3.1 新建TestNG Class文件
(2)在打开的对话框中,输入“class name”à”LoginDemo”,然后选择我们测试用例用到的函数“@BeforeTest,@AfterTest”,然后单击finish按钮,则会创建对应的TestNG类文件。如图4.3.2所示:
(3)此时我们创建的LoginDemo.java的文件内容如下:
package Src;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
public class LoginDemo {
@Test
public void f() {
}
@BeforeTest
public void beforeTest() {
}
@AfterTest
public void afterTest() {
}
}
只有一个框架,下面我们就需要填写相应的代码进去。测试用例执行前的操作放到beforeTest()函数中,测试用例执行后的清理操件放到afterTest()函数,而具体的测试用例放到f()函数中。
(4)结合我们通过Selenium IDE录制的操作步骤,加上我们自己的优化,最终我们编写的的自动化测试用例代码如下:
//LoginDemo.java
package Src;
import static org.junit.Assert.assertEquals;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.openqa.selenium.By;
//添加引用
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class LoginDemo {
private WebDriver driver;
private String baseUrl;
@BeforeTest
public void beforeTest() {
driver = new FirefoxDriver();
baseUrl = "http://www.zhongchou.com/";
}
@Test
public void testlogin() throws Exception {
driver.get(baseUrl);
Thread.sleep(2000);//等待打开首页
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();
Thread.sleep(3000);//等待登录成功
//验证登录是否成功
assertEquals("潜龙9527", driver.findElement(By.cssSelector("div.siteLgInner")).getText());
//退出登录
driver.get(baseUrl + "usernew-loginout");
}
@AfterTest
public void afterTest() {
//关闭浏览器
driver.quit();
}
}
代码分析:
Ø 首先为了清晰,我们将beforeTest()函数调整到具体的测试函数之前,这样一直就能看出先执行这个函数。
Ø 更改具体测试函数名f()为testlogin(),这样比较清楚,而且在后续产生测试报告的时候,不至于产生混淆。
Ø 具体的操作步骤和Selenium IDE录制的一样,在此没有做出优化,以方便大家理解。
Ø 增加了Thread.sleep()函数。这个函数的功能就是等待参数毫秒,在页面操作过程中,有延迟现象,所以适当添加这个函数是确保自动化测试用例执行成功的必要条件。
(5)运行测试用例文件,右击这个文件,“Run as”-->”TestNG test”,查看运行输出结果。如图4.3.3所示:
此时的程序简洁,运行比较快速。这才是希望中的自动化测试用例,不过好像也没有体现出TestNG的特点,TestNG有很多的优势嘛!不要着急,下面的章节我们将一步步讲解。
4.4 测试用例编写过程中常见的问题
在我们编写测试用例的过程中,会经常遇到一些问题,这些问题会影响到我们测试用例的质量。所以我们要在编写之前就在脑海里对它们提高警惕,避免这样的错误:
(1)随意命名测试用例类和函数名。
这涉及到编码规范的问题,变量,函数,类的命名必须有意义,不可随意命名。在自动化测试用例中,不正规的命名,会影响测试用例的可读性,而且一旦执行出错,不便于定位问题。
(2)前提条件写到具体的测试用例中。
beforeTest()函数是每个测试用例执行之前都会调用的,所以这个函数里面写的是所有测试用例都要用到的前提条件。而有很多初学的同学,会把测试步骤都写到具体的测试函数中,这样就会造成把前提条件写了很多次,不符合代码重用机制。
(3)测试用例耦合度高。
测试用例之间应该没有太多的耦合性,各自执行完测试用例,判断检测点之后,退出浏览器。这样不影响其他测试用例的执行,如果我们测试用例之间有耦合,如使用相同的测试账号的话,单线程执行没有问题,多线程运行的时候,就会造成死锁或是相互影响。
(4)执行完测试用例,不对测试数据进行清理。
执行完测试用例后,要对测试数据是行清理。而执行线上回归任务的自动化测试用例原则是不产生测试数据的。如果本次执行的测试数据不清理,下次就算执行失败了,检测执行结果的时候,如果检测到上次产生的测试数据了,也不会报错的。
(5)测试用例中没有注释。
不管是什么样的语言写的程序,都要求有注释的。由于我们做自动化测试,大多没有经过详细的编码规范的培训,所有不喜欢写注释。可是如果不加注释,时间长了,你就不清楚这个测试用例是做什么的了,需要逐步地去看代码分析,多费时啊!如果加上注释,只需要看一下注释即可。
4.5 本章小结
本章我们以众筹网的登录为例,讲解了用Selenium IDE录制自动化测试用例和手工编写自动化测试用例的方法。从具体的实例来分析如何使用WebDriver Api来完成我们的测试用例,以此来加深你对自动化测试用例的了解。最后我们还讲解了,自动化测试用例编写过程中应该注意的事情,从一开始就规范自己的代码,严格要求自己,养成良好的编码习惯!