TestNG参数传递方法

来源:互联网 发布:喷绘用什么软件 编辑:程序博客网 时间:2024/05/22 06:25

一.数据驱动测试时,怎么向测试方法传递参数?

1.利用@DataProvider传递参数,实现方式有用含有多个对象的数组和迭代器两种。
如果DataProvider和Test方法不在同一个类中,记得在Test方法中的dataProviderClass注明dataProvider所在的类。

①含有多个对象的数组 (Object[][])

@Test(dataProvider="data")public void testIsBetween(int n,int low,int high,boolean expected){    System.out.println("Recevied:"+n+" "+low+" "+high+" "+expected);    assert.assertEquals(expected,testIsBetween(n,low,high));}@DataProvider(name="data")public Object[][] data(){    int low=5;    int high=10;    return new Object[][]{        {low-1,low,high,false},        {low+1,low,high,true},        {high-1,low,high,true},        {high+1,low,high,false},    };}

②Iterator对象迭代器,迭代器与对象数组的区别是迭代器允许延迟创建自己的测试数据。

    @DataProvider(name="data02")    public Iterator<Object[]> getdata2()    {        Set<Object[]> set = new HashSet<Object[]>();        set.add(new String[]{"!","!_百度搜索"});        set.add(new String[]{"?","?_百度搜索"});        return set.iterator();    }     @Test(dataProvider="data02")    public void title_test02(String a,String b) throws InterruptedException     {      driver.findElement(By.cssSelector("#kw")).sendKeys(a);      driver.findElement(By.cssSelector("#su")).click();      Thread.sleep(1000);      String str = driver.getTitle();      Assert.assertEquals(str, b);    }

2.通过testng.xml文件
可以通过定义标签来定义参数值。要注意参数是在还是中定义的问题,和标签定义了suite和test两种测试范围:一个test可以包含一系列的测试方法,一个suite可以包含多个独立的test。
在这两种测试范围定义的参数,满足如下规律:
1)在Suite范围内定义某个参数的值,对所有的Test都有效。
2)在Test范围内定义某个参数的值,只是针对该Test有效。
3)如果同时在Suite和Test中定义某个参数,Test范围的值会屏蔽Suite的值。
举个栗子

testng.xml<!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="id" value="1234" />      <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.

_____________________我是分割线_____________________________________
二、 自定义注解是怎么实现的?