传参的方式
TestNG 通常有两种传参的方法:
- 在 XML 配置文件中添加参数,并通过
@Parameters
参数传入 - 使用
@DataProvider
注解的方法返回测试参数。
前者适合添加少量参数,后者适合大量测试参数或数据的情况。
使用@Parameters
传参
XML配置
要使用 @Parameters
传参,需要在 XML 配置文件中以 <parameter>
标签添加参数配置。
<parameter>
标签可以放在 <suite>
、<test>
、<classes>
、<class>
等标签中,区别只是参数的作用域不同,内层的参数会覆盖外层同名参数。
当然可以配置多个参数,但参数间是相互独立的。可以仅传入一个参数,也可以一次传入多个参数。
1 |
|
@Parameters
注解@Test
方法
@Parameters
中指定的参数名与 XML 配置文件是一一对应的,跟注解方法的形参名称无关。
毕竟,从反射的能力看,方法形参名通常是不能取得的。
1 | public class MultiParamsOnTestMethod { |
@Parameters
注解@BeforeXxx
/@AfterXxx
方法
所有前后置处理器都可以使用 @Parameters
注解传参,这包括:
@BeforeSuite
/@AfterSuite
@BeforeTest
/@AfterTest
@BeforeGroups
/@AfterGroups
@BeforeClass
/@AfterClass
@BeforeMethod
/@AfterMethod
【注意事项】
一旦使用了分组,那么@BeforeXxx
和@AfterXxx
都需要指定分组,否则不会被执行。
一个技巧是在类上通过@Test
设置groups
统一指定分组。但是,这对@BeforeGroups
和@AfterGroups
无效,需要额外指定——特别的,可以通过groups
或value
指定。
@Parameters
注解Factory
方法
1 | public class ParamOnFactoryMethod { |
@Parameters
注解构造器
1 | public class ParamOnConstructor { |
默认值
如果通过注解传入了参数,则当 XML 配置文件不配置参数,导致参数值缺失,则在用例执行时会抛出异常。
这意味着一旦使用 @Parameters
传参,则将不能再从类/方法执行测试用例,只能从 XML 配置文件执行。
但是,可以通过为参数指定默认值,使其可以从类/方法执行某种默认的测试行为。
1 | public class OptionalParamMethod { |
使用DataProvider传参
@Parameters
传参只适合参数较少的场景,当参数太多,或者说需要大量测试数据时,就需要用到“数据提供器(Data Provider)”。
Data Provider位于同个类
@Test
通过 dataProvider
指定数据提供器的名称,数据由 @DataProvider
注解的方法返回。两者通过数据提供器的名字关联,如果 @DataProvider
设置 name
属性则名称为该指定名,否则为被注解的方法名。
1 | public class DataProviderInSameClassTest { |
Data Provider位于不同类
测试用例与数据提供器在同一类中,通过数据提供器名称关联是可行的。但是,如果不在同一类中,则还需要指定数据提供器所在的类——由 dataProviderClass
属性指定。
1 | public class DataProviderInOtherClassTest { |
如果数据提供器与测试用例在同一类中,则该测试类必然是可实例化的。因此,数据提供器无论声明为 static
与否都是可以的。另外,访问修饰符设置为 private
都没问题。
特殊的是,如果数据提供器与测试用例不在同一类中,则数据提供器所在的类不一定可实例化。因此,除非数据提供器方法声明为 static
,否则必须确保其所在类从外部有可访问的构造器——不然,会报“找不到构造器”。
【最佳实践】@DataProvider
应总是声明为 static
的。
【扩展说明】
@Parameters
不能用在@DataProvider
注解的方法上。推测原因大致有两个原因:
- 数据提供器本身就是提供参数的,再传入就多此一举
- 当需要鉴别具体是哪个测试方法调用了提供器时,需要传入
Method
进行判断,再传入其他参数会有歧义
小结
TestNG 有 @Parameters
和 @DataProvider
两种传参方式。
@Parameters
适合传递少量参数,@DataProvider
适合传递大量测试数据的情况。
@Parameters
可以为各种前后置处理器、@Test
、@Factory
注解的方法及构造器传参。
@DataProvider
注解方法可与测试位于同一类中,也可以位于不同类中。要么该方法声明为 static
,要么确保该类存在可访问的默认构造器。