如何使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试 - JAVA - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > OOP语言 > JAVA > 正文

如何使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试

来源: www.bianceng.cn 阅读:

Feed4JUnit 与 JUnit

经常,在应用程序的业务逻辑中存在大量的这样的接口:他们接受不同的输入,然后进行 或验证,或处理,进而完成相同的流程。比如网站的登录入口,用户名和密码都有长度的限制,同时也具有是否允许特殊字 符的限制等,所以在我们进行其单元测试的过程中,根据不同长度的用户名和密码,以及不同的字符组合,只需要提供相同 的测试代码结构,就能完成测试,不同的仅仅测试数据与期望值,但是因为每一个测试方法中的输入参数不同,我们必须为 每一个输入组编写单独的测试用例,从而产生大量冗余代码,十分不便于维护。

基于以上场景,JUnit 4 提供了参 数化的特性,从而能够实现不同数据输入对相同测试代码的测试,如清单 1 所示:

清单 1. JUnit 4 参数化测试代 码示例

package sample.test;
    
import static org.junit.Assert.assertEquals;
    
import java.util.Arrays;
import java.util.Collection;
    
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
    
import sample.code.UserAccess;
    
/*
 * JUnit - Parameter test sample
 */
@RunWith(Parameterized.class)
public class JunitSample {
    
    private String user;
    private String pw;
    private boolean expected;
    
    @Parameters
    public static Collection dataGenerater() {
        return Arrays.asList(new Object[][] { 
                { "user01", "123456", true },
                { "helloworld", "123456", false },
                { "david", "re*ads", false }, 
                { "goodone", "onegood", true } });
    }
    
    public JunitSample(String user, String pw, boolean expected) {
        this.user = user;
        this.pw = pw;
        this.expected = expected;
    }
    
    @Test
    public void testAccessCheck() {
        assertEquals(expected, UserAccess.accessCheck(user, pw));
    }
}

通过以上示例代码可以看出,JUnit 4 通过使用一个标记 @Parameters 注释的返回类型为 Collection 的静态 方法产生数据,测试数据通过变量传递给测试方法,从而完成多数据输入的测试。但是随着业务的需要,测试人员需要经常 增加测试数据与修改现有测试数据,JUnit 4 提供的硬编码方式已经愈显笨重和不便,数据与代码分离显得尤为重要。

幸好,本文所述的 Feed4JUnit 良好的解决了数据与代码分离的问题,Feed4JUnit 是 JUnit 测试框架的扩展,它 通过操作来自于文件以及不同的数据源的测试数据,使您的单元测试变得更容易编写与维护。

本文将通过示例向您 展示 Feed4JUnit 的安装以及测试代码与数据分离的实现,请注意本文的示例代码全部基于针对如下一个十分简单用户登录 检验的类,并且假定您正在使用 Eclipse 作为您的 IDE,请看清单 2 类代码:

清单 2. 实例类

package 

sample.code;
    
public class UserAccess {
    // simple validation for user name and password
    public static boolean accessCheck(String userName, String password) {
        if (userName.length() <= 4 || userName.length() > 8)
            return false;
        if (password.length() <= 4 || password.length() > 8)
            return false;
        if (userName.contains("@"))
            return false;
        if (password.contains("*"))
            return false;
        return true;
    }
}

Tags:
相关文章列表: