`
longgangbai
  • 浏览: 7330253 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Feed4Junit的简单使用(四)数据来自定义数据源

阅读更多

Feed4Junit官方地址:

http://databene.org/feed4junit.html

 

Feed4Junit自动生成测试数据:

Feed4JUnit 1.1.1 发布了,该版本支持从 CSV 文件中导入完整的 JavaBean 图表。

利用Feed4JUnit能够很方便用随机但校验过的数据执行冒烟测试来提高代码 代码覆盖率和发现由非常特殊的数据结构产生的Bug。此外还可以利用Feed4JUnit轻松定义等价类测试。

 

官方文档

Defining custom data sources

If you wish to retrieve data from other data source or file types, you can program a connector component, that inherits from the class Feed4JUnitGenerator and provides data:

public static class MyGenerator extends UnsafeMethodParamsGenerator {

        public Object[] generate() {
            return new Object[] { 1, 2, 3 };
        }

} 

The Object array returned by the generate() method is used as parameter list for the invocation of the test method. If the data available from a source is depleted (eg. the end of file is reached), the generator class returns null.

The example class MyGenerator returns { 1, 2, 3 } on each invocation, thus it would be called endlessly, unless you annotate the related test methods with an @InvocationCount for limiting the data volume.

A custom generator class is declared by a @Bean annotation with an id and instructions how to instantiate and initialize the bean object. A @Source annotation at a method referes to its id:

@RunWith(Feeder.class)
@Bean(id = "mygen", type = MyGenerator.class)
public class BeanSourceTest {
    
    @Test
    @Source("mygen")
    @InvocationCount(5)
    public void testArrayIterable(int n1, int n2, int n3) {
        System.out.println(n1 + ", " + n2 + ", " + n3);
    }
    
} 

In this case, the type specification tell Feed4JUnit to instantiate an object of the class MyGenerator by its default constructor.

Alternatively, you can make use of Benerator's full feature set regarding bean instantiation, eg. calling a constructor:

@Bean(id = "mygen", spec = "new MyOtherGenerator(1, 'test')") 

or using a bean property contructor: 

@Bean(id = "mygen", spec = "new MyOtherGenerator{ property1=1, property2 = 'test'}") 

or the more bean-like approach:

@Bean(id = "mygen", type = "MyOtherGenerator", properties = {
    @Property(name = "property1", value = "1"),
    @Property(name = "property2", value="test")
})

 备注:官方文档错误方法这种方式: type = "MyOtherGenerator", 是错误的,不需 type = MyOtherGenerator.class是正确, 

 

 

最简单的数据源生成器:

package com.easyway.feed4junit;

import org.databene.benerator.util.UnsafeMethodParamsGenerator;
import org.databene.benerator.wrapper.ProductWrapper;

/**
 * 
 * @author longgangbai
 *
 */
public class MyGenerator extends UnsafeMethodParamsGenerator  {

	@Override
	public ProductWrapper<Object[]> generate(
			ProductWrapper<Object[]> paramProductWrapper) {
		return paramProductWrapper.wrap(generate());
	}

	 public Object[] generate() {
         return new Object[] { 1, 2, 3 };
     }
	


} 

 

测试代码:

package com.easyway.feed4junit;

import org.databene.benerator.anno.Bean;
import org.databene.benerator.anno.InvocationCount;
import org.databene.benerator.anno.Source;
import org.databene.feed4junit.Feeder;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(Feeder.class)
@Bean(id = "mygen", type = MyGenerator.class)
public class BeanSourceTest {
    
    @Test
    @Source("mygen")
    @InvocationCount(5)
    public void testArrayIterable(int n1, int n2, int n3) {
        System.out.println(n1 + ", " + n2 + ", " + n3);
    }
    
} 

 

需要参数的数据源生成器:

package com.easyway.feed4junit;

import org.databene.benerator.util.UnsafeMethodParamsGenerator;
import org.databene.benerator.wrapper.ProductWrapper;

/**
 * 构造函数传参可以不需要get/set方法
 * @author longgangbai
 *
 */
public class MyOtherGenerator extends UnsafeMethodParamsGenerator  {

	private int num;
	private String test;
	
	public MyOtherGenerator(int num,String test){
		this.num=num;
		this.test=test;
	}
	@Override
	public ProductWrapper<Object[]> generate(
			ProductWrapper<Object[]> paramProductWrapper) {
		return paramProductWrapper.wrap(generate());
	}

	 public Object[] generate() {
         return new Object[] { 1, 2, 3 };
     }
	


} 

 

测试代码如下:

 

package com.easyway.feed4junit;

import org.databene.benerator.anno.Bean;
import org.databene.benerator.anno.InvocationCount;
import org.databene.benerator.anno.Source;
import org.databene.feed4junit.Feeder;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(Feeder.class)
@Bean(id = "mygen", spec = "new com.easyway.feed4junit.MyOtherGenerator(1, 'test')") 
public class BeanSourceConstructTest1 {
    
    @Test
    @Source("mygen")
    @InvocationCount(5)
    public void testArrayIterable(int n1, int n2, int n3) {
        System.out.println(n1 + ", " + n2 + ", " + n3);
    }
    
} 

 

不带构造函数的且带属性的

package com.easyway.feed4junit;

import org.databene.benerator.util.UnsafeMethodParamsGenerator;
import org.databene.benerator.wrapper.ProductWrapper;
/**
 * 非构造函数传参可以必须需要get/set方法
 * UnsafeMethodParamsGenerator
 * @author longgangbai
 *
 */
public class MyOtherGenerator2 extends UnsafeMethodParamsGenerator  {

	private int num;
	private String test;
	
	public MyOtherGenerator2(){
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getTest() {
		return test;
	}
	public void setTest(String test) {
		this.test = test;
	}
	@Override
	public ProductWrapper<Object[]> generate(
			ProductWrapper<Object[]> paramProductWrapper) {
		return paramProductWrapper.wrap(generate());
	}

	 public Object[] generate() {
         return new Object[] { 1, 2, 3 };
     }
	


} 

 

测试类:

package com.easyway.feed4junit;

import org.databene.benerator.anno.Bean;
import org.databene.benerator.anno.InvocationCount;
import org.databene.benerator.anno.Property;
import org.databene.benerator.anno.Source;
import org.databene.feed4junit.Feeder;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(Feeder.class)
@Bean(id = "mygen", type = MyOtherGenerator2.class, properties = {
    @Property(name = "num", value = "1"),
    @Property(name = "test", value="test")
})
public class BeanSourceConstructTest3 {
    
    @Test
    @Source("mygen")
    @InvocationCount(5)
    public void testArrayIterable(int n1, int n2, int n3) {
        System.out.println(n1 + ", " + n2 + ", " + n3);
    }
    
} 

 

分享到:
评论

相关推荐

    Freed4junit案例

    首先,我们需要在测试类中引入`Feed4JUnit`的相关依赖,并定义一个`@TestSource`注解,指定数据源的位置。数据源可以是文件路径,也可以是URL或者数据库查询。 接着,我们创建一个`TestData`类,用于解析和表示测试...

    feed4testng

    源代码分析还能让我们了解feed4testng是如何处理测试数据的,例如是否支持XML配置文件导入,或者是否提供了自定义数据提供器。 "feed4testng-1.0"这个文件名可能是指该版本是feed4testng的第一个正式发布版本,通常...

    Android RSS管理器

    4. **数据模型**:定义RSS feed相关的数据模型类,如`Feed`,`Item`等,用于存储从XML解析出来的信息,如标题、描述、链接等。 5. **数据库存储**:为了离线访问和缓存RSS内容,可以使用SQLite数据库存储RSS feed。...

    简单新闻客户端

    数据源可以是公开的API,如News API或RSS feed。 4. **RecyclerView与Adapter** 展示新闻列表通常用到RecyclerView,它是一个高效的列表视图,可以处理大量数据。开发者需要创建一个适配器(Adapter),将数据模型...

    cpppro-android_rss_reader

    8. **数据持久化**:为了保存用户的订阅和阅读状态,项目可能使用SQLite数据库来存储RSS源信息和已读状态,以便下次启动应用时快速加载。 9. **权限管理**:考虑到Android系统的权限模型,项目需要在Manifest文件中...

    apache-roller-src-4.0.1 源代码

    在源代码中,可以看到如何定义Servlet,以及如何在web.xml中配置Servlet映射。同时,JSP的使用展示了如何将业务逻辑与显示分离,理解这两者对于Web开发至关重要。 3. **MVC设计模式**: Roller遵循Model-View-...

    Android应用源码之手机RSS阅读器(html5).zip

    3. **数据管理**:RSS阅读器需要解析RSS feed,这通常通过网络请求获取XML数据,然后使用XML解析库(如`org.xmlpull.v1.XmlPullParser`)解析数据,提取出标题、链接、摘要等信息存储在本地数据库(如SQLite)。...

    毕业设计&课设--基于Android的新闻推荐系统,本科毕业设计项目。.zip

    3. **数据处理**:对获取到的新闻数据进行解析、存储和管理,可能使用SQLite数据库或其他云存储服务。 4. **推荐算法**:利用机器学习或数据挖掘技术,如协同过滤、基于内容的过滤、深度学习等,实现新闻推荐功能。 ...

    RSS阅读发布工具开发文档

    2. **XML解析**:RSS feed基于XML格式,因此,需要使用XML解析库来读取和处理RSS源。在不同的编程语言中,如Python有`feedparser`库,JavaScript有`xml2js`,Java有`JAXB`等。 3. **内容抓取**:RSS阅读器需要能够...

    gwt入门项目代码

    4. **MVC模式**:GWT和GXT通常遵循Model-View-Controller设计模式,理解模型如何存储和管理数据,视图如何展示数据,以及控制器如何处理用户交互。 5. **API的使用**:在代码中查找GWT和GXT的API用法,例如数据绑定...

    安卓开发-andricoFacebook客户端.zip

    - 使用Android的布局文件(XML)来设计应用界面,包括登录按钮、新闻feed、好友列表等。可能使用了Material Design组件库来实现现代的用户界面。 6. **网络请求和数据解析**: - Facebook API调用需要处理网络...

    一个java正则表达式工具类源代码.zip(内含Regexp.java文件)

    以前写了一个java的正规表达式的java工具类,分享一下,有用到的欢迎下载使用。 如果你有常用的定义好的,且测试通过的正规表达式,欢迎跟贴,也让我享用一下 . 类中用到了 jakarta-oro-2.0.jar 包,请大家自己在 ...

    schoolfeed:适用于前端的Android通知应用

    2. **数据模型(Model)**:这部分定义了应用中用到的数据结构,如学生的个人信息、供餐菜单等。开发者可能使用Parcelable或Serializable接口来实现数据的序列化,便于在Activity之间传递。 3. **视图(View)**:...

    android:小型RSS阅读器

    - **Adapter**:连接数据源与UI,将RSS条目渲染为列表项。 - **ViewHolder**:优化视图复用,减少内存分配和提高性能。 ### 5. 数据存储 - **SharedPreferences**:轻量级的存储方式,适用于保存用户设置。 - **...

    SimpleRssReader-android:Android Studio 中的 RssReader android 应用程序

    4. **XML解析**:解析RSS Feed通常会用到如XmlPullParser或第三方库如SimpleXML、JDOM等来处理XML数据,提取文章标题、链接、发布日期等信息。 5. **数据存储**:可能使用SharedPreferences存储用户的偏好设置,...

    UdacityXYZReader:适用于Udacity纳米度的XYZReader应用程序

    XYZReader的源代码展示了如何使用Java进行界面设计、数据管理以及与Android系统服务的交互。 1. **布局管理**:XML文件用于定义用户界面,如`activity_main.xml`,展示了如何使用LinearLayout、RelativeLayout或...

    TherapyPodcastPlayer:初次提交

    4. **网络请求**:为了下载或流式传输播客内容,项目可能会用到HttpURLConnection或者第三方库如OkHttp、Retrofit来处理HTTP请求,获取播客的RSS feed或其他形式的数据源。 5. **JSON解析**:播客数据通常以JSON...

    RSSFeedParser

    2. **RSS模型对象**:为了方便操作RSS数据,项目通常会定义一系列Java类,如`RssChannel`、`RssItem`等,它们对应RSS feed的各个部分,如频道信息、文章标题、链接、发布日期等。 3. **网络请求**:RSSFeedParser...

Global site tag (gtag.js) - Google Analytics