2015-06-30 15 views
2

有幾個測試使用不同的測試組。我試圖通過在內部使用帶有ITestContext的@DataProvider來運行其中的每個數據集。我得到NullPointerException。這裏是我的代碼:TestNG,ITestContext - getIncludedGroups返回Null

String url = "http://google.com"; 
FirefoxDriver driver = new FirefoxDriver(); 

@BeforeTest(groups={"A","B"}) 
public void launchOfBrowser(){ 
    driver.get(url); 
} 

@Test(dataProvider="Search", groups="A") 
public void searchByUser(String author, String key) throws InterruptedException{ 
    System.out.println("Welcome " + author + ", your search value is: " + key); 
    String enteredValue; 
    driver.findElement(By.name("q")).sendKeys(key); 
    Thread.sleep(3000); 
    enteredValue = driver.findElement(By.name("q")).getAttribute("value"); 
    Assert.assertEquals(enteredValue, key); 
    driver.findElement(By.name("q")).clear(); 
} 

@Test(dataProvider="Search", groups="B") 
public void searchByIncognito(String key) throws InterruptedException{ 
    System.out.println("Your search value is: " + key); 
    String enteredValue; 
    driver.findElement(By.name("q")).sendKeys(key); 
    Thread.sleep(3000); 
    enteredValue = driver.findElement(By.name("q")).getAttribute("value"); 
    Assert.assertEquals(enteredValue, key); 
    driver.findElement(By.name("q")).clear(); 
} 

@AfterTest(groups={"A","B"}) 
public void closeSessions(){ 
    driver.quit(); 
} 

@DataProvider(name="Search") 
public static Object[][] getDataFromDataprovider(ITestContext c){ 

    Object[][] groupArray = null; 

    for(String group : c.getIncludedGroups()){ 
     if (group.equalsIgnoreCase("A")){ 
      groupArray = new Object[][] { 
       { "Guru99", "India" }, 
       { "Krishna", "UK" }, 
       { "Bhupesh", "USA" } 
      }; 
     } 
     else{ 
      groupArray = new Object[][] { 
       { "India" }, 
       { "UK" }, 
       { "USA" } 
      }; 
     } 
    } 
    return groupArray; 
} 

回答

4
  • 如果直接運行TestNG的類,它會先調用數據提供程序這不能讓組信息組不可用。但是,如果您通過testng.xml調用此類,它將使用ITestContext提供組信息。

  • 你需要通過TestNG xml來調用這個類(類名是'ParameterByITestContextInDataprovider')。

下面是示例XML: -

<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" > 
<suite name="test-parameter"> 

    <test name="example1"> 

    <groups> 
     <run> 
      <include name="A" /> 
     </run> 
    </groups> 

    <classes> 
     <class 
     name="com.package123.ParameterByITestContextInDataprovider" /> 
    </classes> 

    </test> 


    <test name="example2"> 

    <groups> 
     <run> 
      <include name="B" /> 
     </run> 
    </groups> 

    <classes> 
     <class 
     name="com.package123.ParameterByITestContextInDataprovider" /> 
    </classes> 

    </test> 

</suite> 
+0

謝謝,夥計。現在一切正常。我還有兩個問題: 1)這是否意味着ITestContext僅適用於.XML?因爲每個方法返回null,甚至getName().. 我可以藉助註釋的優先級參數來控制流量嗎? 2)如果ITestContext是靜態方法的參數,這個靜態方法是帶有測試的副類。如何在這種情況下控制流量? – cherevychenkosa

+1

@cherevychenkosa,是的,我們可以這樣做: - 使用** ItestNGMethod **代替ITestContext: - 將以下參數傳遞給方法** getDataFromDataprovider(ITestNGMethod m)**並使用** m.getGroups()** in循環 - 執行它沒有XML,它應該工作。它爲我工作。 –

+0

那麼ITestContext的優勢在哪裏?如果ITestNGMethod更智能.. – cherevychenkosa