TestNG - @Parameters 传递外部参数 对比 @Dataprovider

转载 2015年11月20日 10:08:03

如我之前写的,testng中传递参数可以使用@Dataprovider,这种参数主要用于指定的参数集合,但是如果是从testng外部传入参数的话,@Dataprovider则无法获得或者说无法直接获得

这种情况可以通过<parameter>标签,在testng.xml中定义参数的值。对于同一参数,可以在不同地方定义不同值,因此需要注意testng.xml中的测试范围的问题。

<suite>和<test>标签定义了suite和test两种测试范围:一个test可以包含一系列的测试方法,一个suite可以包含多个独立的test。这两种测试范围有什么区别呢?一个test的所有测试方法都是针对同一测试对象,测试方法之间可以相互影响。而一个suite的每个test都是针对一个单独测试对象,两个test中的测试方法不会相互影响。

在这两种测试范围定义的参数,满足如下规律:

1)在Suite范围内定义某个参数的值,对所有的Test都有效。

2)在Test范围内定义某个参数的值,只是针对该Test有效。

3)如果同时在Suite和Test中定义某个参数,Test范围的值会屏蔽Suite的值。

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Suite" verbose="1">
  <parameter name="username" value="root" />
  <parameter name="password" value="pwd" />
  <parameter name="param" value="param" />

  <test name="test1">
    <parameter name="username" value="root2" />
    <parameter name="password" value="pwd2" />
    <classes>
      <class name="HelloWorld" />
    </classes>
  </test>

  <test name="test2">
    <packages>
      <package name="com.ibm.testng.test"></package>
    </packages>
  </test>
<suite>

在suite中都定义了username和password两个参数,同时也在test1中也定义了这两个参数,但是在test2中没有定义。因此,test1中所有测试方法的username和password分别为“root2”和“pwd2”,而test2中所有测试方法的username和password分别为“root”和“pwd”。
在java代码中,给测试方法传递参数的示例代码如下:

    @Parameters({"username"})
    @Test(groups = "login")
    public void inputUsername(String username) {
        System.out.println("Input Username: " + username); 
    }
    
    @Parameters({"password"})
    @Test(groups = "login")
    public void inputPassword(String password) {
        System.out.println("Input Password: " + password); 
    }
如果带参的函数被@Test标记为测试函数,但是没有被@Parameters标记,或者被@Parameters标记了,但是没有指定传递参数的名字,都会抛出一个TestNGException,这个函数就会被认为fail掉。
testng.xml只能传输简单类型的参数,不能传递Object类型。可以通过间接的方式,传递Object类型的参数。将所有参数化放到一个xml文件中,然后将该xml文件名作为参数,传递到一个XML解析器中。将xml解析的参数作为属性,创建所需的Object对象,然后对这些对象执行测试方法。

对比@Dataprovider

@DataProvider标记专门为测试方法提供参数的方法。这类方法必须返回Object[ ][ ]类型的二维数组,Object[]的每一行,都是测试方法的一个测试数据集,测试方法会为每个测试数据集执行一次。如果没有指定参数的名称,则默认为方法的名称,方法的名称没有限制。

@DataProvider标记的方法一般情况下没有参数,其实也可以带参数,但是这些参数的传递受到下面的两个限制:

1)@DataProvider标记的方法不可能是测试函数,因此不能通过@Parameters传递参数。

2)@DataProvider标记的方法只能被TestNG调用,因此用户不能通过调用的方式传递参数。

基于上面两个限制,@DataProvider标记的方法的参数化必须是特殊类型的,即TestNG在调用该方法时,可以通过反射机制获得。例如,例子中传递的参数是java.lang.reflect.Method类型,TestNG会将当前测试函数的名称传递给这个参数。当多个测试函数同时使用相同@DataProvider提供的参数时,需要根据测试方法提供不同的测试数据集时,这种特殊类型参数就显得非常有用。 


转载地址:http://www.tuicool.com/articles/fAnABnb

TestNG中的参数Parameters概念

在测试类中定义的测试方法,通常是不带参数的,但如果确实想要参数怎么办呢?TestNG中的参数标注@Parameters主要解决这个问题。 使用TestNG中的参数标注@Parameters为测试方法传...

TestNG参数化之Parameters

前言TestNG参数化有两种方式,一种通过Parameters和TestNG.xml设置参数,一种通过数据提供者@DataProvider提供参数,通过DataProvider参数化,可以看我另外一篇...

Parameters.AddWithValue(“@参数”,value)方法

以前用command方法执行存储过程增加参数时,总是先用cmd.Parameters.Add方法来设置参数和参数类型,再用Parameters[0].Value来给参数赋值。以前的一个动作代码示例:s...

Parameters用法

public bool InsertAdmin(string userName, string password, string remark, string mail, int departId, ...

TestNG入门笔记[4]: testng.xml 执行case —— 参数的传递

我们可以利用Parameter标签来传递参数,testng.xml只能传递些简单参数,无法传递复杂的Java参数。 1.  在case里添加@Parameters的annotatio...
  • sxl0727
  • sxl0727
  • 2016年07月12日 14:24
  • 648

testng实现参数化以及@optional的使用

一、项目路径下建一个testng.xml 二、建一个bro...

TestNG 三 测试方法

一、设置参数 测试方法是可以带有参数的。每个测试方法都可以带有任意数量的参数,并且可以通过使用TestNG的@Parameters向方法传递正确的参数。 设置方式有两种方法:使用testng.xm...

TestNG的参数化测试

JUnit没有提供方便传递测试参数的机制,所以,针对每个测试数据集,都需要单独写代码进行测试。这样浪费很多时间和精力重复写测试代码,它们只是参数不一样,测试逻辑完全一样。同时,测试代码和测试数据没有分...

TestNG参数化测试-数据提供程序 @DataProvider方式

在 testng.xml 中指定参数可能会有如下的不足: 1.如果你压根不用 testng.xml. 2.你需要传递复杂的参数,或者从Java中创建参数(复杂对象,对象从属性文件或者数据库中读取的...

TestNG参数化之DataProvider

TestNG、@DataProvider、Iterator
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TestNG - @Parameters 传递外部参数 对比 @Dataprovider
举报原因:
原因补充:

(最多只允许输入30个字)