2016-10-21 30 views
0

如果我有多個必須在鏈中的@Test方法,並且我想使用DataProvider爲整個測試場景傳遞更多數據,那麼這樣做的正確方法是什麼。在測試場景中使用DataProvider

import org.testng.Assert; 
import org.testng.annotations.DataProvider; 
import org.testng.annotations.Test; 

public class TestClass { 

    private int type = -1; 

    @DataProvider 
    public Object[][] mock() { 
     return new Object[][] { { 1, "Hello" }, { 2, "World" } }; 
    } 

    @Test(groups = { "A" }, priority = 0, dataProvider = "mock") 
    public void testOne(int i, String name) { 
     System.out.println("TestClass.testOne()"); 
     switch (i) { 
     case 1: 
     type = 1; 
     Assert.assertEquals(name, "Hello"); 
     break; 
     case 2: 
     type = 2; 
     Assert.assertEquals(name, "World"); 
     break; 
     default: 
     break; 
     } 
    } 

    @Test(groups = { "A" }, priority = 1) 
    public void testTwo() { 
     Assert.assertEquals(type != -1, true); 
     System.out.println("TestClass.testTwo()"); 
    } 
} 

每次當testOne被調用,它後嘲笑數據testTwo也必須調用時間: Resutlt - > TestClass.testOne() TestClass.testOne() TestClass.testTwo()

預期的結果 - > TestClass.testOne() TestClass.testTwo() TestClass.testOne() TestClass.testTwo()

這是我的套房xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="Suite" group-by-instances="true"> 
    <test name="Test" verbose="3" group-by-instances="true" > 
    <classes> 

     <class name="demo.test.src.TestClass"> 

     </class> 
    </classes> 
    </test> <!-- Test --> 
</suite> <!-- Suite --> 

回答

1

你基本上需要一個工廠與一個數據提供者相結合來完成這件事。

下面是它如何看起來像一個示例:

public class TestClass { 

    private int type = - 1; 
    private String name; 

    @Factory (dataProvider = "mock") 
    public TestClass(int type, String name) { 
     this.type = type; 
     this.name = name; 
    } 

    @DataProvider 
    public static Object[][] mock() { 
     return new Object[][] {{1, "Hello"}, {2, "World"}}; 
    } 

    @Test (groups = {"A"}) 
    public void testOne() { 
     System.out.println("TestClass.testOne()"); 
     switch (type) { 
      case 1: 
       type = 1; 
       Assert.assertEquals(name, "Hello"); 
       break; 
      case 2: 
       type = 2; 
       Assert.assertEquals(name, "World"); 
       break; 
      default: 
       break; 
     } 
    } 

    @Test (groups = {"A"}, dependsOnMethods = "testOne") 
    public void testTwo() { 
     Assert.assertEquals(type != - 1, true); 
     System.out.println("TestClass.testTwo()"); 
    } 
} 

然後,您可以使用一個利用TestNG的一套XML文件group-by-instances屬性(樣本如下圖所示)

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 
<suite name="factory-suite" verbose="2" group-by-instances="true" > 
    <test name="factory-test"> 
     <classes> 
      <class name="org.rationale.emotions.TestClass"/> 
     </classes> 
    </test> 
</suite> 
+0

確定,但輸出是 TestClass.testOne() TestClass.testOne() TestClass.testTwo() TestClass.testTwo() 這不是期望編輯一個。 –

+0

@JordanBorisov在您的套件xml文件中添加一個「group-by-instances」= true,之後您將看到每個實例一起運行的方法。 –

+0

OK現在我有這個輸出(這是相同的): =====調用的方法 TestClass.testOne()[pri:0,instance:[email protected]] 687780858 TestClass.testOne ()[pri:0,instance:[email protected]] 1757293506 TestClass.testTwo()[pri:1,instance:[email protected]] 687780858 TestClass.testTwo() [pri:1,instance:[email protected]] 1757293506 ===== –