junit4 概述1

转载 2013年12月04日 18:01:00

JUnit4 详解           

博客分类:   Test

标准的Junit4流程及实现
我们先看一个标准的Junit4的运行流程,大致如下:
测试类实例化->运行@BeforeClass->运行@Before->运行@Test->运行@After->运行@AfterClass,
下面的代码输出明确表明了其运行流程,初学者可运行查看其结果输出。
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class Junit4Sample {
@BeforeClass
public static void beforeClass(){
System.out.println("BeforeClass,to be run once before any of the test methods in the class");
}

@Before
public void before(){
System.out.println("Before,to be run before the {@link org.junit.Test} method");
}

@Test
public void testA(){
System.out.println("Test,can be run as a test case");
}

@Test
public void testB(){
System.out.println("Test,can be run as a test case");
}

@After
public void after(){
System.out.println("After,to be run after the {@link org.junit.Test} method");
}

@AfterClass
public static void afterClass(){
System.out.println("AfterClass,to be run after all the tests in the class have been run");
}
}


这样的流程是怎么实现的呢?也就说Junit4.5+版本是如何处理这些Annotation并赋予了他们神奇的魔力的?请看大屏幕:

上图略去了其他次要方法,总之run方法还是入口,绕了一大圈后会调用with打头的方法处理流程中的@Before、@After等Annotation。

值得注意的是每个这样的方法都会有个Statement参数,封装了前一个流程中的Statement,其返回者也是个Statement供下个流程节点调用,就像个管道,Statement在管道里流啊流,管道里有一些点对流经的Statement进行特定处理。

通常情况下,Junit提供的Annotation已经很能满足需求了,这些注解其实就是对公用代码的一种抽象,比如要在每个测试用例方法执行前要执行一段代码就把他们提取出来为单独的方法并用@Before注解即可。可是,当有些问题很普遍很通用时懒人们不想在程序里写这样的Before方法了,比如配置文件的加载,测试前置数据装载等。

于是,就出现了更多的自定义的Annotation,怎么把这些自定义的Annotation功能嵌入到Junit的标准流程中呢?

 

 

=============================================================================

JUnit为我们在项目测试中常用到的单元测试框架,很多程序员的理想套件,本篇文章主要介绍JUnit4的常见annotation.

一、初始化标注

在老Junit4提供了setUp()和tearDown(),在每个测试函数调用之前/后都会调用。

@Before: Method annotated with @Before executes before every test.
@After:    Method annotated with @After executes after every test.

 

如果在测试之前有些工作我们只想做一次,用不着每个函数之前都做一次。比如读一个很大的文件。那就用下面两个来标注:

@BeforeClass
@AfterClass

注意:

@Before/@After 可以有多个; @BeforeClass/@AfterClass  只有一个

如果我们预计有Exception,那就给@Test加参数:

@Test(expected = XXXException.class)

 

如果出现死循环怎么办?这时timeout参数就有用了:

@Test(timeout = 1000)

 

如果我们暂时不用测试一个用例,我们不需要删除或都注释掉。只要改成:

@Ignore

你也可以说明一下原因@Ignore("something  happens")

 

二、运行原理:

JUnit运行时都是由一个runner运行的。你可以根据需要选择不同的Runner来运行你的测试代码。指定一个Runner,需要使用@RunWith标注,并且把你所指定的Runner作为参数传递给它。系统自动使用默认Runner  TestClassRunner来运行你的代码。如下:

@RunWith(TestClassRunner.class)

public class JavaTest { …… }

 

JUnit4提出了"参数化测试"的概念,只写一个测试函数,把这若干种情况作为参数传递进去,一次性的完成测试。代码如下:

 

@RunWith(Parameterized.class)
public class JavaTest {
private int  param;
private int param2;
private int result;

 @Parameters public static Collection data() {
return  Arrays.asList(new Object[][]{ { 2, 4, 6 }, { 0, 0, 0 }, { -3, 9, 6 }  });
}

 // 构造函数,对变量进行初始化
public JavaTest(int param, int param2, int  result) {
this.param = param;
this.param2 = param2;
this.result =  result;
}

@Test public void run() {
//do some thing use args, and  assert it
int expected = param + param2;
assertEquals(expected,  result);
}
@Ignore("lala") public void lala()  {
assertEquals(3,3);
}
} 


首先,你要为这种测试专门生成一个新的类,为这个类指定一个Runner,特殊的功能要用特殊的Runner:@RunWith(Parameterized.class) 
第二步,定义测试数据的集合,也就是上述的data()方法,该方法可以任意命名,但是必须使用@Parameters标注进行修饰。这是一个二维数组,每组数据产生一个测试Instance.
第三步,构造函数,取得传过来的参数。
最后,用取得的参数做测试。@Test  public void …

 

三、打包测试:

采取分而治之的方法,我们可以写多个类来降低测试难度。我们有时也希望一次把所有测试跑一遍,这时我们写一个打包类

import junit.framework.JUnit4TestAdapter;
import  org.junit.runner.RunWith;
import org.junit.runners.Suite;

 

@RunWith(Suite.class)
@Suite.SuiteClasses({
JavaTest.class,
JustDo.class
})
public  class TestAll {
}

 

四、多线程测试

       JUnit4的Test写好以后,对于一些集成度比较高的测试用例,还希望完成并发访问情况下的测试,但是,JUnit4缺省情况没有提供,我希望通过自己写一个main函数,然后创建几个线程,在几个线程中同时运行测试用例进行测试,来模拟并发访问的情况,下里为具体例子:

public class TestExample  {

@Test
public void testMethod() {
System.out.println("test  success!");
}
}

public class PerfomanceTest {

public static  void main(String[] args) {
new Thread() {public void run() {

// JUnitCore.runClasses(new Class[] {  TestExample.class  });            (1)
// new  JUnitCore().run(Request.method(TestExample.class,  "testMethod"));        (2)
}}.start();
}
}

注:标志1或标志2中只要用一种就可以测试。

到这里,我们就可以使用JUnit4来开发我们自己的测试了。

Junit4概述

接触到ssh之后,发现单元测试使用Junit4会很犀利,学之,感谢百度文库的分享 JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用...
  • xuxurui007
  • xuxurui007
  • 2013年03月21日 18:17
  • 596

JUnit4 概述

JUnit4概述     JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。 先简单解释一下什么是Annotatio...
  • whs19910204648688
  • whs19910204648688
  • 2013年08月16日 09:59
  • 549

junit4 概述

JUnit4概述     JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。 先简单解释一下什么是Annotatio...
  • ETTTTTSS
  • ETTTTTSS
  • 2013年12月04日 18:00
  • 563

JUnit4概述

JUnit4概述     JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。 先简单解释一下什么是A...
  • wang_jing_2008
  • wang_jing_2008
  • 2013年11月07日 15:37
  • 397

redis概述(一)

什么是NoSql? 为了解决高并发、高可用、高可扩展,大数据存储等一系列问题而产生的数据库解决方案,就是NoSql。 NoSql,叫非关系型数据库,它的全名Not only sql。它不能替代关系...
  • weixin_38429587
  • weixin_38429587
  • 2018年01月05日 13:34
  • 53

JUnit4概述 【转】

http://www.cnblogs.com/eggbucket/archive/2012/02/02/2335697.html JUnit4是JUnit框架有史以来的最大改进,其主要目...
  • sirnuo
  • sirnuo
  • 2013年04月23日 10:57
  • 496

Delphi历史版本介绍(一)从Delphi1到Delphi7

Delphi历史版本介绍(一)从Delphi1到Delphi7        Pascal是一种计算机通用的高级程序设计语言。它由瑞士Niklaus Wirth教授于六十年代末设计并创立.      ...
  • shuaihj
  • shuaihj
  • 2013年02月28日 16:31
  • 2967

JUnit4 简介

JUnit4是一个易学易用的Java单元测试框架,使用非常广泛。现阶段的最新版本号是4.12,JUnit5目前正在测试中,所以这里还是以JUnit4为准。引入JUnit现在主流的IDE比如IDEA或者...
  • u011054333
  • u011054333
  • 2017年01月15日 23:30
  • 393

JUnit4框架代码解析

JUnit4的代码到底是怎么实现的。
  • michaellufhl
  • michaellufhl
  • 2010年11月19日 22:39
  • 8800

Junit 4 Tutorials(Junit 4 教程) 四、Junit4 参数化测试

Junit 4 参数化测试 允许通过变化范围的参数值来测试方法。参数擦测试可以通过以下简单的步骤实现: 对测试类添加注解 @RunWith(Parameterized.class) ...
  • u010349169
  • u010349169
  • 2014年07月08日 16:59
  • 4616
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:junit4 概述1
举报原因:
原因补充:

(最多只允许输入30个字)