TestNG 框架的运用
TestNG这个测试框架可以很好的和基于Selenium的web自动化测试结合在一起,实现把我们写好的自动化测试用例以自定义顺序执行。下面分为十二步来对TestNG测试框架进行总结,包括环境的部署,从TestNG框架的几种常用方法,到与Ant结合来实现自动化测试。
第一步:创建项目
新建一个名为forTestNg的java project,然后创建一个libs文件夹,导入所有和Selenium相关的jar包:

第二步:安装TestNG
在Eclipse中点击Help->Install New Software,点击Add,Location填写“http://beust.com/eclipse”,然后点击OK:

之后勾选TestNG,点击Next进行安装即可:

之后点击Next:

点击Accept并Finish:

进行安装:

点击OK:

完成安装后点击Yes重启Eclipse:

第三步:部署TestNG的jar包
Eclipse重启后,可以在libs文件夹中发现多了一个TestNG的jar包:

选中libs文件夹下所有的jar包,右键->Build Path->Add to Build Path:

第四步:新建TestNG类
新建一个名为forTestNg的package:

按下“Ctrl+N”选中TestNG类,点击Next:

填写信息如下(选择Source folder,选择Package name,给你的TestNG测试类起一个Class name,勾选两个Annotations,给XML文件起个名字),点击Finish:

NewTest类代码如下(@BeforeMethod的方法将在每个@Test的方法执行前执行,@AfterMethod的方法将在每个@Test的方法执行后执行):

package forTestNg; import org.testng.annotations.Test; import userInfo.UserInfo; import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod; import java.util.logging.Level;
import java.util.logging.Logger; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver; public class NewTest {
public WebDriver webDriver;
UserInfo usrInfo = new UserInfo(); @Test
public void testA() throws InterruptedException {
waitForLinkText(webDriver, "登录");
webDriver.findElement(By.linkText("登录")).click();
waitForId(webDriver, "input1");
webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName);
webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd);
webDriver.findElement(By.id("signin")).click();
System.out.println("Login successfully.");
} @Test
public void testB() throws InterruptedException {
waitForLinkText(webDriver, "登录");
webDriver.findElement(By.linkText("登录")).click();
waitForId(webDriver, "input1");
webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName);
webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd);
webDriver.findElement(By.id("signin")).click();
System.out.println("Login successfully.");
} @BeforeMethod
public void beforeMethod() {
System.out.println("Before method.");
webDriver = new FirefoxDriver();
String url = "http://cnblogs.com";
webDriver.get(url);
System.out.println("Navigate successfully.");
} @AfterMethod
public void afterMethod() {
System.out.println("After method.");
webDriver.quit();
System.out.println("Quit successfully.");
} private static void waitForId(WebDriver webDriver, String id) throws InterruptedException {
try {
Thread.sleep(1000);
webDriver.findElement(By.id(id));
} catch (Exception e) {
Logger log = Logger.getLogger("lavasoft");
log.setLevel(Level.INFO);
log.info(e.toString());
}
} private static void waitForLinkText(WebDriver webDriver, String linkText) throws InterruptedException {
try {
Thread.sleep(1000);
webDriver.findElement(By.linkText(linkText));
} catch (Exception e) {
Logger log = Logger.getLogger("lavasoft");
log.setLevel(Level.INFO);
log.info(e.toString());
}
}
}

*第五步:新建辅助类
新建一个userInfo包,并创建一个UserInfo类,用于存储用户信息:

代码如下:

package userInfo;
public class UserInfo {
public String usrName;
public String pwd;
public UserInfo() {
usrName = "用户名";
pwd = "密码";
}
}

第六步:修改TestNG的xml配置文件
修改xmlTest.xml文件,内容如下(指定了测试方法的执行顺序):

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="false">
<test name="Test" preserve-order="true">
<classes>
<class name="forTestNg.NewTest" />
<methods>
<include name="testB" />
<include name="testA" />
</methods>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->

以上代码指定了先执行方法testB,然后执行方法testA;
第七步:运行TestNG测试
在xml文件右键选择Run As->TestNG Suite运行测试:
运行结果如下,我们可以在Console中看到相应方法的测试结果:

从总结信息中可以看出,共运行了两个test方法,其中有一个失败了,我们可以看到是出现了locate不到link元素的异常,在“Results of running suite”栏下还可以看到测试结果是否通过的信息:

方法testB测试失败了,这是由于在方法testB里输入了乱码的linkText导致的:

@Test
public void testB() throws InterruptedException {
waitForLinkText(webDriver, "登录");
webDriver.findElement(By.linkText("登录")).click();
waitForId(webDriver, "input1");
webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName);
webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd);
webDriver.findElement(By.id("signin")).click();
System.out.println("Login successfully.");
}

*、如果运行出错,提示找不到classpath——创建“TESTNG_HOME”环境变量,值为“D:\TestNG”(这里我把“testng-6.9.9.jar”这个jar包放在了D盘的这个路径下):

创建CLASSPATH环境变量,值为“%CLASSPATH%;%TESTNG_HOME%\testng-6.9.9.jar;”:

之后重启Eclipse并运行测试。
第八步:查看测试结果
进一步去看测试结果,首先找到项目所在的文件夹,发现有一个test-output的文件夹:

在其下的Suite文件夹下打开“Test.html”:

之后就可以看到测试结果了(红色的为失败,绿色的为通过):

第九步:测试多条case
当有多个classes需要测试的情况,这里拿两个classes举例,新创建一个class名为NewTest2,将上面NewTest类的代码复制粘贴进NewTest2类中,如下:

package forTestNg; import java.util.logging.Level;
import java.util.logging.Logger; import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test; import userInfo.UserInfo; public class NewTest2 {
public WebDriver webDriver;
UserInfo usrInfo = new UserInfo(); @Test
public void testA() throws InterruptedException {
waitForLinkText(webDriver, "登录");
webDriver.findElement(By.linkText("登录")).click();
waitForId(webDriver, "input1");
webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName);
webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd);
webDriver.findElement(By.id("signin")).click();
System.out.println("Login successfully.");
} @Test
public void testB() throws InterruptedException {
waitForLinkText(webDriver, "登录");
webDriver.findElement(By.linkText("登录")).click();
waitForId(webDriver, "input1");
webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName);
webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd);
webDriver.findElement(By.id("signin")).click();
System.out.println("Login successfully.");
} @BeforeMethod
public void beforeMethod() {
System.out.println("Before method.");
webDriver = new FirefoxDriver();
String url = "http://cnblogs.com";
webDriver.get(url);
System.out.println("Navigate successfully.");
} @AfterMethod
public void afterMethod() {
System.out.println("After method.");
webDriver.quit();
System.out.println("Quit successfully.");
} private static void waitForId(WebDriver webDriver, String id) throws InterruptedException {
try {
Thread.sleep(1000);
webDriver.findElement(By.id(id));
} catch (Exception e) {
Logger log = Logger.getLogger("lavasoft");
log.setLevel(Level.INFO);
log.info(e.toString());
}
} private static void waitForLinkText(WebDriver webDriver, String linkText) throws InterruptedException {
try {
Thread.sleep(1000);
webDriver.findElement(By.linkText(linkText));
} catch (Exception e) {
Logger log = Logger.getLogger("lavasoft");
log.setLevel(Level.INFO);
log.info(e.toString());
}
}
}

然后将xml文件进行修改,如下,修改了test的名字,将Test改为了Test1,并新加了Test2:

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="false">
<test name="Test1" preserve-order="true">
<classes>
<class name="forTestNg.NewTest" />
<methods>
<include name="testB" />
<include name="testA" />
</methods>
</classes>
</test> <!-- Test -->
<test name="Test2" preserve-order="true">
<classes>
<class name="forTestNg.NewTest2" />
<methods>
<include name="testA" />
<include name="testB" />
</methods>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->

可以看出,在xmlTest.xml文件中新增了一个名为Test2的test,class的名字为forTestNg.NewTest2,里面的方法执行顺序为先testA后testB,和Test1中类的方法执行顺序正好相反。然后右键点击xmlTest.xml文件,选择Run As->TestNG Suite。之后测试就会自动按照先执行Test1再执行Test2的顺序进行了。Test1中先testB后testA,Test2中先testA后testB。从Console可以看出运行结果:

也可以从Results of running suite中查看测试的执行顺序和结果:

在项目的test-output\Suite文件夹下可以看到各个test的测试结果,每个test都对应有一个html格式的测试结果report:

第十步:忽略测试
忽略测试——被指定忽略的test方法在自动化执行测试的过程中将不被执行,即——被忽略,我们只需要修改想要忽略的test方法的Annotation信息。这里拿NewTest1和NewTest2这两个类中的testB方法举例,我们想要在执行过程中忽略执行方法testB,只需要将两个类中testB的Annotation信息修改如下:

@Test(enabled = false)
public void testB() throws InterruptedException {
waitForLinkText(webDriver, "登录");
webDriver.findElement(By.linkText("登录")).click();
waitForId(webDriver, "input1");
webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName);
webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd);
webDriver.findElement(By.id("signin")).click();
System.out.println("Login successfully.");
}

这里,“@Test(enabled = false)”的意思就是让testB方法在执行过程中被忽略执行,也就是不执行的意思。再执行xmlTest.xml文件,我们可以从测试结果看出,这两个被指定忽略的方法并没有在本次测试中执行(两个类中都只执行了testA方法):

第十一步:组测试
组测试——顾名思义,就是将测试分组,测试是针对方法的测试,那么分组也是针对方法的分组。我们需要做的还是修改待测方法的Annotation与xmlTest.xml文件的内容。在NewTest类中修改待测方法的Annotation如下:

@Test(groups = {"loginTest"})
public void testA() throws InterruptedException {
waitForLinkText(webDriver, "登录");
webDriver.findElement(By.linkText("登录")).click();
waitForId(webDriver, "input1");
webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName);
webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd);
webDriver.findElement(By.id("signin")).click();
System.out.println("Login successfully.");
}
@Test(groups = {"loginErrorTest"})
public void testB() throws InterruptedException {
waitForLinkText(webDriver, "登录");
webDriver.findElement(By.linkText("登录")).click();
waitForId(webDriver, "input1");
webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName);
webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd);
webDriver.findElement(By.id("signin")).click();
System.out.println("Login successfully.");
}

在NewTest2类中修改待测方法的Annotation如下:

@Test(groups = { "loginTest" })
public void testA() throws InterruptedException {
waitForLinkText(webDriver, "登录");
webDriver.findElement(By.linkText("登录")).click();
waitForId(webDriver, "input1");
webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName);
webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd);
webDriver.findElement(By.id("signin")).click();
System.out.println("Login successfully.");
}
public void testB() throws InterruptedException {
waitForLinkText(webDriver, "登录");
webDriver.findElement(By.linkText("登录")).click();
waitForId(webDriver, "input1");
webDriver.findElement(By.id("input1")).sendKeys(usrInfo.usrName);
webDriver.findElement(By.id("input2")).sendKeys(usrInfo.pwd);
webDriver.findElement(By.id("signin")).click();
System.out.println("Login successfully.");
}

将NewTest和NewTest2这两个类中的BeforeMethod方法和AfterMethod方法也一同加进组里,否则会抛空指针异常:

@BeforeMethod(groups = { "loginTest", "loginErrorTest" })
public void beforeMethod() {
System.out.println("Before method.");
webDriver = new FirefoxDriver();
String url = "http://cnblogs.com";
webDriver.get(url);
System.out.println("Navigate successfully.");
}
@AfterMethod(groups = { "loginTest", "loginErrorTest" })
public void afterMethod() {
System.out.println("After method.");
webDriver.quit();
System.out.println("Quit successfully.");
}

对于组方法中调用的其他方法,我们不需要做处理(不需要把组方法中调用的方法也加进组)。
然后我们对xmlTest.xml文件进行修改,只保留一个test,将两个class都放进去。在test中增加groups,指定执行属于loginTest组的方法。修改如下:

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="false">
<test name="Test" preserve-order="true">
<groups>
<run>
<include name="loginTest" />
</run>
</groups>
<classes>
<class name="forTestNg.NewTest" />
<class name="forTestNg.NewTest2" />
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->

之后我们再执行xmlTest.xml文件,结果如下:

我们可以看出,只有组方法(testA)才被执行了,不在组中的方法均没有被执行(组方法中调用的方法除外)。
第十二步:同Ant结合测试
同Ant的结合使用——首先下载一个Ant,解压缩zip文件,这里我将解压后的apache-ant-1.9.6文件夹放在“D:\”目录下:

之后要配置环境变量,仍然是:
1、创建一个环境变量叫ANT_HOME,值为路径“D:\apache-ant-1.9.6”;
2、修改Path变量,追加值“%ANT_HOME%\bin”;
3、修改CLASSPATH变量,追加值“%ANT_HOME%\lib”。
然后在Eclipse中项目上点击右键,选择Export:

然后选择General下的Ant Buildfiles->Next->Finish:

之后我们可以看到在项目的目录下,自动创建出了一个叫build.xml的文件:

上述是告诉你怎么用Eclipse自动生成build.xml文件,然并卵,我们还是需要把如下的代码替换上去:

<project name="TestNGTest" default="test" basedir=".">
<!-- Define <testng> task -->
<taskdef name="testng" classname="org.testng.TestNGAntTask">
<classpath>
<pathelement location="libs/testng-6.9.9.jar" />
</classpath>
</taskdef>
<property name="testdir" location="src/forTestNg" />
<property name="srcdir" location="src" />
<property name="libdir" location="libs" />
<property name="full-compile" value="true" />
<path id="classpath.base" />
<path id="classpath.test">
<fileset dir="${libdir}">
<include name="**/*.jar" />
</fileset>
<pathelement location="${testdir}" />
<pathelement location="${srcdir}" />
<path refid="classpath.base" />
</path>
<target name="clean">
<delete verbose="${full-compile}">
<fileset dir="${testdir}" includes="**/*.class" />
</delete>
</target>
<target name="compile" depends="clean">
<javac srcdir="${srcdir}" destdir="${testdir}" verbose="${full-compile}">
<classpath refid="classpath.test" />
</javac>
</target>
<target name="test" depends="compile">
<testng outputdir="${testdir}" classpathref="classpath.test">
<xmlfileset dir="${srcdir}" includes="xmlTest.xml" />
</testng>
</target>
</project>

这里要非常注意:
1)修改taskdef中的location为testng jar包在项目中的相对路径,这里为“libs/testng-6.9.9.jar”;
2)修改property的值,这里修改了两处,一处是testdir的location,填写的是待测包的路径“src/forTestNg”。另一处是libdir的location,填写的是放jar包的路径“libs”;
3)最后一个target中xmlfileset的includes的值,我们要修改为“xmlTest.xml”,这是我们的TestNG xml文件的名字。
都改好后就可以在PowerShell中利用Ant来进行自动化测试了:
1)首先要cd到项目所在的路径下:

2)然后输入ant,执行测试:

但是我们注意到测试结果是失败的:

仔细看,可以发现是因为linkText的value乱码导致的,这是Ant编译时的中文乱码问题,需在build.xml文件中调用javac的地方加入encoding的参数值,解决方法如下:

<target name="compile" depends="clean">
<javac encoding="utf-8" srcdir="${srcdir}" destdir="${testdir}" verbose="${full-compile}">
<classpath refid="classpath.test" />
</javac>
</target>

我们把compile这个target中的javac标签赋予了一个encoding参数,并赋值为“uft-8”,意即中文编码模式。这样就OK了,我们再输入ant,敲回车,执行测试:

测试全部通过啦~这就是使用Ant与TestNG一起来执行自动化测试的方法。
TestNG 框架的运用的更多相关文章
- TestNg框架基础入门
TestNg框架简介: TestNG,即Testing, Next Generation,下一代测试技术,是一套根据JUnit 和NUnit思想而构建的利用注释来强化测试功能的一个测试框架.TestN ...
- java testng框架的windows自动化-自动运行testng程序上篇
本文旨在让读者简单了解testng的自动运行 怎么说呢,在网上已经有了各个前辈进行代码演示以及分享,我力争说到点子上 接上文,之前讲的大部分是juint的自动化代码运行,从未涉及到testng,但是在 ...
- java testng框架的windows自动化-自动运行testng程序下篇
本文旨在让读者简单了解testng的自动运行 接上文https://www.cnblogs.com/xuezhezlr/p/9213456.html,文章大致把testng中比较特殊的两个xml形式说 ...
- 基于testng框架的web自动化测试
package baidutest; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.o ...
- JAVA+SELENIUM+MAVEN+TESTNG框架(二)新建项目
1.新建maven项目 2.下载selenium的jar包,放入maven依赖库中 3.新增testng依赖库,build path->add libirary->testng 4.查看自 ...
- testNG框架提示:Cannot find class in classpath: NewTest
selenium+Java的testNG运行时,报如下错误: org.testng.TestNGException: Cannot find class in classpath: NewTest a ...
- (转)TestNG框架提供两种传入参数的方法:
1.从testng.xml传入参数. 如果参数是一些简单的值,可以直接在testng.xml中定义.这也是最常用的一种. 可以在测试用例中给参数一个默认值.这样,即使在xml文件中没有这个变量,你的测 ...
- 使用TestNG框架测试用例执行顺序问题
既然是讨论执行顺序问题,那么用例肯定是批量执行的,批量执行的方法有mvn test.直接运行testng.xml文件,其中直接运行testng.xml文件的效果与pom文件中配置执行testng.xm ...
- testNG框架,使用@BeforeClass标注的代码,执行失败不抛出异常,只提示test ignore的解决方法
郁闷了好久的一个问题,排错调试的时候是真滴麻烦... Google一圈,发现是testNG的Bug,升级testNG>=6.9.5,就能解决.
随机推荐
- HashMap问答
一.什么是HashMap二.HashMap的继承关系三.HashMap数据结构四.HashMap查找.添加元素是怎样的五.什么是Hash碰撞六.HashMap是线程安全的吗?七.HashMap怎样处理 ...
- Css3实现波浪效果3-静态波纹
一.外框宽度等比例3个椭圆拼合 .container { position: absolute; width: 400px; height: 200px; border: 5px solid rgb( ...
- 【Java】maven多项目资源共享
方案一: <resources> <resource> <!-- <directory>${project.parent.relativePath}/../. ...
- protobuf的简单使用
操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 go 版本 : go1.8.3 linux/amd64 Python 版本 : 2.7.5 libprotoc : 2.5 ...
- 在django中怎么解决没有MySQLdb库的问题
1.安装:pymysql模块 2.在app文件目录下,找到__init__.py文件,在文件中写入下面的代码 #解决django中的MySQLdb模块在python3中没有的问题 import pym ...
- Ant之build.xml配置详解【转】
原文:https://blog.csdn.net/mevicky/article/details/72828554 前言国内关于build.xml的配置资料太零散了,实在是受不了,故而将自己的笔记整理 ...
- 关于Docker目录挂载的总结(转)
关于Docker目录挂载的总结 Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定. 譬如我要启动一个centos容器,宿主机的/test目录挂载到容器的/soft目录,可通过 ...
- C# 对轻量级(IoC Container)依赖注入Unity的使用
概述 Unity是一个轻量级的可扩展的依赖注入容器,支持构造函数,属性和方法调用注入.Unity可以处理那些从事基于组件的软件工程的开发人员所面对的问题.构建一个成功应用程序的关键是实现非常松散的耦合 ...
- Linux系统查毒软件ClamAV (online)
ClamAV是一个可用于Linux平台上的开源杀毒引擎,可检测木马.病毒.恶意软件和其他恶意的威胁. 官网:http://www.clamav.net/ 一.CentOS环境安装 # yum inst ...
- Source Insight小技巧:修改Symbol Window的默认宽度
SI是个好东西,但是源代码窗口左边的符号窗口的默认宽度实在是太小,每次打开一个新的源码窗口都要重新拖放调整,很烦人.下面是一劳永逸调整Symbol Window宽度的方法. 打开一个源码窗口,将Sym ...