`

Junit4使用汇总(五)suite

 
阅读更多

一、Suite测试

进行Suite测试可以将多个待测试的类,打包(Suite)一起测试。在入口测试类上加两个注释:

@RunWith(Suite.class)
@SuiteClasses(TestClass1.class, ...)

当你运行这个入口测试类,框架就会把打包在一起的所有待测试类都测试一遍。

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

@RunWith(Suite.class)
@Suite.SuiteClasses({
    TestFeatureLogin.class,
    TestFeatureLogout.class,
    TestFeatureNavigate.class,
    TestFeatureUpdate.class
})

public class FeatureTestSuite {
  // the class remains empty,
  // used only as a holder for the above annotations
}

框架运行那些待测试的类,是按他们在@Suite.SuiteClasses中罗列的顺序开始测试。

二、Parameterized测试

很多时候,需要用很多测试数据进行多次测试。怎么办?通过复制粘贴代码来实现?累...

针对这种情况,JUnit4框架提供Parameterized测试器(Runner)来实现这种需求。

看下面这个例子:

package mytest;

import static org.junit.Assert.*;

import java.util.Arrays;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class FibonacciTest {
    @Parameters
    public static Iterable<Object[]> data() {
        return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
                { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
    }

    private int fInput;

    private int fExpected;

    public FibonacciTest(int input, int expected) {
        fInput= input;
        fExpected= expected;
    }
    @Test
    public void test() {
        assertEquals(fExpected, Fibonacci.compute(fInput));
    }
}

很简单,很方便是吧!

  1. @Parameters来标记,我们为测试准备的数据
  2. 定义一个构造函数,构造函数的参数顺序和准备数据的顺序一致
  3. 写你需要的测试方法,用@Test注释
  4. 运行起来,每个数据都会测试一遍

如果,你不习惯去写那样一个构造函数,也可以用下面的方法:

@RunWith(Parameterized.class)
public class FibonacciTest {
    @Parameters
    public static Iterable<Object[]> data() {
        return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 2 },
                { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
    }

    @Parameter(0)
    public int fInput;

    @Parameter(1)
    public int fExpected;

    @Test
    public void test() {
        assertEquals(fExpected, Fibonacci.compute(fInput));
    }
}

运行起来是不是很爽!

可能,你是一个完美主义者,对运行后报错信息不是很满意,现在报错时反馈的信息可能是这样:

test[3](mytest.FibonacciTest): expected:<2> but was:<0>

你想报错时显示测试的输入数据,希望报错类似如下:

test[the 3 test, input:3,2](mytest.FibonacciTest): expected:<2> but was:<0>

要实现这点很简单,给@Parameters加个参数name,整个代码如下:

package mytest;

import static org.junit.Assert.*;

import java.util.Arrays;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class FibonacciTest {
    @Parameters(name="the {index} test, input:{0},{1}")
    public static Iterable<Object[]> data() {
        return Arrays.asList(new Object[][] { { 0, 0 }, { 1, 1 }, { 2, 1 },
                { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });
    }

    private int fInput;

    private int fExpected;

    public FibonacciTest(int input, int expected) {
        fInput= input;
        fExpected= expected;
    }
    @Test
    public void test() {
        assertEquals(fExpected, Fibonacci.compute(fInput));
    }
}

在这里需要稍微解释一下name中的几个参数的含义:

{index} 表示序号,测试数据在整个数据列表中的序号
{0} 表示第一个参数
{1} 表示第二个参数
...
{n} 表示第n+1个参数

三、Categories测试

一个测试类里面包含很多待测试的方法,很多时候,我们需要把这些待测试的方法分类,某些时候测试某类方法,那么需要怎么做呢?

看下面这个例子:

public interface FastTests { /* category marker */ }
public interface SlowTests { /* category marker */ }

public class A {
  @Test
  public void a() {
    fail();
  }

  @Category(SlowTests.class)
  @Test
  public void b() {
  }
}

@Category({SlowTests.class, FastTests.class})
public class B {
  @Test
  public void c() {

  }
}

@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@SuiteClasses( { A.class, B.class }) // Note that Categories is a kind of Suite
public class SlowTestSuite {
  // Will run A.b and B.c, but not A.a
}

在上面的例子中,将会测试A.bB.c两个方法,不会测试A.a

再看下面:

@RunWith(Categories.class)
@IncludeCategory(SlowTests.class)
@ExcludeCategory(FastTests.class)
@SuiteClasses( { A.class, B.class }) // Note that Categories is a kind of Suite
public class SlowTestSuite {
  // Will run A.b, but not A.a or B.c
}

这次,只会运行A.b,而不会运行A.aB.c

四、Theories测试

     一些理论测试。

先看例子:

@RunWith(Theories.class)
public class UserTest {
    @DataPoint
    public static String GOOD_USERNAME = "optimus";
    @DataPoint
    public static String USERNAME_WITH_SLASH = "optimus/prime";

    @Theory
    public void filenameIncludesUsername(String username) {
        assumeThat(username, not(containsString("/")));
        assertThat(new User(username).configFileName(), containsString(username));
    }
}

是不是看得有点苦涩难懂,没关系,我来给你一一讲解:

  1. @RunWith(Theories.class) 是告诉框架,下面的测试类将要做理论测试;
  2. @DataPoint 告诉框架,标注的这些数据都是准备用来测试的数据;
  3. @Theory标注的方法,是需要进行理论测试的方法;
  4. assumeThat 是对待测试的数据(@DataPoint标注的数据)进行检查,符合的数据继续往下走,不符合的数据忽略掉.如果,所有的数据都不符合,那么@Theory标注的测试,则算失败(fail)。
分享到:
评论

相关推荐

    Junit4使用方法

    JUnit4 使用方法 JUnit4 是一个流行的 Java 单元测试框架,提供了许多功能强大且灵活的测试工具。本文将详细介绍 JUnit4 的使用方法和核心概念。 JUnit4 核心概念 JUnit4 的核心概念包括测试类、测试集和测试运行...

    junit4教程(《Junit4初探》)

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

    junit eclipse testcast Testsuite

    总结,理解并熟练使用JUnit和Eclipse Testcast Testsuite是提升开发质量的重要途径。无论是从源码中学习它们的设计理念,还是通过文档掌握使用技巧,都能使我们在测试工作中更加得心应手。通过不断的实践和学习,...

    junit4测试jar包

    JUnit4测试框架是Java开发中广泛使用的单元测试工具,它为开发者提供了编写和运行可重复、可靠的测试用例的能力。这个“junit4测试jar包”包含了一切你需要在项目中集成JUnit4进行测试的库文件。只需将其复制到你的...

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

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

    junit4 jar包

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了编写可重复执行、易于维护的测试代码的能力。这个“junit4 jar包”包含了运行JUnit4测试所必需的库文件,主要包括两个核心组件:`junit-4.11....

    JUnit4JUnit4JUnit4(文档)

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了强大的工具来编写、组织和执行单元测试。JUnit4引入了许多改进和新特性,极大地提升了测试的灵活性和效率。下面将详细介绍JUnit4的关键概念、...

    JUNIT4使用手册

    ### JUNIT4 使用手册 #### 一、Junit 介绍 Junit 是一款非常流行的单元测试框架,由 Erich Gamma 和 Kent Beck 共同开发。它最初是在 Java 平台上实现的,作为 xUnit 系列框架的一个成员,广泛应用于各种编程语言...

    JUnit4使用.pdf

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

    junit4 jar完整包

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了一种方便、高效的方式来验证代码的正确性。这个“junit4 jar完整包”包含了所有你需要进行单元测试的类和接口,使得测试过程变得简单且易于...

    junit4学习文档

    下面是一个使用 JUnit4 编写的测试类示例: ```java import org.junit.*; public class AddOperationTest { @Before public void setUp() throws Exception { // 初始化代码 } @After public void ...

    Junit4教程非常详尽

    五、JUnit4 的应用场景 JUnit4 可以应用于各种 Java 项目的测试中,包括单元测试、集成测试、功能测试等。使用 JUnit4 可以简化测试用例的编写,提高测试效率和质量。 六、结论 JUnit4 是 JUnit 框架有史以来的...

    JUnit4使用简单教程

    eclipse上通过一个简单例子演示使用JUnit4进行测试

    在Eclipse中使用JUnit4进行单元测试

    在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...

    Junit4完整源码

    JUnit4 是一个广泛使用的Java编程语言的单元测试框架。它为开发者提供了一种方便的方式来编写和执行可重复的、自动化的测试用例,确保代码的质量和功能稳定性。JUnit4源码的完整版本包含了整个框架的实现细节,对于...

    JUnit4基础文档

    本文档介绍了JUnit4的基础知识,包括单元测试的概念、JUnit4的HelloWorld示例、断言机制、注解使用、测试运行方式等。 单元测试的概念 单元测试是指对软件的最小单元进行测试,以确保其正确性和可靠性。单元测试...

    在eclipse中使用junit4教程

    jUnit4 在 Eclipse 中的使用教程 jUnit4 是 JUnit 框架有史以来的最大改进,其主要目标便是利用 Java5 的 Annotation 特性简化测试用例的编写。 Annotation 是一种元数据,描述数据的数据。在 Java 里面可以用来和 ...

    junit4 jar包 Java单元测试框架绿色免费版.zip

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了一种方便、高效的方式来验证代码的正确性。这个“junit4 jar包 Java单元测试框架绿色免费版.zip”文件包含的是JUnit4框架的可执行jar包,用于...

    Junit4.zip

    此外,JUnit4支持使用`@RunWith`注解来指定运行器(Runner),比如`Parameterized`运行器用于执行参数化测试,`Suite`运行器可以组合多个测试类进行批量执行。 在实际项目中,我们通常会配合Maven或Gradle等构建...

Global site tag (gtag.js) - Google Analytics