Dataprovider & TestNG XML: Tham số hóa trong Selenium (Ví dụ)

Mục lục:

Anonim

Khi chúng tôi tạo ra phần mềm, chúng tôi luôn mong muốn nó sẽ hoạt động khác với một bộ dữ liệu khác. Khi nói đến Kiểm tra cùng một phần mềm, chúng ta không thể thiếu công bằng khi kiểm tra nó chỉ với một bộ dữ liệu. Ở đây một lần nữa, chúng tôi cần xác minh rằng hệ thống của chúng tôi đang sử dụng tất cả các tập hợp các kết hợp được mong đợi để hỗ trợ. Để làm được điều đó, chúng ta cần tham số hóa các scipts thử nghiệm của mình. Đây là Parameterization trong hình.

Tham số hóa trong Selenium

Tham số hóa trong Selenium là một quá trình để tham số hóa các tập lệnh thử nghiệm để chuyển nhiều dữ liệu đến ứng dụng trong thời gian chạy. Nó là một chiến lược thực thi tự động chạy các trường hợp thử nghiệm nhiều lần bằng cách sử dụng các giá trị khác nhau. Khái niệm đạt được bằng cách tham số hóa các tập lệnh thử nghiệm được gọi là Thử nghiệm theo hướng dữ liệu .

Trong hướng dẫn này, bạn sẽ học-

  • Loại tham số trong TestNG-
  • Chú thích tham số với Testng.xml
  • Xử lý sự cố
  • Các thông số sử dụng Dataprovider
  • Gọi DataProvider từ lớp khác
  • Các loại tham số trong Dataprovider

Loại tham số trong TestNG-

Để làm rõ hơn việc tham số hóa, chúng ta sẽ xem xét các tùy chọn tham số hóa trong một khuôn khổ phổ biến nhất cho Selenium Webdriver - TestNG .

hai cách mà chúng ta có thể đạt được tham số hóa trong TestNG

  1. Với sự trợ giúp của chú thích Tham sốtệp XML TestNG .

  2. Với sự trợ giúp của chú thích DataProvider .

Các thông số từ Testng.xml có thể là bộ hoặc cấp thử nghiệm

Tham số từ DataProvider có thể lấy Method và ITestContext làm tham số.

Hãy nghiên cứu chúng một cách chi tiết -

Chú thích tham số trong TestNG

Chú thích tham số trong TestNG là một phương thức được sử dụng để chuyển các giá trị cho các phương thức thử nghiệm dưới dạng đối số bằng cách sử dụng tệp .xml. Người dùng có thể được yêu cầu chuyển các giá trị cho các phương pháp thử nghiệm trong thời gian chạy. Phương thức chú thích @Parameters có thể được sử dụng trong bất kỳ phương thức nào có chú thích @Test, @Before, @After hoặc @Factory.

Chú thích tham số với Testng.xml

Chọn tham số hóa bằng cách sử dụng chú thích khi bạn muốn xử lý độ phức tạp và số lượng kết hợp đầu vào ít hơn.

Hãy xem cách này hoạt động như thế nào

Kịch bản thử nghiệm

Bước 1) Khởi chạy trình duyệt và truy cập Google.com

Bước 2) Nhập từ khóa tìm kiếm

Bước 3) Xác minh giá trị đã nhập giống với giá trị được cung cấp bởi dữ liệu thử nghiệm của chúng tôi

Bước 4) Lặp lại 2 & 3 cho đến khi tất cả các giá trị được nhập

Tác giả thử nghiệm SearchKey
Guru99 Ấn Độ
Krishna Hoa Kỳ
Bhupesh Trung Quốc

Đây là một ví dụ về cách thực hiện mà KHÔNG CÓ tham số

thông số gói;nhập org.testng.annotations.Test;nhập org.testng.AssertJUnit;nhập java.util.concurrent.TimeUnit;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.WebElement;nhập org.openqa.selenium.firefox.FirefoxDriver;lớp công khai NoParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Trình điều khiển WebDriver;@Kiểm trapublic void testNoParameter () ném InterruptException {String tác giả = "guru99";String searchKey = "india";System.setProperty ("webdriver.gecko.driver", driverPath);driver = new FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Tìm kiếm văn bản trong hộp văn bản googlesearchText.sendKeys (searchKey);System.out.println ("Chào mừng ->" + tác giả + "Khóa tìm kiếm của bạn là ->" + searchKey);System.out.println ("Luồng sẽ ngủ ngay bây giờ");Thread.sleep (3000);System.out.println ("Giá trị trong Hộp tìm kiếm của Google =" + searchText.getAttribute ("giá trị") + "::: Giá trị được cung cấp bởi input =" + searchKey);// xác minh giá trị trong hộp tìm kiếm của googleAssertJUnit.assertTrue (searchText.getAttribute ("giá trị"). EqualsIgnoreCase (searchKey));}}

Một nghiên cứu, ví dụ trên. Chỉ cần tưởng tượng mã sẽ trở nên phức tạp như thế nào khi chúng ta làm điều này cho 3 kết hợp đầu vào

Bây giờ, hãy tham số hóa điều này bằng TestNG

Để làm như vậy, bạn sẽ cần phải

  • Tạo một tệp XML sẽ lưu trữ các tham số
  • Trong thử nghiệm, hãy thêm chú thích @Parameters

Đây là mã hoàn chỉnh

Mức độ kiểm tra TestNG.xml

Tệp ParameterWithTestNGXML.java

thông số gói;nhập org.testng.AssertJUnit;nhập java.util.concurrent.TimeUnit;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.WebElement;nhập org.openqa.selenium.firefox.FirefoxDriver;nhập org.testng.annotations.Optional;nhập org.testng.annotations.Parameters;nhập org.testng.annotations.Test;public class ParameterWithTestNGXML {String driverPath = "C: \\ geckodriver.exe";Trình điều khiển WebDriver;@Kiểm tra@Parameters ({"author", "searchKey"})public void testParameterWithXML (@Optional ("Abc") String author, String searchKey) ném InterruptException {System.setProperty ("webdriver.gecko.driver", driverPath);driver = new FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");WebElement searchText = driver.findElement (By.name ("q"));// Tìm kiếm văn bản trong hộp văn bản googlesearchText.sendKeys (searchKey);System.out.println ("Chào mừng ->" + tác giả + "Khóa tìm kiếm của bạn là ->" + searchKey);System.out.println ("Luồng sẽ ngủ ngay bây giờ");Thread.sleep (3000);System.out.println ("Giá trị trong Hộp tìm kiếm của Google =" + searchText.getAttribute ("giá trị") + "::: Giá trị được cung cấp bởi input =" + searchKey);// xác minh giá trị trong hộp tìm kiếm của googleAssertJUnit.assertTrue (searchText.getAttribute ("giá trị"). EqualsIgnoreCase (searchKey));}}

Hướng dẫn chạy script, chọn file XML và Run as Test NG Suite

Nhấp chuột phải vào tệp .xml -> Run as -> Testng Suite (Lưu ý: Suite)

Bây giờ, các tham số có thể được xác định ở 2 cấp độ

  1. Cấp bộ - Các tham số bên trong thẻ của tệp XML TestNG sẽ là một tham số cấp bộ.
  2. Mức thử nghiệm - Các tham số bên trong thẻ của tệp XML thử nghiệm sẽ là một tham số mức Kiểm tra.

Đây là bài kiểm tra tương tự với các thông số cấp bộ

LƯU Ý: Trong trường hợp nếu tên thông số giống nhau ở cấp độ bộ và cấp độ thử nghiệm thì thông số cấp độ thử nghiệm sẽ được ưu tiên hơn cấp độ bộ. Vì vậy, trong trường hợp đó, tất cả các lớp bên trong mức thử nghiệm đó sẽ chia sẻ tham số được ghi đè và các lớp khác nằm ngoài mức thử nghiệm sẽ chia sẻ tham số mức bộ.

Xử lý sự cố

Sự cố # 1 Giá trị tham số trong testng.xml không thể được đánh máy cho tham số của phương pháp thử nghiệm tương ứng, nó sẽ gây ra lỗi.

Hãy xem xét ví dụ sau

Ở đây, thuộc tính 'author' bằng với 'Guru99' là một chuỗi và trong phương pháp thử nghiệm tương ứng, thuộc tính này mong đợi một giá trị nguyên, vì vậy chúng ta sẽ nhận được một ngoại lệ ở đây.

Vấn đề # 2 @Parameters của bạn không có giá trị tương ứng trong testing.xml.

Bạn có thể giải quyết tình huống này bằng cách thêm chú thích @optional vào tham số tương ứng trong phương thức thử nghiệm.

Sự cố # 3: Bạn muốn kiểm tra nhiều giá trị của cùng một tham số bằng Testng.xml

Câu trả lời đơn giản là điều này không thể được thực hiện! Bạn có thể có nhiều tham số khác nhau, nhưng mỗi tham số chỉ có thể có một giá trị duy nhất. Điều này giúp ngăn chặn các giá trị mã hóa cứng vào tập lệnh. Điều này làm cho mã có thể được sử dụng lại. Hãy coi nó như các tệp cấu hình cho tập lệnh của bạn. Nếu bạn muốn sử dụng nhiều giá trị cho một tham số, hãy sử dụng DataProviders

Nhà cung cấp dữ liệu trong TestNG

Trình cung cấp dữ liệu trong TestNG là một phương pháp được sử dụng khi người dùng cần chuyển các tham số phức tạp. Các tham số phức tạp cần được tạo từ Java chẳng hạn như các đối tượng phức tạp, các đối tượng từ tệp thuộc tính hoặc từ cơ sở dữ liệu có thể được truyền bằng phương thức trình cung cấp dữ liệu. Phương thức được chú thích bởi @DataProvider và nó trả về một mảng các đối tượng.

Các thông số sử dụng Dataprovider

Chú thích @Parameters rất dễ dàng nhưng để kiểm tra với nhiều bộ dữ liệu, chúng ta cần sử dụng Trình cung cấp dữ liệu.

Để lấp đầy hàng nghìn biểu mẫu web bằng cách sử dụng khung thử nghiệm của chúng tôi, chúng tôi cần một phương pháp khác có thể cung cấp cho chúng tôi một tập dữ liệu rất lớn trong một luồng thực thi duy nhất.

Khái niệm hướng dữ liệu này đạt được nhờ chú thích @DataProvider trong TestNG.

Nó chỉ có một thuộc tính "tên" . Nếu bạn không chỉ định thuộc tính name thì tên của DataProvider sẽ giống với tên phương thức tương ứng.

Nhà cung cấp dữ liệu trả về một đối tượng JAVA hai chiều cho phương pháp thử nghiệm và phương pháp thử nghiệm, sẽ gọi M lần trong một mảng đối tượng kiểu M * N. Ví dụ: nếu DataProvider trả về một mảng 2 * 3 đối tượng, testcase tương ứng sẽ được gọi 2 lần với 3 tham số mỗi lần.

Hoàn thành ví dụ

thông số gói;nhập java.util.concurrent.TimeUnit;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.WebElement;nhập org.openqa.selenium.firefox.FirefoxDriver;nhập khẩu org.testng.Assert;nhập org.testng.annotations.BeforeTest;nhập org.testng.annotations.DataProvider;nhập org.testng.annotations.Test;public class ParameterByDataprovider {Trình điều khiển WebDriver;String driverPath = "C: \\ geckodriver.exe";@Trước khi kiểm trapublic void setup () {// Tạo đối tượng trình điều khiển firefoxSystem.setProperty ("webdriver.gecko.driver", driverPath);driver = new FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}/ ** Trường hợp thử nghiệm để xác minh hộp tìm kiếm của Google* Tác giả @param* @param searchKey* @throws InterruptException* /@Test (dataProvider = "SearchProvider")public void testMethod (String author, String searchKey) ném InterruptException {{WebElement searchText = driver.findElement (By.name ("q"));// giá trị tìm kiếm trong hộp tìm kiếm của googlesearchText.sendKeys (searchKey);System.out.println ("Chào mừng ->" + tác giả + "Khóa tìm kiếm của bạn là ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("giá trị");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Xác minh xem giá trị trong hộp tìm kiếm của google có đúng khôngAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** @return Object [] [] trong đó cột đầu tiên chứa 'tác giả'* và cột thứ hai chứa 'searchKey'* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider () {trả về đối tượng mới [] []{{"Guru99", "Ấn Độ"},{"Krishna", "Vương quốc Anh"},{"Bhupesh", "Hoa Kỳ"}}}}

Gọi DataProvider từ lớp khác

Theo mặc định, DataProvider nằm trong cùng một lớp nơi phương thức kiểm tra là hoặc lớp cơ sở của nó. Để đặt nó trong một số lớp khác, chúng ta cần đặt phương thức trình cung cấp dữ liệu là tĩnh và trong phương thức thử nghiệm, chúng ta cần thêm một thuộc tính dataProviderClass trong chú thích @Test .

Ví dụ về mã

Tham số TestClassDataproviderWithClassLevel.java

thông số gói;nhập java.util.concurrent.TimeUnit;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.WebElement;nhập org.openqa.selenium.firefox.FirefoxDriver;nhập khẩu org.testng.Assert;nhập org.testng.annotations.BeforeTest;nhập org.testng.annotations.Test;public class ParameterDataproviderWithClassLevel {Trình điều khiển WebDriver;String driverPath = "C: \\ geckodriver.exe";@Trước khi kiểm trapublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = new FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", dataProviderClass = DataproviderClass.class)public void testMethod (String author, String searchKey) ném InterruptException {WebElement searchText = driver.findElement (By.name ("q"));// Tìm kiếm văn bản trong hộp văn bản googlesearchText.sendKeys (searchKey);System.out.println ("Chào mừng ->" + tác giả + "Khóa tìm kiếm của bạn là ->" + searchKey);Thread.sleep (3000);// lấy văn bản từ hộp tìm kiếmString testValue = searchText.getAttribute ("giá trị");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// xác minh xem hộp tìm kiếm có giá trị chính xác khôngAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}

DataproviderClass.java

thông số gói;nhập org.testng.annotations.DataProvider;lớp công khai DataproviderClass {@DataProvider (name = "SearchProvider")public static Object [] [] getDataFromDataprovider () {trả về đối tượng mới [] [] {{"Guru99", "Ấn Độ"},{"Krishna", "Vương quốc Anh"},{"Bhupesh", "Hoa Kỳ"}}}}

Các loại tham số trong Dataprovider

Có hai loại tham số được hỗ trợ bởi phương thức DataProvider.

Phương pháp - Nếu SAME DataProvider hoạt động khác với phương pháp thử nghiệm khác, hãy sử dụng tham số Phương thức.

Trong ví dụ sau,

  • Chúng tôi kiểm tra xem tên phương thức có phải là testMethodA hay không.
  • Nếu có, trả về một bộ giá trị
  • Khác trả về một bộ giá trị khác
thông số gói;nhập java.lang.reflect.Method;nhập java.util.concurrent.TimeUnit;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.WebElement;nhập org.openqa.selenium.firefox.FirefoxDriver;nhập khẩu org.testng.Assert;nhập org.testng.annotations.BeforeTest;nhập org.testng.annotations.DataProvider;nhập org.testng.annotations.Test;public class ParameterByMethodInDataprovider {Trình điều khiển WebDriver;String driverPath = "C: \\ geckodriver.exe";@Trước khi kiểm trapublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = new FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider")public void testMethodA (String author, String searchKey) ném InterruptException {WebElement searchText = driver.findElement (By.name ("q"));// Tìm kiếm văn bản trong hộp tìm kiếmsearchText.sendKeys (searchKey);// In tác giả và chuỗi tìm kiếmSystem.out.println ("Chào mừng ->" + tác giả + "Khóa tìm kiếm của bạn là ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("giá trị");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Xác minh xem hộp văn bản của google có hiển thị giá trị chính xác khôngAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}@Test (dataProvider = "SearchProvider")public void testMethodB (String searchKey) ném InterruptException {{WebElement searchText = driver.findElement (By.name ("q"));// Tìm kiếm văn bản trong hộp tìm kiếmsearchText.sendKeys (searchKey);// Chỉ in chuỗi tìm kiếmSystem.out.println ("Chào mừng -> Người dùng không xác định Khóa tìm kiếm của bạn là ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("giá trị");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// Xác minh xem hộp văn bản của google có hiển thị giá trị chính xác khôngAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Tại đây DataProvider trả về giá trị trên cơ sở tên phương pháp thử nghiệm* @param m* @trở về** /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (Method m) {if (m.getName (). equalsIgnoreCase ("testMethodA")) {trả về đối tượng mới [] [] {{"Guru99", "Ấn Độ"},{"Krishna", "Vương quốc Anh"},{"Bhupesh", "Hoa Kỳ"}};}khác {trả về đối tượng mới [] [] {{ "Canada" },{ "Nga" },{ "Nhật Bản" }};}}}

Đây là đầu ra

ITestContext - Nó có thể sử dụng để tạo các tham số khác nhau cho các trường hợp thử nghiệm dựa trên các nhóm.

Trong cuộc sống thực, bạn có thể sử dụng ITestContext để thay đổi các giá trị tham số dựa trên Phương pháp kiểm tra, máy chủ, cấu hình của bài kiểm tra.

Trong ví dụ mã sau

  • Chúng tôi có 2 nhóm A & B
  • Mỗi phương pháp thử nghiệm được chỉ định cho một nhóm
  • Nếu giá trị của nhóm là A, một tập dữ liệu cụ thể được trả về
  • Nếu giá trị của nhóm là B, một tập dữ liệu khác được trả về
thông số gói;nhập java.util.concurrent.TimeUnit;nhập org.openqa.selenium.By;nhập org.openqa.selenium.WebDriver;nhập org.openqa.selenium.WebElement;nhập org.openqa.selenium.firefox.FirefoxDriver;nhập khẩu org.testng.Assert;nhập org.testng.ITestContext;nhập org.testng.annotations.BeforeTest;nhập org.testng.annotations.DataProvider;nhập org.testng.annotations.Test;public class ParameterByITestContextInDataprovider {Trình điều khiển WebDriver;String driverPath = "C: \\ geckodriver.exe";@BeforeTest (groups = {"A", "B"})public void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = new FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("https://google.com");}@Test (dataProvider = "SearchProvider", groups = "A")public void testMethodA (String author, String searchKey) ném InterruptException {{// tìm kiếm hộp văn bản của googleWebElement searchText = driver.findElement (By.name ("q"));// tìm kiếm một giá trị trên đósearchText.sendKeys (searchKey);System.out.println ("Chào mừng ->" + tác giả + "Khóa tìm kiếm của bạn là ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("giá trị");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// xác minh giá trị chính xác trong hộp tìm kiếmAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}@Test (dataProvider = "SearchProvider", groups = "B")public void testMethodB (String searchKey) ném InterruptException {{// tìm hộp tìm kiếm của googleWebElement searchText = driver.findElement (By.name ("q"));// tìm kiếm một giá trị trên đósearchText.sendKeys (searchKey);System.out.println ("Chào mừng -> Người dùng không xác định Khóa tìm kiếm của bạn là ->" + searchKey);Thread.sleep (3000);String testValue = searchText.getAttribute ("giá trị");System.out.println (testValue + ":::: + searchKey);searchText.clear ();// xác minh giá trị chính xác trong hộp tìm kiếmAssert.assertTrue (testValue.equalsIgnoreCase (searchKey));}}/ *** Ở đây DAtaProvider sẽ cung cấp mảng Đối tượng trên cơ sở ITestContext* @param c* @trở về* /@DataProvider (name = "SearchProvider")public Object [] [] getDataFromDataprovider (ITestContext c) {Đối tượng [] [] groupArray = null;for (Nhóm chuỗi: c.getIncludedGroups ()) {if (group.equalsIgnoreCase ("A")) {groupArray = new Object [] [] {{"Guru99", "Ấn Độ"},{"Krishna", "Vương quốc Anh"},{"Bhupesh", "Hoa Kỳ"}}phá vỡ;}else if (group.equalsIgnoreCase ("B")){groupArray = new Object [] [] {{ "Canada" },{ "Nga" },{ "Nhật Bản" }}}phá vỡ;}trả về groupArray;}}

Lưu ý: Nếu bạn trực tiếp chạy lớp testng của mình, trước tiên nó sẽ gọi trình cung cấp dữ liệu mà không thể lấy thông tin nhóm vì các nhóm không khả dụng. Nhưng thay vào đó, nếu bạn gọi lớp này qua testng.xml, nó sẽ có sẵn thông tin nhóm với ITestContext. Sử dụng XML sau để gọi kiểm tra

Tóm tắt :

  • Cần có tham số hóa để tạo Kiểm tra theo hướng dữ liệu .
  • TestNG hỗ trợ hai loại tham số hóa, sử dụng @ Parameter + TestNG.xml và sử dụng @DataProvider
  • Trong @ Parameter + TestNG.xml các thông số có thể được đặt ở cấp bộ và cấp thử nghiệm. Nếu

    Tên tham số giống nhau được khai báo ở cả hai nơi; thông số mức thử nghiệm sẽ được ưu tiên hơn thông số mức phù hợp.

  • sử dụng @ Tham số + TestNG.xml chỉ có thể đặt một giá trị tại một thời điểm, nhưng @DataProvider trả về một mảng 2d của Đối tượng .
  • Nếu DataProvider có mặt trong lớp khác thì lớp chứa phương thức kiểm tra, DataProvider phải là phương thức tĩnh .
  • Có hai tham số được hỗ trợ bởi DataProviderMethodITestContext.