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

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

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

时间: 2024-10-10 10:41:24

【转】TestNG 与 Junit的比较的相关文章

TestNG运行JUnit测试

现在,您已经了解了TestNG和它的各种测试,如果现在担心如何重构现有的JUnit代码,那就没有必要,使用TestNG提供了一种方法,从JUnit和TestNG按照自己的节奏.也可以使用TestNG执行现有JUnit测试用例.TestNG可以自动识别和运行JUnit测试,所以你可以使用TestNG运行所有的测试,并编写新的测试使用TestNG.所有你必须做的就是把JUnit的库TestNG的类路径上,它可以发现并使用JUnit类,改变测试运行从JUnit和TestNG Ant中,然后运行Test

JUnit 4 与 TestNG 对比

原文出处: 付学良的网志 原文出处2: http://www.importnew.com/16270.html -------------------------------------------- Junit 4 和 TestNG 都是 Java 方面非常流行的单元测试框架.在功能上两个框架都非常类似.到底哪个比较好?在Java项目中我们应该选择哪个框架? 下图将会对Junit 4 和 TestNG 做个功能特征的对比. 注解支持 Junit 4 和 TestNG 在注解方面的实现非常相似.

Java Unit Testing - JUnit &amp; TestNG

转自https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaUnitTesting.html yet another insignificant programming notes...   |   HOME TABLE OF CONTENTS (SHOW) Java Unit Testing -  & TestNG 1.  Introduction to Unit Testing Framework The various type o

TestNG 入门教程

原文出处:http://www.cnblogs.com/TankXiao/p/3888070.html 阅读目录 TestNG介绍 在Eclipse中在线安装TestNG 在Eclipse中离线安装Testng TestNG最简单的测试 TestNG的基本注解 TestNG中如何执行测试 使用testtng.xml 文件执行 case TestNG按顺序执行Case TestNG异常测试 TestNG组测试 TestNG参数化测试 TestNG忽略测试 TestNG 依赖测试 TestNG测试结

TestNG 入门教程&lt;Java 入门&gt;

TestNG 入门教程 摘要:http://www.cnblogs.com/TankXiao/p/3888070.html 国庆7天假期,大部分朋友都出去旅游了,微信圈里全是晒旅游的照片, 东南亚游,欧洲游呀,真是羡慕呀. 悲惨的我只去了上海野生动物园, 在家休息,利用这段假期,把之前学过的东西都总结下. 我前段时间加班太多了,每天忙碌工作,都没精力去管自己的学习新技能的计划, 博客也没写几篇,很多想做的事情都因为工作太忙而耽搁了. 所以工作太忙了也不好,没有精力关注工作以外的事情. 最近写自动

测试工作——TestNG

阅读目录 TestNG介绍 在Eclipse 中安装TestNG插件 TestNG最简单的测试 TestNG的基本注解 TestNG中如何执行测试 TestNG中按顺序执行Case TestNG异常测试 TestNG组测试 TestNG参数化测试 TestNG忽略测试 TestNG 依赖测试 TestNG测试报告 TestNG介绍 TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit,   功能都差不多, 只是功能更加强大,使用也更方便 Java中已经有一个JUnit的测试框

Java Junit测试框架

Java    Junit测试框架 1.相关概念 ? JUnit:是一个开发源代码的Java测试框架,用于编写和运行可重复的测试.它是用于单元测试框架体系xUnit的一个实例(用于java语言).主要用于白盒测试,回归测试. ? 白盒测试:把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人 员是公开的. ? 回归测试:软件或环境的修复或更正后的再测试,自动测试工具对这类测试尤其有用. ? 单元测试:最小粒度的测试,以测试某个功能或代码块.一般由程序员来做,因为它需要知道内部程序设

TestNg学习一

简介 TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit,   功能都差不多, 只是功能更加强大,使用也更方便 Java中已经有一个JUnit的测试框架了.  TestNG比JUnit功能强大的多.  测试人员一般用TestNG来写自动化测试.  开发人员一般用JUnit写单元测试. 官方网站: http://testng.org/doc/index.html 安装 一.在线安装 打开Eclipse   Help ->Install New Software ,   然后A

WebDriver + TestNG 应用【转】

出自:http://magustest.com/blog/automationtesting/webdriver-testng/ Selenium 2 已经发布了一个多月,官方版本已经到了Selenium 2.3,并且在Google code里面可以找到2.4的下载.Selenium 2 最大的更新就是集成了WebDriver.这两者是什么关系呢?如果你搜索WebDriver,第一条结果是Selenium.其实WebDriver和Selenium可以说是在实现UI Automation的竞争对手