沒啥用的黑科技——自動生成測試對象信息框架


創作目的

我們平時在寫測試用例的時候,免不了要寫一大堆 set 方法為對象設置屬性。

有時候為了補全測試用例,這件事就會變得非常枯燥。

於是就在想,能不能寫一個可以自動生成測試對象的工具呢?

於是就有了這一個沒啥用的測試框架:

https://github.com/houbb/data-factory

項目簡介

data-factory 項目用於根據對象,隨機自動生成初始化信息。便於測試。

在這里插入圖片描述

特性

  • 8 大基本類型的支持

  • 數組、對象、枚舉、Map、鏈表、Set 等支持

  • String、BigDecimal、BigInteger、Currency 等常見類型的支持

  • Date、LocalDate、LocalDateTime、LocalTime、Year 等常見日期類型支持

  • 支持 Regex 正則表達式

  • @DataFactory 注解支持靈活配置

變更日志

變更日志

快速開始

准備工作

JDK 1.8+

Maven 3.0+

maven 引入

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>data-factory-core</artifactId>
    <version>1.0.0</version>
</dependency>

基本類型

我們通過 DataUtil.build(class) 就可以生成對應類的隨機值。

比如 DataUtil.build(String.class);,就可以生成隨機的字符串:

0s5Z8foS1

對象

當然,最常用的還是初始化一個 java 對象。

public class User {

    private String name;

    private int age;

    private Date birthday;

    private List<String> stringList;

    //S/F 的枚舉
    private StatusEnum statusEnum;

    private Map<String, String> map;
    
    //Getter & Setter
}

構建方法 User user = DataUtil.build(User.class);

構建對象如下:

User{name='wZ8CJZtK', age=-564106861, birthday=Wed Feb 27 22:14:34 CST 2019, stringList=[Du4iJkQj], statusEnum=S, map={yA5yDqM=Kdzi}}

內容每次都隨機,便於基本的測試數據填充。

@DataFactory 注解

當然,有時候我們希望生成的數據符合一定的規則,這個時候可以通過 @DataFactory 注解去進行限制。

詳情見 DataFactory 注解支持

對象定義

public class UserAnnotationNumber {

    @DataFactory(min = 10, max = 20)
    private Byte aByte;

    @DataFactory(min = 10, max = 20)
    private Short aShort;

    @DataFactory(min = 10, max = 20)
    private Integer integer;

    @DataFactory(min = 10, max = 20)
    private Long aLong;

    @DataFactory(min = 10, max = 20, precision = 3)
    private Double aDouble;

    @DataFactory(min = 10, max = 20, precision = 3)
    private Float aFloat;

    @DataFactory(min = 10, max = 20, precision = 3)
    private BigDecimal bigDecimal;

    @DataFactory(min = 10, max = 20)
    private BigInteger bigInteger;
    
    //getter & setter

}

效果

通過 DataUtil.build(UserAnnotationNumber.class) 生成的對象如下:

UserAnnotationNumber{aByte=10, aShort=17, integer=19, aLong=11, aDouble=19.888, aFloat=10.067, bigDecimal=18.035, bigInteger=13}

自定義注解支持

為了更加靈活的指定生成,最大程度的重用自定義策略。

v1.0.0 支持用戶自定義注解。

自定義實現

注解定義

比如指定一個返回固定值的注解。

package com.github.houbb.data.factory.core.annotation;

import com.github.houbb.data.factory.api.annotation.meta.DataMeta;

import java.lang.annotation.*;

/**
 * @author binbin.hou
 * @since 1.0.0
 */
@Inherited
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@DataMeta(value = AtMyStringAnnotationData.class)
public @interface ConstStringData {

    String value() default "";

}

最重要的一點就是 @DataMeta(value = AtMyStringAnnotationData.class);

@DataMeta 是一個最核心的元注解,value 對應的是具體實現。

具體實現

AtMyStringAnnotationData 就是具體的注解實現,如下:

import com.github.houbb.data.factory.api.core.IContext;
import com.github.houbb.data.factory.api.core.meta.IAnnotationData;

public class AtMyStringAnnotationData implements IAnnotationData<ConstStringData> {

    private ConstStringData constStringData;

    @Override
    public void initialize(ConstStringData annotation) {
        constStringData = annotation;
    }

    @Override
    public Object build(IContext context, Class aClass) {
        return constStringData.value();
    }

}

實現對應的 IAnnotationData 接口,initialize 初始化對應的注解信息。

build 構建對應的值。

注解使用

定義好了注解,@ConstStringData 就可以如下使用了:

public class UserDefineAnnotationData {

    @ConstStringData("echo")
    private String name;

    @ConstStringData("game")
    private String hobby;

    // getter & setter

}

測試驗證

UserDefineAnnotationData data = DataUtil.build(UserDefineAnnotationData.class);
assert  data.getName().equals("echo");
assert  data.getHobby().equals("game");

可以驗證數據被初始化為對應的注解指定值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM