TestNG 框架的运用

发表于:2018-9-18 11:27  作者:张_俊_杰   来源:博客园

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签: TestNG 白盒测试工具

  TestNG这个测试框架可以很好的和基于Seleniumweb自动化测试结合在一起,实现把我们写好的自动化测试用例以自定义顺序执行。下面分为十二步来对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, "?§a?¢???¥??a¢");
  webDriver.findElement(By.linkText("?§a?¢???¥??a¢")).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, "?§a?¢???¥??a¢");
  webDriver.findElement(By.linkText("?§a?¢???¥??a¢")).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, "?§a?¢???¥??a¢");
  webDriver.findElement(By.linkText("?§a?¢???¥??a¢")).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, "?§a?¢???¥??a¢");
  webDriver.findElement(By.linkText("?§a?¢???¥??a¢")).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方法):
   

  上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

【直播预售】接口测试行业大佬带你从青铜上王者>>立即查看
21/212>

评 论

论坛新帖

顶部 底部


建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海瀛东律师事务所 张楠律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2018, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道