ผู้ให้บริการข้อมูล & TestNG XML: การกำหนดพารามิเตอร์เป็น Selenium(ตัวอย่าง)
การกำหนดพารามิเตอร์ใน Selenium
การกำหนดพารามิเตอร์ใน Selenium เป็นกระบวนการในการกำหนดพารามิเตอร์ของสคริปต์ทดสอบเพื่อส่งข้อมูลหลายรายการไปยังแอปพลิเคชันขณะรันไทม์ เป็นกลยุทธ์ในการดำเนินการซึ่งจะรันกรณีทดสอบหลายครั้งโดยอัตโนมัติโดยใช้ค่าที่แตกต่างกัน แนวคิดที่ทำได้โดยการกำหนดพารามิเตอร์ของสคริปต์ทดสอบเรียกว่า การทดสอบที่ขับเคลื่อนด้วยข้อมูล.
ประเภทของการกำหนดพารามิเตอร์ใน TestNG-
เพื่อให้การกำหนดพารามิเตอร์ชัดเจนยิ่งขึ้น เราจะพิจารณาตัวเลือกการกำหนดพารามิเตอร์ในเฟรมเวิร์กที่ได้รับความนิยมมากที่สุดกรอบหนึ่ง Selenium เว็บไดรเวอร์ – TestNG.
มี สองทาง ซึ่งเราสามารถบรรลุถึงการกำหนดพารามิเตอร์ได้ TestNG
- ด้วยความช่วยเหลือของ พารามิเตอร์ คำอธิบายประกอบ และ TestNG XML ไฟล์
- ด้วยความช่วยเหลือของ ผู้ให้บริการข้อมูล คำอธิบายประกอบ
พารามิเตอร์จาก Testng.xml สามารถเป็นชุดหรือระดับการทดสอบ
พารามิเตอร์จาก DataProvider สามารถใช้ Method และ ITestContext เป็นพารามิเตอร์ได้
มาศึกษารายละเอียดกันดีกว่า –
พารามิเตอร์ คำอธิบายประกอบใน TestNG
พารามิเตอร์ คำอธิบายประกอบใน TestNG เป็นวิธีที่ใช้ในการส่งผ่านค่าไปยังวิธีทดสอบเป็นอาร์กิวเมนต์โดยใช้ไฟล์ .xml ผู้ใช้อาจจำเป็นต้องส่งค่าไปยังวิธีทดสอบในระหว่างรันไทม์ วิธีการใส่คำอธิบายประกอบ @Parameters สามารถใช้ในวิธีใดก็ได้ที่มีคำอธิบายประกอบแบบ @Test, @Before, @After หรือ @Factory
คำอธิบายพารามิเตอร์ด้วย Testng.xml
เลือกการกำหนดพารามิเตอร์โดยใช้คำอธิบายประกอบเมื่อคุณต้องการจัดการกับความซับซ้อน และจำนวนการรวมอินพุตมีน้อยลง
มาดูกันว่าวิธีนี้ทำงานอย่างไร
สถานการณ์ทดสอบ
ขั้นตอนที่ 1) เปิดเบราว์เซอร์ & ไปที่ Google.com
ขั้นตอนที่ 2) ป้อนคำค้นหา
ขั้นตอนที่ 3) ตรวจสอบว่าค่าที่ป้อนเหมือนกับค่าที่ได้รับจากข้อมูลทดสอบของเรา
ขั้นตอนที่ 4) ทำซ้ำ 2 และ 3 จนกระทั่งป้อนค่าทั้งหมด
ผู้เขียนทดสอบ | ค้นหาคีย์ |
---|---|
Guru99 | อินเดีย |
Krishna | สหรัฐอเมริกา |
ภุพเพช | สาธารณรัฐประชาชนจีน |
นี่คือตัวอย่างวิธีการดำเนินการโดยไม่มีพารามิเตอร์
package parameters; import org.testng.annotations.Test; import org.testng.AssertJUnit; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class NoParameterWithTestNGXML { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; @Test public void testNoParameter() throws InterruptedException{ String author = "guru99"; String searchKey = "india"; System.setProperty("webdriver.gecko.driver", driverPath); driver= new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); WebElement searchText = driver.findElement(By.name("q")); //Searching text in google text box searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); System.out.println("Thread will sleep now"); Thread.sleep(3000); System.out.println("Value in Google Search Box = "+searchText.getAttribute("value") +" ::: Value given by input = "+searchKey); //verifying the value in google search box AssertJUnit.assertTrue(searchText.getAttribute("value").equalsIgnoreCase(searchKey)); } }
การศึกษาตัวอย่างข้างต้น ลองนึกดูว่าโค้ดจะซับซ้อนแค่ไหนเมื่อเราใช้ชุดอินพุต 3 ชุด
ตอนนี้ เรามากำหนดพารามิเตอร์โดยใช้ TestNG
เพื่อทำเช่นนั้นคุณจะต้อง
- สร้างไฟล์ XML ซึ่งจะเก็บพารามิเตอร์
-
ในการทดสอบ ให้เพิ่มคำอธิบายประกอบ @Parameters
นี่คือรหัสที่สมบูรณ์
ระดับการทดสอบ TestNG. Xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="TestSuite" thread-count="3" > <parameter name="author" value="Guru99" /> <parameter name="searchKey" value="India" /> <test name="testGuru"> <parameter name="searchKey" value="UK" /> <classes> <class name="parameters.ParameterWithTestNGXML"> </class> </classes> </test> </suite>
พารามิเตอร์ด้วยTestNGไฟล์ XML.java
package parameters; import org.testng.AssertJUnit; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.Optional; import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class ParameterWithTestNGXML { String driverPath = "C:\\geckodriver.exe"; WebDriver driver; @Test @Parameters({"author","searchKey"}) public void testParameterWithXML( @Optional("Abc") String author,String searchKey) throws InterruptedException{ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); WebElement searchText = driver.findElement(By.name("q")); //Searching text in google text box searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); System.out.println("Thread will sleep now"); Thread.sleep(3000); System.out.println("Value in Google Search Box = "+searchText.getAttribute("value") +" ::: Value given by input = "+searchKey); //verifying the value in google search box AssertJUnit.assertTrue(searchText.getAttribute("value").equalsIgnoreCase(searchKey)); } }
คำแนะนำในการรันสคริปต์ เลือกไฟล์ XML และเรียกใช้เป็น Test NG Suite
คลิกขวาที่ไฟล์ .xml -> Run as -> ทดสอบ ห้องสวีท (หมายเหตุ : ห้องสวีท)
ตอนนี้สามารถกำหนดพารามิเตอร์ได้ 2 ระดับ
- ระดับชุด – พารามิเตอร์ภายใน แท็กของ TestNG ไฟล์ XML จะเป็นพารามิเตอร์ระดับชุด
- ระดับการทดสอบ — พารามิเตอร์ภายใน แท็กของการทดสอบไฟล์ XML จะเป็นพารามิเตอร์ระดับการทดสอบ
นี่คือการทดสอบเดียวกันกับพารามิเตอร์ระดับชุด
หมายเหตุ: ในกรณีที่ชื่อพารามิเตอร์เหมือนกันในระดับชุดและระดับการทดสอบ พารามิเตอร์ระดับการทดสอบจะได้รับการตั้งค่ามากกว่าระดับชุด ดังนั้น ในกรณีนั้น คลาสทั้งหมดภายในระดับการทดสอบนั้นจะใช้พารามิเตอร์ที่ถูกแทนที่ร่วมกัน และคลาสอื่นๆ ที่อยู่นอกระดับการทดสอบจะใช้พารามิเตอร์ระดับชุดร่วมกัน
การแก้ไขปัญหา
ปัญหา # 1 ไม่สามารถกำหนดชนิดค่าพารามิเตอร์ใน testng.xml เป็นพารามิเตอร์ของวิธีการทดสอบที่สอดคล้องกันได้ ส่งผลให้เกิดข้อผิดพลาด
พิจารณาตัวอย่างต่อไปนี้
ในที่นี้ แอตทริบิวต์ 'author' เท่ากับ 'Guru99' ซึ่งเป็นสตริง และในวิธีทดสอบที่สอดคล้องกัน แอตทริบิวต์ดังกล่าวคาดว่าจะได้ค่าจำนวนเต็ม ดังนั้นเราจะได้รับข้อยกเว้นที่นี่
ปัญหา # 2 @Parameters ของคุณไม่มีค่าที่สอดคล้องกันในการทดสอบ.xml
คุณสามารถแก้ไขสถานการณ์นี้ได้โดยการเพิ่ม @ไม่จำเป็น คำอธิบายประกอบ ในพารามิเตอร์ที่เกี่ยวข้องในวิธีทดสอบ
ฉบับที่ 3: คุณต้องการทดสอบค่าหลายค่าของพารามิเตอร์เดียวกันโดยใช้ Testng.xml
คำตอบง่ายๆ คือไม่สามารถทำได้! คุณสามารถมีพารามิเตอร์ที่แตกต่างกันได้หลายตัว แต่แต่ละพารามิเตอร์จะมีได้เพียงค่าเดียวเท่านั้น ซึ่งจะช่วยป้องกันค่าฮาร์ดโค้ดลงในสคริปต์ ทำให้โค้ดสามารถนำมาใช้ซ้ำได้ คิดว่ามันเป็นไฟล์กำหนดค่าสำหรับสคริปต์ของคุณ หากคุณต้องการใช้หลายค่าสำหรับพารามิเตอร์หนึ่งๆ ให้ใช้ DataProviders
ผู้ให้บริการข้อมูลใน TestNG
ผู้ให้บริการข้อมูลใน TestNG เป็นวิธีการที่ใช้เมื่อผู้ใช้จำเป็นต้องส่งพารามิเตอร์ที่ซับซ้อน พารามิเตอร์ที่ซับซ้อนจะต้องสร้างจาก Java เช่น วัตถุที่ซับซ้อน วัตถุจากไฟล์คุณสมบัติหรือจากฐานข้อมูลสามารถส่งต่อได้โดยวิธีการของผู้ให้บริการข้อมูล วิธีการนี้ได้รับการอธิบายโดย @DataProvider และจะส่งคืนอาร์เรย์ของวัตถุ
พารามิเตอร์ที่ใช้ Dataprovider
คำอธิบายประกอบ @Parameters นั้นง่าย แต่ในการทดสอบกับข้อมูลหลายชุด เราจำเป็นต้องใช้ Data Provider
ในการกรอกแบบฟอร์มบนเว็บนับพันรายการโดยใช้เฟรมเวิร์กการทดสอบของเรา เราจำเป็นต้องมีวิธีการที่แตกต่างกันซึ่งสามารถให้ชุดข้อมูลขนาดใหญ่มากแก่เราในโฟลว์การดำเนินการเดียว
แนวคิดที่ขับเคลื่อนด้วยข้อมูลนี้บรรลุผลสำเร็จโดย @DataProvider คำอธิบายประกอบใน TestNG.
มันมีเพียงหนึ่งเดียว คุณลักษณะ 'ชื่อ'- หากคุณไม่ได้ระบุแอตทริบิวต์ชื่อ ชื่อของ DataProvider จะเหมือนกับชื่อวิธีการที่เกี่ยวข้อง
ผู้ให้บริการข้อมูลส่งคืน วัตถุ Java สองมิติ วิธีทดสอบและวิธีการทดสอบจะเรียกใช้ M ครั้งในอาร์เรย์วัตถุประเภท M*N ตัวอย่างเช่น หาก DataProvider ส่งคืนอาร์เรย์ของออบเจ็กต์ 2*3 ชุดทดสอบที่เกี่ยวข้องจะถูกเรียกใช้ 2 ครั้งโดยมี 3 พารามิเตอร์ในแต่ละครั้ง
ตัวอย่างที่สมบูรณ์
package parameters; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class ParameterByDataprovider { WebDriver driver; String driverPath = "C:\\geckodriver.exe"; @BeforeTest public void setup(){ //Create firefox driver object System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } /** Test case to verify google search box * @param author * @param searchKey * @throws InterruptedException */ @Test(dataProvider="SearchProvider") public void testMethod(String author,String searchKey) throws InterruptedException{ { WebElement searchText = driver.findElement(By.name("q")); //search value in google searchbox searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //Verify if the value in google search box is correct Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } /** * @return Object[][] where first column contains 'author' * and second column contains 'searchKey' */ @DataProvider(name="SearchProvider") public Object[][] getDataFromDataprovider(){ return new Object[][] { { "Guru99", "India" }, { "Krishna", "UK" }, { "Bhupesh", "USA" } }; } }
เรียกใช้ DataProvider จากคลาสอื่น
ตามค่าเริ่มต้น DataProvider จะอยู่ในคลาสเดียวกันกับที่วิธีการทดสอบหรือคลาสพื้นฐาน ในการที่จะใส่ไว้ในคลาสอื่น เราจำเป็นต้องสร้าง data provider method ให้เป็น static และใน test method เราจำเป็นต้องเพิ่มแอ็ตทริบิวต์ dataProviderClass in @ทดสอบ คำอธิบายประกอบ
ตัวอย่างรหัส
TestClass parameterDataproviderWithClassLevel.java
package parameters; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; public class ParameterDataproviderWithClassLevel { WebDriver driver; String driverPath = "C:\\geckodriver.exe"; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } @Test(dataProvider="SearchProvider",dataProviderClass=DataproviderClass.class) public void testMethod(String author,String searchKey) throws InterruptedException{ WebElement searchText = driver.findElement(By.name("q")); //Search text in google text box searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); //get text from search box String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //verify if search box has correct value Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } }
DataproviderClass.java
package parameters; import org.testng.annotations.DataProvider; public class DataproviderClass { @DataProvider(name="SearchProvider") public static Object[][] getDataFromDataprovider(){ return new Object[][] { { "Guru99", "India" }, { "Krishna", "UK" }, { "Bhupesh", "USA" } }; }}
ประเภทของพารามิเตอร์ใน Dataprovider
มีพารามิเตอร์สองประเภทที่รองรับโดยวิธี DataProvider
วิธี- หากไฟล์ เหมือนกัน DataProvider ควรทำงานแตกต่างออกไปด้วยวิธีการทดสอบที่แตกต่างกัน ให้ใช้พารามิเตอร์ Method
ในตัวอย่างต่อไปนี้
- เราตรวจสอบว่าชื่อวิธีการคือ testMethodA หรือไม่
- ถ้าใช่ให้ส่งคืนค่าหนึ่งชุด
- มิฉะนั้นจะส่งคืนค่าอีกชุดหนึ่ง
package parameters; import java.lang.reflect.Method; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.annotations.BeforeTest; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class ParameterByMethodInDataprovider{ WebDriver driver; String driverPath = "C:\\geckodriver.exe"; @BeforeTest public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } @Test(dataProvider="SearchProvider") public void testMethodA(String author,String searchKey) throws InterruptedException{ WebElement searchText = driver.findElement(By.name("q")); //Search text in search box searchText.sendKeys(searchKey); //Print author and search string System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //Verify if google text box is showing correct value Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } @Test(dataProvider="SearchProvider") public void testMethodB(String searchKey) throws InterruptedException{ { WebElement searchText = driver.findElement(By.name("q")); //Search text in search box searchText.sendKeys(searchKey); //Print only search string System.out.println("Welcome ->Unknown user Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //Verify if google text box is showing correct value Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } /** * Here DataProvider returning value on the basis of test method name * @param m * @return **/ @DataProvider(name="SearchProvider") public Object[][] getDataFromDataprovider(Method m){ if(m.getName().equalsIgnoreCase("testMethodA")){ return new Object[][] { { "Guru99", "India" }, { "Krishna", "UK" }, { "Bhupesh", "USA" } };} else{ return new Object[][] { { "Canada" }, { "Russia" }, { "Japan" } };} } }
นี่คือผลลัพธ์
ITestContext– สามารถใช้เพื่อสร้างพารามิเตอร์ที่แตกต่างกันสำหรับกรณีทดสอบตามกลุ่ม
ในชีวิตจริง คุณสามารถใช้ ITestContext เพื่อเปลี่ยนแปลงค่าพารามิเตอร์ตามวิธีทดสอบ โฮสต์ และการกำหนดค่าของการทดสอบ
ในตัวอย่างโค้ดต่อไปนี้
- เรามี 2 กลุ่ม A และ B
- วิธีการทดสอบแต่ละวิธีถูกกำหนดให้กับกลุ่ม
- หากค่าของกลุ่มเป็น A ชุดข้อมูลเฉพาะจะถูกส่งกลับ
- หากค่าของกลุ่มเป็น B ชุดข้อมูลอื่นจะถูกส่งกลับ
package parameters; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.Assert; import org.testng.ITestContext; import org.testng.annotations.BeforeTest; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class ParameterByITestContextInDataprovider { WebDriver driver; String driverPath = "C:\\geckodriver.exe"; @BeforeTest(groups={"A","B"}) public void setup(){ System.setProperty("webdriver.gecko.driver", driverPath); driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("https://google.com"); } @Test(dataProvider="SearchProvider",groups="A") public void testMethodA(String author,String searchKey) throws InterruptedException{ { //search google textbox WebElement searchText = driver.findElement(By.name("q")); //search a value on it searchText.sendKeys(searchKey); System.out.println("Welcome ->"+author+" Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //verify correct value in searchbox Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } @Test(dataProvider="SearchProvider",groups="B") public void testMethodB(String searchKey) throws InterruptedException{ { //find google search box WebElement searchText = driver.findElement(By.name("q")); //search a value on it searchText.sendKeys(searchKey); System.out.println("Welcome ->Unknown user Your search key is->"+searchKey); Thread.sleep(3000); String testValue = searchText.getAttribute("value"); System.out.println(testValue +"::::"+searchKey); searchText.clear(); //verify correct value in searchbox Assert.assertTrue(testValue.equalsIgnoreCase(searchKey)); } } /** * Here the DAtaProvider will provide Object array on the basis on ITestContext * @param c * @return */ @DataProvider(name="SearchProvider") public 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" } }; break; } else if(group.equalsIgnoreCase("B")) { groupArray = new Object[][] { { "Canada" }, { "Russia" }, { "Japan" } }; } break; } return groupArray; } }
หมายเหตุ: หากคุณเรียกใช้คลาส testng โดยตรง ระบบจะเรียก dataprovider ก่อน ซึ่งไม่สามารถรับข้อมูลกลุ่มได้เนื่องจากไม่มีกลุ่มให้ใช้งาน แต่หากคุณเรียกใช้คลาสนี้ผ่าน testng.xml ระบบจะมีข้อมูลกลุ่มให้ใช้งานด้วย ITestContext แทน ใช้ XML ต่อไปนี้เพื่อเรียกใช้คลาส test
<!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="parameters.ParameterByITestContextInDataprovider" /> </classes> </test> <test name="example2"> <groups> <run> <include name="B" /> </run> </groups> <classes> <class name="parameters.ParameterByITestContextInDataprovider" /> </classes> </test> </suite>
สรุป
- การกำหนดพารามิเตอร์ จำเป็นต้องสร้าง การทดสอบที่ขับเคลื่อนด้วยข้อมูล.
- TestNG รองรับการกำหนดพารามิเตอร์สองประเภทโดยใช้ @พารามิเตอร์+TestNG. Xml และการใช้@DataProvider
-
In @พารามิเตอร์+TestNG. Xml สามารถวางพารามิเตอร์ในระดับชุดและระดับการทดสอบได้ ถ้า
มีการประกาศชื่อพารามิเตอร์เดียวกันในทั้งสองแห่ง พารามิเตอร์ระดับการทดสอบจะได้รับการตั้งค่ามากกว่าพารามิเตอร์ระดับชุด
- โดยใช้ @Parameter+TestNG.xml สามารถตั้งค่าได้ครั้งละหนึ่งค่าเท่านั้น แต่ @DataProvider จะส่งคืน อาร์เรย์ 2d ของ Object.
- หาก DataProvider มีอยู่ในคลาสอื่น ดังนั้นคลาสที่มีวิธีการทดสอบอยู่ผู้ให้บริการข้อมูล ควรจะเป็น วิธีการคงที่.
- มีพารามิเตอร์สองตัวที่รองรับโดย ผู้ให้บริการข้อมูล เป็น วิธี และ ITestContext.