`

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详解

    JUnit4 的优势在于它通过注解极大地简化了测试代码,使得测试更加直观和易于理解。不再需要强制性的继承TestCase,这使得测试类可以与其他类更好地解耦。此外,JUnit4 支持参数化测试,允许用不同的参数多次运行同一...

    junit4教程(《Junit4初探》)

    **JUnit4教程——初探单元测试的艺术** JUnit4是Java编程语言中广泛使用的单元测试框架,它是Java开发者进行软件质量保证的重要工具。本教程将深入浅出地介绍JUnit4的基本概念、核心特性以及如何在实际项目中应用它...

    Junit测试详解(ppt,实例,junit4使用)打包下载

    单元测试又称模块测试,是针对软件设计的最小单位 ─ 程序模块(对象),进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。基于面向面向对象我们测试的对象就是类的实例。...

    junit4学习文档

    ### JUnit4 学习知识点详解 #### 一、JUnit4 概述 JUnit4 是 JUnit 测试框架的一个重大更新版本,它充分利用了 Java 5 的注解(Annotation)特性来简化测试用例的编写过程。注解是一种元数据,用于描述程序中的...

    Junit4使用教程详解+源码下载.rar

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了强大的工具来编写可重复执行、可验证的测试代码。本教程将深入讲解JUnit4的使用方法,并附带源码供学习者实践和参考。 一、JUnit4概述 JUnit...

    Junit 3.8 详解(一)

    在提供的压缩包中,"Junit 3.8 详解.exe"可能是一个交互式的教程或者演示程序,它能够帮助用户直观地了解和学习JUnit 3.8的使用。通过运行这个.exe文件,你可以亲自动手实践,加深对JUnit测试的理解。 总的来说,...

    Junit4.zip

    《JUnit4:Java单元测试框架详解》 JUnit4是一款广泛应用于Java编程领域的单元测试框架,它的出现极大地简化了测试代码的编写,提升了测试的效率。本文将深入探讨JUnit4的核心特性、使用方法以及如何将其应用到实际...

    JUnit4.rar(ppt讲义)

    **JUnit4测试框架详解** JUnit 4 是一个广泛使用的Java编程语言的单元测试框架,它在软件开发过程中扮演着至关重要的角色,确保代码的质量和稳定性。这个"PPT讲义"涵盖了JUnit 4的核心概念和使用方法,对于学习和...

    JUnit4使用.pdf

    ### JUnit4 使用详解 #### 一、JUnit简介与单元测试概念 JUnit 是一个用于 Java 程序的单元测试框架,它可以帮助开发者确保代码的质量和稳定性。单元测试是一种编程方法,通过这种方式开发者可以在开发过程中编写...

    JUnit4学习方法

    ### JUnit4学习方法 #### 一、简介与背景 JUnit4是一款广泛应用于Java开发环境下的单元测试框架,它提供了一套简洁而强大的API来帮助开发者编写自动化测试代码。JUnit4相较于之前的版本,在语法和功能上都有显著...

    surefire-junit4-2.7.2-javadoc.jar

    《深入解析Surefire与JUnit4的整合:2.7.2版API文档详解》 在Java测试领域,Surefire和JUnit4是两个不可或缺的重要工具。Surefire是Maven项目中的一个插件,主要负责执行JUnit和其他兼容的测试框架的测试用例。...

    ant-junit4.jar.zip

    《Ant与JUnit4结合使用详解》 在Java开发过程中,自动化构建工具Ant和单元测试框架JUnit4是不可或缺的两个部分。Ant-junit4.jar.zip是一个包含Ant和JUnit4相关依赖的压缩包,它使得开发者能够方便地在Ant构建环境中...

    junit4入门

    《Junit4 入门详解》 JUnit 是一个用于Java编程语言的单元测试框架,而Junit4作为其第四代版本,引入了许多新特性和改进,使得测试代码更加简洁、可读性强,大大提升了测试效率。这篇教程将带你走进Junit4的世界,...

    浪曦][原创]Junit.3.8.详解续二.rar

    4. **测试套件(Test Suites)**:通过`@Suite`注解(Junit 4引入),可以将多个测试类组合成一个测试套件,但在Junit 3.8中,我们需要手动创建一个测试类来包含其他测试类。 5. **异常测试**:可以使用`try-catch-...

    JUnit4单元测试入门详解.pdf

    JUnit 4是该框架的一个重要版本,它利用Java 5的注解(Annotation)特性极大地简化了测试用例的编写过程。 在介绍JUnit 4之前,我们先来看一下JUnit 3的测试用例编写方式。在JUnit 3中,单元测试的编写需要遵循一定...

    Junit 类包详解

    ### Junit 类包详解 #### Package framework Junit框架的核心包`junit.framework`包含了进行单元测试所需的多个关键类和接口。以下是对该包中重要类及接口的深入解析。 ##### Interface Test - **功能**: `Test`...

    对JUnit的一点简单讲解包括一点简单的Android JUnit的讲解

    AndroidJUnit4引入了`@RunWith(AndroidJUnit4.class)`,这使得我们可以使用JUnit4的特性,同时利用Android的测试环境。例如,`@UiThreadTest`注解用于表示该测试必须在主线程运行,而`@SmallTest`, `@MediumTest`, ...

    junit4初探1.0.pdf

    ### JUnit4初探知识点详解 #### 一、JUnit4入门实例 **1. 实例环境** 本章节主要介绍了JUnit4入门级别的环境搭建步骤。为了能够顺利进行JUnit4的实践,首先需要确保开发环境配置正确。 - **环境**: 使用的是...

Global site tag (gtag.js) - Google Analytics