Testng与Junit区别【转载】

转自 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的小组成员之一)。

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

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

JDK 5 Annotations

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

  1.     灵活的test configuration
    

先看一下Junit的执行顺序
Setup( ) test1( ) tearDown( ) Setup( ) test2( ) tearDown( )…………

下面是TestNG的

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

  1.     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这样灵活的配置才能达到。

  1.     分组
    

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

@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的。

  1.     参数
    

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

(1) 使用Parameter参数

@Parameters({ "first-name" })         
 @Test        
 public void testSingleString(String firstName) {         
          System.out.print("InvokedtestString+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维数组的对象,什么数据都可以提供了吧,而且可以让你的测试方法执行多次。而且最重要的是和测试方法写在一起,所见即所得。

  1.     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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 感谢原作者的奉献,原作者博客地址:http://blog.csdn.net/zhu_ai_xin_520/arti...
    狼孩阅读 14,030评论 1 35
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,778评论 6 342
  • JUnit 4和TestNG都是Java中非常受欢迎的单元测试框架。两种框架在功能上看起来非常相似。 哪一个更好?...
    易百教程阅读 4,990评论 2 6
  • 今天是猴年的正月初一,凌晨四点半出发去霞浦的北岐滩涂等待日出。其实北岐距离县城只有6km左右,之所以走这么早是因为...
    柬东来阅读 3,575评论 0 0