参考: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. Python3高级基础(2)

    1 Python3模拟数据结构 1.1 栈 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表.栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进 ...

  2. java显示树结构

    /** * 显示多颗树的所有节点的信息 * * @param departmentList */ private void showTreeList(Collection<Department& ...

  3. Need help with git commit - Error : "error: cannot run gpg: No such file or directory error: could not run gpg. fatal: failed to write commit object"support (self.git)

    参考:https://www.reddit.com/r/git/comments/4jflp1/need_help_with_git_commit_error_error_cannot_run/ It ...

  4. jdk 10.0.2 bug修复

    之前记录过jdk9+版本的1个bug,某些情况下会导致方法执行二遍,今天早上打开笔记本(mac),弹出一个框提示jdk升级10.0.2,顺手点了一下,然后验证了下该bug,发现居然fix掉了,推荐大家 ...

  5. C# DES (ECB模式) 加密解密 --单倍长

    加密:  调用时: Encrypt_DES16("2AF349243535BCD3", "1111111111111111"); public static s ...

  6. Delphi的接口委托示例

    {  说明:该事例实现的效果,在单个应用或代码量小的项目中,可以完全不用接口委托来完成.  之所以采用委托接口,主要是应用到:已经实现的接口模块中,在不改变原有代码的情况下,  需要对其进行扩展:原始 ...

  7. Autonomous driving - Car detection YOLO

    Andrew Ng deeplearning courese-4:Convolutional Neural Network Convolutional Neural Networks: Step by ...

  8. WPF的5种绑定模式(mode)

    WPF的绑定模式(mode)是枚举的 枚举值共有5个 1:OneWay(源变就更新目标属性) 2:TwoWay(源变就更新目标并且目标变就更新源) 3:OneTime(只根据源来设置目标,以后都不会变 ...

  9. Atlas+Keepalived系列一:安装Atlas:

    1:下载Atlas https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm 2:安装A ...

  10. 【NIO】Java NIO之缓冲

    一.前言 在笔者打算学习Netty框架时,发现很有必要先学习NIO,因此便有了本博文,首先介绍的是NIO中的缓冲. 二.缓冲 2.1 层次结构图 除了布尔类型外,其他基本类型都有相对应的缓冲区类,其继 ...