转自 http://www.blogjava.net/fanscial/archive/2005/12/14/23780.html

1.         JDK 5 Annotations (JDK 1.4 可以用JavaDoc代替).

一个典型的Junit的测试类

import junit.framework.TestCase;

public class Jtest extends TestCase {

protected void setUp() throws Exception {

super.setUp();

//some initial code

}

protected void tearDown() throws Exception {

super.tearDown ();

//release resource and rollback

}

public void testFunction {

//test code

}

}

对应的TestNG的测试类,我们写最简单的情况。

public class NGtest{

@Configuration(beforeTestClass=true)

public void setUp() {

//some initial code

}

@Configuration(afterTestClass = true)

public void tearDown (){

//release resource and rollback

}

@Test( )

public void testFunction (){

//test code

}

}

这样写可以比较明显的看到两者的对应关系(注意TestNG的方法的名字是可以随便取的,取一样的名字只是为了让你容易找到对应的关系)

这说明TestNG是从Junit发展而来的,至少借鉴了很多Junit的思想(实际上TestNG的作者本身就是Junit的小组成员之一)。

我们从最表面的现象来看看吧

l         TestNG没有继承任何类,甚至接口!!

l         JDK 5 Annotations

这2者是息息相关的,为什么我们不用继承任何类,因为信息都在注释里面,这样会带来很多好处(绝不仅仅是命名的方便)。

2.         灵活的test configuration

先看一下Junit的执行顺序

Setup( )   test1( )    tearDown( )      Setup( )     test2( )      tearDown( )…………

下面是TestNG的

实际上外面还有一个beforeSuite和afterSuite的方法,是在测试项目开始的时候就运行了,实际上如果我的每个方法都要用到的初始化的代
码,为什么要运行那么多次,如果其中有EJB这种重量级的容器要初始化,效率差可想而知。事实上TestNG可以做到更加的灵活,就是分组。

3.         TestNG 的灵魂

配置文件(testng.xml)

Junit中要定义测试任务是要写TestSuit的,居然要写硬编码,而TestNG全部写在testng.xml(名字可以自定义的)中的,然后可以通过ant来调用。

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="my suite">

<test name="test1">

<groups>

<run name="group1">

</run>

</groups>

<classes>

<class name="ClassA"  />

</classes>

</test>

<test name="test2"  >

<groups>

<run name="group2">

</run>

</groups>

<classes>

<class name="ClassB"/>

<class name="ClassC"/>

</classes>

</test>

</suite>

上面包含了配置文件的基本的主干,一个配置文件只有一个Suite,基本上一个项目写一个配置文件就可以了,当然如果你的项目足够大,可能需要几个
配置文件。测试是按照从大到小的顺序进行的,先执行suite,test,class,其中的group和class是平级的,在讲group的时候再详
细的解释。有了这个文件,我们就可以很清楚的理解@configuration里面的类型

public boolean beforeSuite() default false;

public boolean afterSuite() default false;

public boolean beforeTest() default false;

public boolean afterTest() default false;

public boolean beforeTestClass() default false;

public boolean afterTestClass() default false;

public boolean beforeTestMethod() default false;

public boolean afterTestMethod() default false;

从字面意思可以看出方法的执行顺序,唯一的疑惑是执行的次数,官方的文档的解释是相当让人疑惑的,好在我们可以自己测
试,beforeTestMethod是当类中任何方法调用都要执行的,beforeTest和beforeTestClass在一个Test中是只执行
一次的(没试过把2个相同的类写到一个Test里面),而beforeSuite在一个配置文件中只执行一次。上面都没有考虑分组的情况,分组会更加的复
杂,似乎灵活过头了,但是考虑到项目的复杂性,每个测试方法的初始化都可能不同,现在我们做的项目要求每天要将单元测试写进daily
build的build文件里面自动执行,似乎只有用TestNG这样灵活的配置才能达到。

4.         分组

将一个测试方法或者配置方法分组是很容易的。

@Configuration(beforeTestClass=true,groups=“group1”)

@Test(groups=”group1”)

只要象上面写就可以了,名字随便取,而且不需要预先定义。

我们在一个类做2个组,看看效果

@Configuration(beforeTestClass=true,groups=“group1”)

Public void C1(){}

@Test(groups=”group1”)

Public void T1(){}

@Configuration(beforeTestClass=true,groups=“group2”)

Public void C2(){}

@Test(groups=”group2”)

Public void T2(){}

只选group1

…………………

<groups>

<run name="group1">

</run>

</groups>

…………

执行C1        T1

只选group2

…………………

<groups>

<run name="group2">

</run>

</groups>

…………

执行C2        T2

2个都选

…………………

<groups>

<run name="group1">

<run name="group2">

</run>

</groups>

…………

我最先以为的顺序是C1        T1       C2        T2  (A)

然而实际上是  C1        C2        T1        C1        C2        T2 (B)

要想达到(A)的效果,只能把2个group分开了放在不同的Test里面,其实只要知道一点,TestNG是先找Class,然后才去找Group的。

4.         参数

Junit是不带任何参数的,不论是测试方法还是配置方法,而TestNG都是可以添加参数的,有2种方法。

(1)       使用Parameter参数

        @Parameters({ "first-name" })
        @Test
        public void testSingleString(String firstName) {
        System.out.println("Invoked testString " + firstName);
        assert "Cedric".equals(firstName);
        }
        参数的值放到配置文件中
        <suite name="My suite">
        <parameter name="first-name"  value="Cedric"/>
        <test name="Simple example">

这种方法偶尔用之还可以,但是很遗憾的是第一只能传String(可能可以其他的基本数据类型??但至少不能传复杂对象),第二数据写在配置文件中,不能所见即所得。

但是下面的方法真的给我们惊喜。

(2)       DataProvider

这是从4.0以后增加的功能,看看怎么实现。

// This method will provide data to any test method that declares that its Data Provider
// is named "test1"
@DataProvider(name = "test1")
public Object[][] createData1() {
return new Object[][] {
new Object[] { "Cedric", new Integer(36) },
new Object[] { "Anne", new Integer(37)},
 };
}

// This test method declares that its data should be supplied by the Data Provider
// named "test1"
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
System.out.println(n1 + " " + n2);
}

执行的结果

Cedric 36

Anne 37

DataProvider返回的是个2维数组的对象,什么数据都可以提供了吧,而且可以让你的测试方法执行多次。而且最重要的是和测试方法写在一起,所见即所得。

5.         Ant的集成和Daily Build

TestNG对Ant提供了很好的支持,这是我写得测试用的Ant脚本

<project default="testng">

<property file="build.properties" />

<path id="cpath">

<fileset dir="lib">

<include name="*.jar"/>

</fileset>

</path>

//定义testng的任务

<taskdef resource="testngtasks" classpath="lib/testng-4.4-jdk15.jar" />

<target name="compile">

<mkdir dir="test/classes"/>

<javac destdir="test/classes"

srcdir="${testng.dir}"

debug="true"

encoding="GBK" >

<classpath refid="cpath"/>

</javac>

</target>

//执行testng的任务

<target name="testng" depends="compile">

<testng classpath="test/classes">

<xmlfileset dir="${configure.dir}" includes="testing.xml" />

</testng>

</target>

</project>

简单的不能在简单了,你只要告诉ant来调用,然后告诉ant配置文件在哪里,剩下的事都交给testng自己的配置文件去做就行了,然后ant以后都不用修改了。不建议将任务的细节写在ant里面,首先功能不如testng自己的配置文件强大,而且ant需要维护。

下面基本上是TestNG才有的特点了,和Junit没有什么关系,但为了延续,还是用了上面的题目。
7 .依赖关系
先给个例子

@Test

public void serverStartedOk() {}

@Test(dependsOnMethods = { "serverStartedOk" })

public void method1() {}

在这个例子中,method1()必须在serverStartedOk()执行后才能执行,而且serverStartedOk()不能fail,否则method1()会被skip掉

基本上类似于ant的依赖关系,也很容易理解,只是分为强依靠和弱依靠,区别是弱依靠只管执行的顺序,强依靠除了顺序,还要正确,否则后面的不执行,上面的例子是强依靠,下面是弱依靠,加上alwaysrun=”true”

@Test

public void serverStartedOk() {}

@Test(dependsOnMethods = { "serverStartedOk" },alwaysrun=”true”)

public void method1() {}

如果有兴趣,可以看看下面的文章,里面有有趣的争论

http://beust.com/weblog/archives/000171.html

8.其他特性
   还有很多,工厂模式,并行运行(Parallel running ),BeanShell 等等,感觉不是特别重要,而且写了那么多感觉好累啊,就不写了,有兴趣的可以去看看官方的文档。
http://testng.org/doc/documentation-main.html

TestNG 与 Junit的比较(转)的更多相关文章

  1. 关于testNG和JUnit的对比

    关于选择JUnit还是选testNG,这几篇文章,建议读一读: API参考文档: Junit API文档:http://junit.org/junit4/javadoc/latest/index.ht ...

  2. testng入门教程11 TestNG运行JUnit测试

    现在,您已经了解了TestNG和它的各种测试,如果现在担心如何重构现有的JUnit代码,那就没有必要,使用TestNG提供了一种方法,从JUnit和TestNG按照自己的节奏.也可以使用TestNG执 ...

  3. 总结TestNg与JUnit的异同

    工作中一直用的是junit,近期稍微学习了一下TestNg,发现TestNg比java强大太多. TestNg简介 TestNg也是一套测试框架,它的灵感来源于Junit(java的单元测试框架)和N ...

  4. TestNG 与 Junit的比较

    转自 http://www.blogjava.net/fanscial/archive/2005/12/14/23780.html 1.         JDK 5 Annotations (JDK ...

  5. testNg vs junit 4.X @Test

    http://www.ibm.com/developerworks/cn/java/j-cq08296/ 一个简单的测试用例 初看起来,JUnit 4 和 TestNG 中实现的测试非常相似.为了更好 ...

  6. 【转】TestNG 与 Junit的比较

    转自 http://www.blogjava.net/fanscial/archive/2005/12/14/23780.html 1.         JDK 5 Annotations (JDK ...

  7. JUnit 4 与 TestNG 对比

    原文出处: 付学良的网志 原文出处2: http://www.importnew.com/16270.html -------------------------------------------- ...

  8. Java Unit Testing - JUnit & TestNG

    转自https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaUnitTesting.html yet another insignifican ...

  9. TestNG 入门教程

    原文出处:http://www.cnblogs.com/TankXiao/p/3888070.html 阅读目录 TestNG介绍 在Eclipse中在线安装TestNG 在Eclipse中离线安装T ...

随机推荐

  1. Python之路,Day12 - 那就做个堡垒机吧

    Python之路,Day12 - 那就做个堡垒机吧   本节内容 项目实战:运维堡垒机开发 前景介绍 到目前为止,很多公司对堡垒机依然不太感冒,其实是没有充分认识到堡垒机在IT管理中的重要作用的,很多 ...

  2. 洛谷 1373 小a和uim之大逃离

    /* 很容易想到f[i][j][k][l][01] 表示到ij点 两个人得分为kl 01表示这一步谁走的 因为起点不同 路径不同 所以要枚举起点.. 时间复杂度 O(nmk*nmk) 空间复杂度 O( ...

  3. 兼容所有浏览器的JQuery zClip插件实现复制到剪贴板功能

    相信这个功能大家平时上网经常能碰到,以前也没怎么留意怎么实现的,直到项目中需要. 网上一搜一大堆,单纯使用js方法也不是没有,但是由于各浏览器的安全机制不同,不是跨浏览器的.去看了几个常用的网站,都是 ...

  4. Struts2里如何取得request,session,application

    第一种:取得MAP类型的request,session,application在java文件里写 package com.xjtu.st; import java.util.Map; import c ...

  5. (一)SAPI简述

    SAPI,软件中的语音技术包括两方面的内容,一个是语音识别(speech recognition) 和语音合成(speech synthesis).这两个技术都需要语音引擎的支持. 下面我们来了解下基 ...

  6. XCode的一些调试技巧

    XCode 内置GDB,我们可以在命令行中使用 GDB 命令来调试我们的程序.下面将介绍一些常用的命令以及调试技巧. po 命令:为 print object 的缩写,显示对象的文本描述(显示从对象的 ...

  7. 【USACO 2.2.1】序言页码

    [题目描述] 一类书的序言是以罗马数字标页码的.传统罗马数字用单个字母表示特定的数值,以下是标准数字表: I 1 L 50 M 1000 V 5 C 100 X 10 D 500 最多3个同样的可以表 ...

  8. JavaScript-学习一字符串

    字符串可以存储一系列字符,如 "John Doe". 字符串可以是插入到引号中的任何字符.你可以使用单引号或双引号: 用于字符串的 + 运算符 + 运算符用于把文本值或字符串变量加 ...

  9. mybatis 学习笔记(4) —— 批量新增数据

    1.业务是从前台传入List<T> ,在controller层接受参数,并进行批量新增操作. 2.需要处理的细节 a) mybatis可以支持批量新增,注意数据表需要将主键设置成自增列. ...

  10. jvectormap 中国地图 (包括香港、台湾、澳门)

    一个完整的中国地图(各个省,市.还有国两制),谢谢大家. 忘了网上哪位的范例,我加了些修改. <html xmlns="http://www.w3.org/1999/xhtml&quo ...