导航

Feed4TestNG 浅谈

Posted on 2017-07-11 20:58  Young哥哥  阅读(146)  评论(0)    收藏  举报

 

备注: 以下来自对官网文档的翻译:原文地址:http://databene.org/feed4testng.html

Feed4TestNG可以方便地为TestNG框架编写参数化测试,并使用预定义或随机测试数据进行输入。它使您能够轻松地改进测试:

  • 从业务分析师定义的CSV或Excel文件读取测试用例数据,并在构建/单元测试基础架构中报告测试成功。
  • 轻松执行随机但有效数据的烟雾测试可以大大提高代码覆盖率,并展示由非常特殊的数据星座引起的错误。
  • 定义等价类测试很容易,这是软件测试人员的强大方法,但在开发人员中很少知道

配置易于学习和维护,并基于Java注释。它们可用于从文件(CSV,Excel)导入数据或生成与“Bean验证”JSR 303和Java 7或从Benerator中使用execptions声明的数据约束相匹配的随机数据。通过连接到领先的测试数据生成器Benerator,您可以配置生成任意复杂的有效和无效数据集。

 

介绍

测试基础 

Feed4TestNG测试必须扩展类org.databene.feed4testng.FeedTest,并使用名为“feed”的dataProvider:

公共类LoginTest 延伸FeedTest { 

A A A @Test(数据提供程序=“供料器”
A A A公共无效TESTLOGIN(字符串名称,字符串password){ 
A A A A A A的System.out.println(“名称:” +名称+“密码:”+密码); 
A A A} 
A A A  
}

对于一个烟雾测试足够开始!使用您最喜爱的JUnit环境运行此测试,Feed4JUnit将使用Benerator的功能来自动查找有用的测试值(从边界值测试应用想法)并组合它们(试图覆盖所有产生的等价分区)。当使用TestNG执行测试时,您将看到,Feed4TestNG会自动生成关键和简单值的混合,用于测试调用。对于字符串,它们为空,空字符串,单字符串,长字符串(1000个字符)和中等大小的字符串(500个字符),检查字符集(A和Z)的边框,值在(N)之间并检查每个可能的组合的不同参数。

当然,您可以使用注释来限制生成数据的范围和特征。

 

 

从文件读取测试数据

数据源可以使用@Source注释(org.databene.benerator.anno.Source)轻松配置:

公共类LoginTest 延伸FeedTest { 

A A A @Test(数据提供程序= “饲养”
A A A  @Source(“userlogin.csv”)
A A A公共无效TESTLOGIN(字符串名称,字符串password){ 
A A A A A A System.out.println(“name:”+ name +“password:”+ password); 
A A A} 
A A A  
}一个  

运行测试,您会注意到,Feed4TestNG遍历CSV文件,并对每个数据行执行一个测试方法调用。

Feed4TestNG目前支持以下文件格式:

  • CSV文件
  • Excel(TM)表 

 

从数据库检索测试数据

可以使用@Database 注释声明和配置数据库。将注释应用于类时,所定义的数据库可用于所有测试方法。注释方法时,数据库仅在此方法中可用。可以通过指定典型的JDBC连接设置:url驱动程序用户密码来执行基本配置。数据库声明必须指定一个id,通过该id可以将数据库称为方法的@Source。该@Source标注必须是指数据库ID和定义一个SQL查询作为选择。查询结果列的数量必须与方法参数的数量相匹配:

@DatabaseID = “ DB ”,网址 = “的JDBC:HSQLDB:HSQL://本地主机:9001 / f4jdb”,
A A A A A A  驱动器 = “org.hsqldb.jdbcDriver”,用户 = “我”,密码 =“秘密”)
公共类DatabaseTest { 
A A A  
A A A静态DBSystem分贝; 
A A A  
A A A @Test(数据提供程序= “饲养”
A A A  @SourceID =“ 分贝 ”,选择器 =“ 从dbt_person选择ID,名称 ”)
A A A公共无效测试(INT ID,
字符串名称){ ÂÂÂÂÂÂSystem.out.println(id +“,”+名称); 
A A A} 
A A A  
}一个  

除了显式的数据库连接配置,您还可以将数据库环境配置放在用户目录中,并在测试中引用它们:

@Databaseid =“ db ”,environment =“ f4jdb ”)  

DB Sanity环境文件文档中阅读有关环境文件的更多信息。

 

定义自定义数据源

如果您希望从其他数据源或文件类型检索数据,则可以对从Feed4TestNGGenerator类继承并提供数据的连接器组件进行编程:

公共静态类MyGenerator 延伸UnsafeMethodParamsGenerator { 
A A A  公共对象[]产生() { 
A A A A A A返回新的对象[] {1,2,3}; 
ÂÂ} 
}  

由generate()方法返回的Object数组用作调用测试方法的参数列表。如果源中可用的数据耗尽(例如,达到文件的结尾),则生成器类返回null。

示例类MyGenerator 在每次调用时返回{1,2,3,4},因此它将被无休止地称为,除非您使用@InvocationCount注释相关的测试方法来限制数据量。

自定义生成器类由@Bean注释声明,带有id和说明如何实例化和初始化bean对象。方法中的@Source注释符合其id

@RunWith(Feeder.class)
@BeanID = “ mygen ”,键入 = MyGenerator的.class)
公共类BeanSourceTest { 
A A A  
A A A @Test(数据提供程序= “饲养”
A A A  @Source( “ mygen ” )
A A A  @InvocationCount(5)
A A A公共无效testArrayIterable(INT N1,N2 INT,INT N3){ 
A A A A A A的System.out.println(N1 + “ ”+ N2 +“,” + N3); 
A A A} 
A A A  
}一个  

在这种情况下,类型规范告诉Feed4TestNG 通过其默认构造函数实例化MyGenerator类的对象。

或者,您可以使用Benerator关于bean实例化的全部功能集,例如。调用一个构造函数:

@Beanid =“ mygen ”,spec = “new MyOtherGenerator(1,'test')”)  

或使用一个bean属性构造器: 

@Beanid =“ mygen ”,spec =“ new MyOtherGenerator {property1 = 1,property2 ='test'} ”)  

或更多的豆类方法:

@BeanID = “ mygen ”,类型= “ MyOtherGenerator ”,属性 = { 
A A A  @Property名称 = “property1”, = “1”),
A A A  @Property名称 = “property2”, =“test”)
})  

 

动态生成约束数据

Feed4TestNG支持在JSR 303,Java 7和Benerator中定义的用于生成与约束匹配的随机数据的注释。

请参阅@Pattern注释作为示例(javax.validation.constraints.Pattern):

公共类SmokeTest延伸FeedTest { 

A A A @Test(数据提供程序= “饲养”
A A A公共无效testSmoke(@Pattern(正则表达式= “[AZ] [AZ] {3,8}”) 字符串名称){ 
A A ÂÂÂSystem.out.println(“name:”+ name); 
A A A} 
A A A  
}

支持以下注释:

注解 Java包 适用性 
描述 
@AssertFalse javax.validation.constraints 参数 需要一个布尔参数为false
@AssertTrue javax.validation.constraints 参数 需要一个booöean参数是真的 
@DecimalMin javax.validation.constraints 参数 要求数字参数大于或等于最小值 
@DecimalMax  javax.validation.constraints 参数 要求数字参数小于或等于最大值  
@未来  javax.validation.constraints 参数 需要日期参数在将来 
@Min  javax.validation.constraints 参数 要求整数数字大于或等于最小值 
@Max  javax.validation.constraints 参数 要求整数数字小于或等于最大值 
@NotNull  javax.validation.constraints 参数 要求参数不为空 
@空值  javax.validation.constraints 参数 需要一个参数为空 
@过去  javax.validation.constraints  参数 需要Date参数在过去 
@模式  javax.validation.constraints  参数 需要一个String参数与正则表达式匹配 
@InvocationCount org.databene.benerator.anno  方法 将调用次数限制为测试方法 
@资源  org.databene.benerator.anno  方法,参数 指定从中读取测试数据的源文件(例如CSV或Excel(TM)文件) 
  @Offset org.databene.benerator.anno 方法,
参数
一个 
@分配  org.databene.benerator.anno  参数 指定要用于数字参数的分发 
@粒度  org.databene.benerator.anno  参数 指定数字参数的粒度(对应于生成器的'精度') 
@Nullquota  org.databene.benerator.anno  参数 指定要为参数生成的空值的配额 
@独特  org.databene.benerator.anno  方法,参数 如果应用于参数,则它指定其值必须是唯一的。应用于一种方法,它指定所有参数的组合必须是唯一的
@values  org.databene.benerator.anno  参数 指定所有支持值的逗号分隔列表 
@发电机  org.databene.benerator.anno  方法,参数 为参数或数组生成器指定一个简单的类型生成器,用于完整的参数集 
@DescriptorBased org.databene.benerator.anno  方法 指定在生成器描述符文件中配置测试方法的参数 
@等价  org.databene.benerator.anno 类,
方法
建议Feed4JUnit为所有相关测试方法使用EquivalenceGeneratorFactory。它使用边界值和分区测试的机制创建相对较少数量的平均测试。 
@Coverage  org.databene.benerator.anno 类,
方法
建议Feed4JUnit为所有相关测试方法使用CoverageGeneratorFactory 。它运行所有可能的值和所有可能的组合,并产生大量的测试。 
@Stochastic   org.databene.benerator.anno 类,
方法
建议Feed4JUnit为所有相关的测试方法使用StochasticGeneratorFactory。它随机创建温和的数据,并提供无限数量的测试  

 

测试方法

等价类测试

等价类测试是软件测试人员的强大方法,但在开发人员中几乎不知道。Feed4TestNG使开发人员易于使用。

方法的基本思想是 

  • 定义在测试代码中类似处理的“类”或值组(例如负数,零,正数)
  • 测试每个测试类的至少一个实例(例如-6,0,42)
  • 测试边界值(例如MIN_INT,-1,0,1,MAX_INT)
  • 如果测试有几个参数,请检查每个参数上面定义的值(MIN_INT,-6,-1,0,1,42,MAX_INT)的每个有效组合。

如果所有参数具有相同的等价类,我们的数据集将导致以下测试次数:


参数数量


测试
2 49
343 

你不想手工编写49个甚至343个测试设置,对吧?你不会覆盖所有,而是依靠一个或多或少的任意选择。

一个 

烟雾测试

使用随机但有效的数据进行烟雾测试可以大大提高代码覆盖率,并展示非常特殊的数据星座的错误。即使您不能简单地使用随机数据预测每个结果,您可以检查结果约束或至少检查运行时异常:

公共类AddTest扩展了FeedTest {

A A A @Test(数据提供程序=“供给器”)
A A A  @Coverage
A A A公共无效testAdd(INT参数1,INT param2的){ 
A A A A A A A尝试{ 
A A A A A A A A INT结果= MyUtil.add(param1,param2); 
A A A A}赶上(例外五){ 
A A A A A A A A A A A //接受应用程序异常,失败上运行时异常
A A A A A A A A A A //像的NullPointerExceptionÂ

A A A   
如果(e instanceof RuntimeException)
 

A A A A}一个  
A A A}

}

 

分析师驱动测试

Excel等分析师。开发人员也是这样做的,但是大多数人必须手动将数据从表中定义的测试用例传输到测试代码中。如果需求发生变化,重新扫描测试代码并使用表格数据进行重新配对是一项繁琐的工作。自动从Excel文件读取表并将其提供给测试代码,更容易和更易于维护。数据文件甚至可以驻留在网页或FTP服务器上,并在执行测试时从那里动态检索。所以分析师甚至没有必要应对版本控制系统来与开发进行互操作。

公共类AddTest扩展了FeedTest {

A A A @Test(数据提供程序=“供料器”)
A A A  @Source(“http://buildserv.mycompany.com/wiki/myproject/tests/add.xls”)
A A A公共无效testAdd(INT参数1, int param2,int expectedResult){ 
ÂÂÂÂÂint result = MyUtil.add(param1,param2); 
  声明结果== expectedResult; 
ÂÂ}

}

您可以使用特殊的URL语法从FTP服务器检索文件:@Source(“ftp:// user:password@server/file.txt”)



在项目中使用Feed4TestNG

在IDE中使用Feed4TestNG 

要在IDE中的项目中运行测试(例如Eclipse),请下载feed4testng发行版,并将其lib文件夹中包含的所有文件添加到项目的类路径中。

如果你不知道如何使Eclipse运行TestNG进行,请阅读安装TestNG的Eclipse插件。

编写一个Feed4TestNG测试并执行它。

对于每个测试调用,您将在测试协议中找到使用参数的专用条目。

 

在Maven构建中使用Feed4TestNG

按照惯例放置您的项目及其pom,然后添加一个依赖关系到最新版本的Feed4TestNG:

A A A <依赖性> 
A A A A A A A <的groupId> org.databene </的groupId> 
A A A A A A A <artifactId的> feed4testng </ artifactId的> 
A A A A A A A <版本> 1.0 < / version> 
ÂÂ</依赖>

执行测试后,例如使用'mvn test',您可以在文件target / surefire-reports / testng-results.xml中找到每个测试方法调用的已删除条目以及已使用的参数,例如

“test-method status =” PASS “signature =” testDescriptor(java.lang.String,java.lang.String)
name =”testDescriptor“duration-ms =”0“started-at = “2010-06-04T19:41:37Z”
= -在完成“2010-06-04T19:41:37Z”>
A A A A A A A A A <参数>
A A A A A A A A A A A <PARAM索引=“0”>
A A A A A A A A A A A A A <值>
A A A A A A A A A A A A A A A <![CDATA [ 7962 ]]>
A A A A A A A A A A A A A </值>
A A A A A A A A A A A </ PARAM>
A A A A A A A A A A A <PARAM索引= “1”>
Â价值>ÂÂÂÂÂÂÂÂ
A A A A A A A A A A A A A A A <![CDATA [ MORRISTOWN ]]>
A A A A A A A A A A A A A </值>
A A A A A A A A A A A </ PARAM>
A A A A A A A A A </参数>
A A A A A A A </测试方法>

运行“mvn站点”时,Maven将在每个测试调用时生成一行测试报告,但不会显示已使用的参数。

 

更多信息 

执照

Feed4TestNG是开源的,根据GNU公共许可证GPL 2.0发布。但是请注意,它需要具有不同许可证的生成器,具有例外的GPL 2.0。

 

要求

  • Feed4TestNG需要Java 6或更新版本
  • 使用TestNG作为定义测试的基础框架。如果要使用JUnit,您可以使用Feed4JUnit进行此操作:它扩展了JUnit,支持参数化测试,并提供与Feed4TestNG相同的功能,其语法略有不同。

 

限制

  • Feed4TestNG创建并将大量执行信息写入日志文件。所以Feed4TestNG不适合喂养微量基准。
  • 为Feed4TestNG计划执行自动等价类测试,但底层数据生成基础架构尚不支持。我将在未来的版本中实施