参考:https://www.yiibai.com/testng/junit-vs-testng-comparison.html#article-start

1、JUnit缺点:

  • 最初的设计,使用于单元测试,现在只用于各种测试。
  • 不能依赖测试
  • 配置控制欠佳(安装/拆卸)
  • 侵入性(强制扩展类,并以某种方式命名方法)
  • 静态编程模型(不必要的重新编译)
  • 不适合管理复杂项目应用,JUnit复杂项目中测试非常棘手。

2、TestNG的特点

  • 注解
  • TestNG使用Java和面向对象的功能
  • 支持综合类测试(例如,默认情况下,不用创建一个新的测试每个测试方法的类的实例)
  • 独立的编译时测试代码和运行时配置/数据信息
  • 灵活的运行时配置
  • 主要介绍“测试组”。当编译测试,只要要求TestNG运行所有的“前端”的测试,或“快”,“慢”,“数据库”等
  • 支持依赖测试方法,并行测试,负载测试,局部故障
  • 灵活的插件API
  • 支持多线程测试

二、TestNg基本注解

三、TestNG预期异常测试

   1、@Test(expectedExceptions = ArithmeticException.class)
   2、@Test(expectedExceptions = { OrderUpdateException.class, OrderNotFoundException.class })

 

四、TestNG忽略测试

1、@Test(enabled = false)来忽略测试方法

五、TestNG超时测试

   1、@Test(timeOut = 5000) // time in mulliseconds

六、TestNG分组测试

1、测试方法也可以同时属于多个分组,如下代码所示 -@Test(groups = {"mysql","database"})

public void testConnectMsSQL() {
System.out.println("testConnectMsSQL");
}

2、分组测试是TestNG中的一个新的创新功能,它在JUnit框架中是不存在的。 它允许您将方法调度到适当的部分,并执行复杂的测试方法分组。 您不仅可以声明属于某个分组的方法,还可以指定包含其他组的组。 然后调用TestNG,并要求其包含一组特定的组(或正则表达式),同时排除另一个分组。 组测试提供了如何分区测试的最大灵活性,如果您想要背靠背运行两组不同的测试,则不需要重新编译任何内容。

使用<groups>标记在testng.xml文件中指定分组。 它可以在<test><suite>标签下找到。 <suite>标签中指定分组适用于其下的所有<test>标签

public class TestGroup {

    @BeforeGroups("database")
public void setupDB() {
System.out.println("setupDB()");
} @AfterGroups("database")
public void cleanDB() {
System.out.println("cleanDB()");
} @Test(groups = "selenium-test")
public void runSelenium() {
System.out.println("runSelenium()");
} @Test(groups = "selenium-test")
public void runSelenium1() {
System.out.println("runSelenium()1");
} @Test(groups = "database")
public void testConnectOracle() {
System.out.println("testConnectOracle()");
} @Test(groups = "database")
public void testConnectMsSQL() {
System.out.println("testConnectMsSQL");
} @Test(dependsOnGroups = { "database", "selenium-test" })
public void runFinal() {
System.out.println("runFinal");
}

七、TestNG套件测试

测试套件是用于测试软件程序的行为或一组行为的测试用例的集合。 在TestNG中,我们无法在测试源代码中定义一个套件,但它可以由一个XML文件表示,因为套件是执行的功能。 它还允许灵活配置要运行的测试。 套件可以包含一个或多个测试,并由<suite>标记定义。

<suite>testng.xml的根标记。 它描述了一个测试套件,它又由几个<test>部分组成。

下表列出了<suite>接受的所有定义的合法属性。

八、TestNG依赖测试

有时,我们可能需要以特定顺序调用测试用例中的方法,或者可能希望在方法之间共享一些数据和状态。 TestNG支持这种依赖关系,因为它支持在测试方法之间显式依赖的声明。

TestNG允许指定依赖关系:

  • @Test注释中使用属性dependsOnMethods,或者
  • @Test注释中使用属性dependsOnGroups

在TestNG中,我们使用dependOnMethodsdependsOnGroups来实现依赖测试。 如果依赖方法失败,则将跳过所有后续测试方法。

九、TestNG参数化测试

TestNG中的另一个有趣的功能是参数化测试。 在大多数情况下,您会遇到业务逻辑需要大量测试的场景。 参数化测试允许开发人员使用不同的值一次又一次地运行相同的测试。

TestNG可以通过两种不同的方式将参数直接传递给测试方法:

  • 使用testng.xml
  • 使用数据提供者

在本教程中,我们将向您展示如何通过XML @Parameters@DataProvider将参数传递给@Test方法。

1、使用XML传递参数

在此示例中,filename属性从testng.xml传递,并通过@Parameters注入到该方法中。

package com.yiibai;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
public class TestParameterXML {
Connection con;
@Test
@Parameters({ "dbconfig", "poolsize" })
public void createConnection(String dbconfig, int poolsize) { System.out.println("dbconfig : " + dbconfig);
System.out.println("poolsize : " + poolsize); Properties prop = new Properties();
InputStream input = null; try {
// get properties file from project classpath
String path = System.getProperty("user.dir")+"\\"+dbconfig; System.out.println("path => "+path);
//input = getClass().getClassLoader().getResourceAsStream(path); //prop.load(input);
prop.load(new FileInputStream(dbconfig)); String drivers = prop.getProperty("jdbc.driver");
String connectionURL = prop.getProperty("jdbc.url");
String username = prop.getProperty("jdbc.username");
String password = prop.getProperty("jdbc.password"); System.out.println("drivers : " + drivers);
System.out.println("connectionURL : " + connectionURL);
System.out.println("username : " + username);
System.out.println("password : " + password); Class.forName(drivers);
con = DriverManager.getConnection(connectionURL, username, password); } catch (Exception e) {
//e.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
//e.printStackTrace();
}
}
} } }

2、通过@DataProvider传递参数

(1)查看一个简单的@DataProvider示例,传递一个int参数。

package com.yiibai;

import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; public class TestParameterDataProvider { @Test(dataProvider = "provideNumbers")
public void test(int number, int expected) {
Assert.assertEquals(number + 10, expected);
} @DataProvider(name = "provideNumbers")
public Object[][] provideData() { return new Object[][] { { 10, 20 }, { 100, 110 }, { 200, 210 } };
} }
(2)@DataProvider支持传递一个对象参数。 下面的例子显示了如何传递一个Map对象作为参数
package com.yiibai;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties; import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; public class TestParameterDataProvider2 { @Test(dataProvider = "dbconfig")
public void testConnection(Map<String, String> map) { for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("[Key] : " + entry.getKey() + " [Value] : " + entry.getValue());
} } @DataProvider(name = "dbconfig")
public Object[][] provideDbConfig() {
Map<String, String> map = readDbConfig();
return new Object[][] { { map } };
} public Map<String, String> readDbConfig() { Properties prop = new Properties();
InputStream input = null;
Map<String, String> map = new HashMap<String, String>(); try {
input = getClass().getClassLoader().getResourceAsStream("db.properties"); prop.load(input); map.put("jdbc.driver", prop.getProperty("jdbc.driver"));
map.put("jdbc.url", prop.getProperty("jdbc.url"));
map.put("jdbc.username", prop.getProperty("jdbc.username"));
map.put("jdbc.password", prop.getProperty("jdbc.password")); } catch (Exception e) {
e.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} return map; } }

3、 @DataProvider + 方法

此示例显示如何根据测试方法名称传递不同的参数。

public class TestParameterDataProvider3 {

    @Test(dataProvider = "dataProvider")
public void test1(int number, int expected) {
Assert.assertEquals(number, expected);
} @Test(dataProvider = "dataProvider")
public void test2(String email, String expected) {
Assert.assertEquals(email, expected);
} @DataProvider(name = "dataProvider")
public Object[][] provideData(Method method) { Object[][] result = null; if (method.getName().equals("test1")) {
result = new Object[][] {
{ 1, 1 }, { 200, 200 }
};
} else if (method.getName().equals("test2")) {
result = new Object[][] {
{ "test@gmail.com", "test@gmail.com" },
{ "test@yahoo.com", "test@yahoo.com" }
};
} return result; } }

4、 @DataProvider + ITestContext

在TestNG中,我们可以使用org.testng.ITestContext来确定调用当前测试方法的运行时参数。 在最后一个例子中,我们将演示如何根据包含的分组名称传递参数

public class TestParameterDataProvider4 {

    @Test(dataProvider = "dataProvider", groups = {"groupA"})
public void test1(int number) {
Assert.assertEquals(number, 1);
} @Test(dataProvider = "dataProvider", groups = "groupB")
public void test2(int number) {
Assert.assertEquals(number, 2);
} @DataProvider(name = "dataProvider")
public Object[][] provideData(ITestContext context) { Object[][] result = null; //get test name
//System.out.println(context.getName()); for (String group : context.getIncludedGroups()) { System.out.println("group : " + group); if ("groupA".equals(group)) {
result = new Object[][] { { 1 } };
break;
} } if (result == null) {
result = new Object[][] { { 2 } };
}
return result; } }

十、TestNG+SELENIUM负载测试

如何使用@Test属性invocationCountthreadPoolSize在网站上执行负载测试或压力测试

1、@Test(invocationCount =?)

这个invocationCount确定TestNG应该运行这个测试方法的次数。

import org.testng.annotations.Test;

public class TestRepeatThis {

    @Test(invocationCount = 10)
public void repeatThis() {
System.out.println("repeatThis " );
}
}

2、@Test(invocationCount = ?, threadPoolSize = ?)

threadPoolSize属性告诉TestNG创建一个线程池以通过多个线程运行测试方法。 使用线程池,会大大降低测试方法的运行时间

启动包含3个线程的线程池,并运行测试方法10次。

public class TestMultipleThreads3 {

    @Test(invocationCount = 10, threadPoolSize = 3)
public void testThreadPools() { System.out.printf("Thread Id : %s%n", Thread.currentThread().getId()); }
}

TestNg学习的更多相关文章

  1. TestNG学习-002-annotaton 注解概述及其执行顺序

    此文主要讲述用 TestNG 基础的 annotation (注解)知识,及其执行的顺序,并通过一个 TestNG 简单的实例演示 annotation 的执行顺序. 希望能对初学 TestNG 测试 ...

  2. TestNG学习-001-基础理论知识

    此 文主要讲述用 TestNG 的基础理论知识,TestNG 的特定,编写测试过程三步骤,与 JUnit4+ 的差异,以此使亲对 TestNG 测试框架能够有一个简单的认知. 希望能对初学 TestN ...

  3. testng学习-before&after,parameters,并行,factory,beanshell,监听器,依赖注入

    一系列的before after的操作测试 [TestNG] Running: C:\Users\user\AppData\Local\Temp\testng-eclipse-1538841744\t ...

  4. Java接口自动化测试之TestNG学习(二)

    在maven项目的pom.xml文件中导入TestNG <?xml version="1.0" encoding="UTF-8"?> <pro ...

  5. TestNG—学习笔记2

    关于TestNG,也是一边学一边总结,对于TestNG和Junit的比较其实也没有什么意义,都是一种测试框架,都是为了应用而生的东西,没有必要说谁好谁不好了.用的熟练用的好就是真的好啊. 下面简单的总 ...

  6. testNG 学习笔记 Day 1 使用功能详解

    TestSuite处理测试用例有6个规约(否则会被拒绝执行测试) A 测试用例必须是公有类(Public) B 测试用例必须继承与TestCase类 C 测试用例的测试方法必须是公有的( Public ...

  7. TestNG学习笔记目录

    学习TestNG主要用于GUI自动化测试使用,学习目录随进度不断更新.文档内容主要是翻译官方doc,同时加入自己的理解和案例.如有理解偏差欢迎指正 一.TestNG Eclipse plug-in 安 ...

  8. TestNG学习地址分享

    谨以此随笔来记录一个曾经学习TestNG的网站,供以后作为工具书查阅. 链接地址,点击此处.

  9. testNG 学习笔记 Day 3 常用的断言

    TestNG中最常用的一个断言类是Assert.java,里面有多个静态方法,这个类我们习惯叫硬断言.对应的还有一个软断言的类,叫SoftAssert.java,这个类是需要创建实例对象,才能调用相关 ...

随机推荐

  1. 洛谷P1198 [JSOI2008]最大数(BZOJ.1012 )

    To 洛谷.1198 最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当 ...

  2. bootstrap中的对话框-dialog

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <meta name= ...

  3. Problem C: 找气球

    Description zstu集训队经常举办月赛,但是气球经常不够.现有多个桶,每个桶有一种颜色,每个桶可能对应多个题,给定每个题对应的桶,打比赛的时候,经常某道题被发现是水题,但是该颜色的气球没有 ...

  4. Linux学习笔记13—Vi编辑器的学习

    文本编辑工具vim.vi1. vim与vi的最大区别是vim编辑的时候是带颜色显示的.Vi不带颜色显示.2. yum install -y vim-enhanced 如果没有安装VIM 使用上面的命令 ...

  5. php_ssh2操作linux

    <?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/9/15 * Time: 14:11 */ header( ...

  6. IIS远程发布(Web Deploy)

    作为开发人员,我们之前发布应用很可能是拷贝开发环境上发布好的代码文件到应用服务器硬盘中,然后在IIS中部署网站. 但是今天我们讲的是如果直接在我们的开发环境通过VS远程发布网站到应用服务器上,这将极大 ...

  7. 网络的FIN_WAIT_2状态解释和分析

    关于网络设备的FIN_WAIT_2状态解释出处:http://hi.baidu.com/netdemon1981/blog/item/584bfbb2aeb1d4acd9335ad9.html 在HT ...

  8. SSE图像算法优化系列四:图像转置的SSE优化(支持8位、24位、32位),提速4-6倍

    一.前言 转置操作在很多算法上都有着广泛的应用,在数学上矩阵转置更有着特殊的意义.而在图像处理上,如果说图像数据本身的转置,除了显示外,本身并无特殊含义,但是在某些情况下,确能有效的提高算法效率,比如 ...

  9. ANY 和 IN 查询价格大于或等于"超级本"价格的商品,并且按价格降序排列

    -- 查询价格大于或等于"超级本"价格的商品,并且按价格降序排列 //ANY用法 //与比较操作符联合使用,表示与子查询返回的任何值比较为 TRUE ,则返回 TRUE //简单案 ...

  10. 廉价的SUP掌机拆解

    最近经常出现的一款山寨sup掌机, 75元包邮入手, 全套配件如下. 看看正面和背面的实拍图, 比较明显的廉价玩具塑料感. 手柄和充电线共用下方的microUSB口, 所以在双打时是不能用电源供电的. ...