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();@Testpublic 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.");}@Testpublic 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.");}@BeforeMethodpublic void beforeMethod() {System.out.println("Before method.");webDriver = new FirefoxDriver();String url = "http://cnblogs.com";webDriver.get(url);System.out.println("Navigate successfully.");}@AfterMethodpublic 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();@Testpublic 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.");}@Testpublic 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.");}@BeforeMethodpublic void beforeMethod() {System.out.println("Before method.");webDriver = new FirefoxDriver();String url = "http://cnblogs.com";webDriver.get(url);System.out.println("Navigate successfully.");}@AfterMethodpublic 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一起来执行自动化测试的方法。

转载于:https://www.cnblogs.com/zhang-jun-jie/p/9269647.html

TestNG 框架的运用相关推荐

  1. 第一章 TestNG框架自动化简述

    ------Web自动化测试之Webdriver+TestNG--从零到熟练(系列) 在做页面自动化测试的时候,有很多语言和框架可以选择,如语言有java,python,php,而框架有各种unitt ...

  2. [Java版]Selenium系列:TestNG框架实现数据驱动DataProvider

    Excel实现数据驱动 测试无论做哪种自动化,最终会走向数据驱动框架模式<po.关键字> . 那么在TestNG框架中提供了@DataProvider和@Parameters注解实现数据驱 ...

  3. 基于SpringBoot+TestNG框架接口自动化环境搭建

    一.TestNG相关jar包引用 1.在pom.xml文件中添加: <!-- testNG相关jar包引用 --><dependency><groupId>org. ...

  4. TestNG框架自动化简述

    TestNG框架自动化简述 在做页面自动化测试的时候,有很多语言和框架可以选择,如语言有java,python,php,而框架有各种unittest框架,TestNG框架等等.先前我们介绍过WebDr ...

  5. 基于SpringMVC+TestNG框架接口自动化环境搭建

    一.TestNG相关jar包引用 1.在pom.xml文件中添加: <!-- testNG相关jar包引用 --><dependency><groupId>org. ...

  6. TestNG框架学习

    目录 1.简介 2.简单使用 3.注解说明 4.断言 5.testng.xml 6.参数化测试 1.使用textng.xml传送参数 2.使用@DataProvider传递参数 7.失败用例重跑 8. ...

  7. 接口自动化集成TestNG框架

    目录 1. 接口概念 2. HTTP接口 3. TestNG介绍 4. TestNG注解 4.1 dependsOnMethods标签 4.2 alwaysRun标签 4.2.1 alwaysRun ...

  8. Testng框架简介

    文档参考自官方地址: http://testng.org/doc/documentation-main.html#testng-listeners 目录 1. 介绍 2 - Annotation 3 ...

  9. java接口自动化-Testng框架、HttpClient框架

     Testng 引用文件 ==>pom.xml 快捷键配置:Alt键+回车 <dependencies><dependency><groupId>org.te ...

最新文章

  1. java内部类为什么会持有外部类的引用_java中内部类为什么会持有外部类的引用?...
  2. Linux Shell脚本编程--jq命令
  3. SAP BTP 平台 Cloud Application Programming 编程模型概述
  4. nginx输出日志_ingressnginx持久化日志
  5. java 并发锁_Java并发教程–重入锁
  6. php代码里怎么写html代码_菜鸟青铜变白银!Python 项目代码写完了,然后怎么打包和发布?...
  7. sublime3快捷键
  8. CUMT矿大----电路与数字系统实验一 一位全减器
  9. mac通过u盘启动linux系统,在mac下制作linux启动U盘
  10. 小说网站源码+采集器+App端
  11. Java设计模式之——适配器
  12. 如何进行复盘分析,复盘分析的步骤是什么?
  13. 如何实现一个漂亮的微信小程序朋友圈、表白墙、校内圈(后台篇)
  14. python 经纬度 地址批量转换
  15. python词云去除词_Python生成歌词词云
  16. JS中将中文数字转化为阿拉伯数字
  17. 《软技能》读书笔记(上)
  18. 为什么抖音张同学这么火爆?用 Python 分析 1w+条评论数据,我发现了其中的秘密
  19. RPC服务和HTTP服务对比
  20. S4一般总账科目启用未清项管理(open item management)历史数据转换-RFSEPA02

热门文章

  1. artcam2008 stp 教程_ArtCAM_中文版使用教程
  2. 实际返回的行数超出请求的行数_代码行数越少越好?
  3. python方法_详细解读Python中的__init__()方法
  4. bash不能运行c语言,解决:无法加载文件 C:\\Program Files\\.. 因为在此系统上禁止运行脚本。...
  5. php试题多选,php考试题 (选择题).doc
  6. UXDB基于MySQL_干货分享|“脱胎换骨”后的UXDB究竟如何
  7. linux nload_Linux nload命令
  8. 2018年度报告单_2018年度最佳在线IT课程
  9. 熊猫DataFrame from_dict()–字典到DataFrame
  10. java中的命令行参数_Java中的命令行参数