参考: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. BZOJ.2816.[ZJOI2012]网络(LCT)

    题目链接 BZOJ 洛谷 对每种颜色维护一个LCT,保存点之间的连接关系. 修改权值A[x]和所有Max[x]都要改: 修改边的颜色先枚举所有颜色,看是否在某种颜色中有边,然后断开.(枚举一遍就行啊 ...

  2. Java并发程序设计(三) Java内存模型和线程安全

    Java内存模型和线程安全 一 .原子性 原子性是指一个操作是不可中断的.即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰. 思考:i++是原子操作吗?  二.有序性 Java代 ...

  3. rabbitmq使用(三)

    Publish/Subscribe In the previous tutorial we created a work queue. The assumption behind a work que ...

  4. Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法

    今天在手机上调试运行Andorid项目时,发现Console打印出"WARNING: Application does not specify an API level requiremen ...

  5. DotNetty z

    使用说明 客户端的代码和服务端的代码相差很少,体现了Netty统一的编程模型.有几个不同点: 客户端的Bootstrap不是ServerBootstrap: 客户端不需要主线程组,只有工作线程组,消息 ...

  6. AVL树平衡旋转详解

    AVL树平衡旋转详解 概述 AVL树又叫做平衡二叉树.前言部分我也有说到,AVL树的前提是二叉排序树(BST或叫做二叉查找树).由于在生成BST树的过程中可能会出现线型树结构,比如插入的顺序是:1, ...

  7. tex---就是tex文件,这个地球人都知道,是文章所在的主要文件

    本demo中包括两个文件example.tex和myref.bib,用的时候參照改即可啦. example.tex:用的时候将'\'和后面文字中间的空格去掉 ----------------- \do ...

  8. Chromium OS 初体验

    Chromium OS可是早有耳闻,但是一直没有尝试,最近很多评论甚至认为会对Windows和Mac都能够造成压力,于是迫不及待的想尝试一下了,百度下了官网,官网很贴心,不光给了用于写入U盘的镜像文件 ...

  9. linux设置预留端口号,防止监听端口被占用 ip_local_reserved_ports

    1. 背景 linux服务器启动时,会对指定的端口进行监听bind,如果同一个机器上这个端口已经被使用,则监听失败,程序无法启动. linux客户端连接服务器accept时,系统会分配本地临时端口用于 ...

  10. 修改覆盖springboot默认日志策略logback

    目录 背景 自定义 背景 springboot初始化了日志的默认实现,只要我们在配置文件添加对应的配置即可. 比如 logging: file: logs/application-debug.log ...