• Selenium Video Tutorials

Selenium - 数据驱动框架



Selenium Webdriver 可用于开发基于数据驱动框架的测试脚本。数据驱动框架主要用于创建依赖于外部数据源数据的测试用例。此外部数据源可以是任何具有 .txt、.properties、.xlsx、.xls、.csv 扩展名的文件,也可以借助数据提供者。

数据驱动框架是一种将测试用例与数据集分离的框架。此外,它还提供了针对多个数据集运行同一测试用例的功能。由于测试代码实现和测试数据彼此独立,因此可以在不影响实现逻辑的情况下修改数据集,反之亦然。

为什么要使用数据驱动测试框架?

在数据驱动测试框架中,可以针对同一测试用例运行多个数据集,因此可以在无需额外代码的情况下针对广泛的数据范围测试同一应用程序。因此,代码只需开发一次即可重复使用多次。

数据驱动测试框架允许多次执行测试用例,而无需增加测试用例的数量。有时,测试数据会自动生成,这允许应用程序针对广泛的随机数据集进行测试。在这种情况下,数据驱动测试框架确保产品更健壮和高质量。

数据驱动测试框架的优势

数据驱动测试框架通过确保更结构化的执行来实现测试用例的最佳利用。这也有助于缩短测试周期,同时确保产品质量。包含各种函数、方法和操作的测试实现代码在数据驱动测试框架中使用广泛的数据集进行测试。

数据驱动测试框架与关键字驱动测试框架的区别

数据驱动框架和关键字驱动框架之间存在一些差异。关键字驱动框架更容易维护,因为在测试数据、关键字和实现逻辑层之间存在更多抽象,而数据驱动框架比关键字驱动框架更难以维护,因为抽象只存在于测试数据和测试脚本之间。

与数据驱动框架相比,关键字驱动框架需要更系统的规划,因为在数据驱动框架中,我们只是将测试数据与测试脚本分离。

示例 1 - 使用 Excel 进行数据驱动

让我们举一个使用 Apache POI 库使用 Excel 执行数据驱动测试的例子。让我们以名为 **DetailsStudent.xlsx** 的 Excel 文件为例,我们将从该 Excel 文件中读取值并将这些数据输入到下面的注册页面,成功后,我们将在单元格(同一行和 E 列)中写入文本 **测试用例:通过**。如果未成功,我们将在同一单元格中写入文本 **测试用例:失败**。

Selenium Data Driven Framework 1

下图显示了注册页面,我们将在此页面中从 **DetailsStudent.xlsx** 文件中输入 **全名:**、**姓氏:**、**用户名:** 和 **密码** 字段中的数据。 成功后,我们将在单元格(同一行和 E 列)中写入文本 **测试用例:通过**。如果未成功,我们将在同一单元格中写入文本 **测试用例:失败**。

Selenium Data Driven Framework 2

**请注意** - **DetailsStudent.xlsx** Excel 文件放置在项目下的 **Resources** 文件夹中,如下图所示。

Selenium Data Driven Framework 3

如何安装 Apache POI?

**步骤 1** - 从以下链接添加 Apache POI Common 依赖项 -

https://mvnrepository.com/artifact/org.apache.poi/poi.

**步骤 2** - 从以下链接添加基于 OPC 和 OOXML 架构的 Apache POI API 依赖项 -

https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml.

**步骤 3** - 保存包含所有依赖项的 pom.xml 并更新 Maven 项目。

**ExcelReadWrite.java** 中的代码实现

package org.example;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class ExcelReadWrite {
   public static  void main(String args[]) throws IOException {
      
      // identify location of .xlsx file
      File f = new File("./Resources/DetailsStudent.xlsx");
      FileInputStream i = new FileInputStream(f);

      // instance of XSSFWorkbook
      XSSFWorkbook w = new XSSFWorkbook(i);

      // create sheet in XSSFWorkbook with name Details1
      XSSFSheet s = w .getSheet("Details1");

      // handle total rows in XSSFSheet
      int r = s.getLastRowNum() - s.getFirstRowNum();

      // Initiate the Webdriver
      WebDriver driver = new ChromeDriver();

      // adding implicit wait of 15 secs
      driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

      // Opening the webpage where we will identify elements
      driver.get("https://tutorialspoint.com/selenium/practice/register.php#");

      //Identify elements for registration
      WebElement fname = driver.findElement(By.xpath("//*[@id='firstname']"));
      WebElement lname = driver.findElement(By.xpath("//*[@id='lastname']"));
      WebElement uname = driver.findElement(By.xpath("//*[@id='username']"));
      WebElement pass = driver.findElement(By.xpath("//*[@id='password']"));
      WebElement btn = driver.findElement(By.xpath("//*[@id='signupForm']/div[5]/input"));

      // loop through rows, read and enter values in form
      for(int j = 1; j <= r; j++) {
         fname.sendKeys(s.getRow(j).getCell(0).getStringCellValue());
         lname.sendKeys(s.getRow(j).getCell(1).getStringCellValue());
         uname.sendKeys(s.getRow(j).getCell(2).getStringCellValue());
         pass.sendKeys(s.getRow(j).getCell(3).getStringCellValue());

         // submit registration form
         btn.click();

         // verify form submitted
         WebElement fname1 = driver.findElement(By.xpath("//*[@id='firstname']"));
         String value = fname1.getAttribute("value");

         // create cell at Column 4 to write values in excel
         XSSFCell c = s.getRow(j).createCell(4);

         // write results in excel
         if (value.isEmpty()) {
            c.setCellValue("Test Case: PASS");
         } else {
            c.setCellValue("Test Case: FAIL");
         }

         // complete writing value in excel
         FileOutputStream o = new FileOutputStream("./Resources/DetailsStudent.xlsx");
         w.write(o);
      }

      // closing workbook object
      w.close();

      // Quitting browser
      driver.quit();
   }
}

添加到 pom.xml 的依赖项。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.example</groupId>
   <artifactId>SeleniumJava</artifactId>
   <version>1.0-SNAPSHOT</version>
   
   <properties>
      <maven.compiler.source>16</maven.compiler.source>
      <maven.compiler.target>16</maven.compiler.target>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
   
   <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
   <dependencies>
      <dependency>
         <groupId>org.seleniumhq.selenium</groupId>
         <artifactId>selenium-java</artifactId>
         <version>4.11.0</version>
      </dependency>

      <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
      <dependency>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi</artifactId>
         <version>5.2.5</version>
      </dependency>
      
      <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
      <dependency>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-ooxml</artifactId>
         <version>5.2.5</version>
      </dependency>
   </dependencies>
</project>

输出

Process finished with exit code 0

在上面的示例中,我们读取了整个 Excel 文件,并在第五列的单元格中写入值 **测试用例:通过**。

最后,收到消息 **Process finished with exit code 0**,表示代码成功执行。

Selenium Data Driven Framework 4

如上图所示,在测试运行后,**测试用例:通过** 被写入 **DetailsStudent.xlsx** Excel 文件的第 5 列中,这与 Excel 中提供的注册数据有关。

示例 2 - 使用 TestNG DataProvider 进行数据驱动

让我们举一个使用 TestNG 的默认功能(称为 DataProvider)进行数据驱动测试的例子。DataProvider 用于向任何测试方法提供数据。

我们将使用 TestNG DataProvider 在与前面示例相同的注册页面中输入值,在该页面中,我们将使用 TestNG DataProvider 输入 **全名:**、**姓氏:**、**用户名:** 和 **密码** 字段中的数据。

如何安装 TestNG?

  • 在系统中安装 Java(版本高于 8),并使用命令:java -version 检查它是否存在。如果安装已成功完成,则将显示已安装的 Java 版本。

  • 在系统中安装 Maven,并使用命令:mvn -version 检查它是否存在。如果安装已成功完成,则将显示已安装的 Maven 版本。

  • 安装任何 IDE,例如 Eclipse、IntelliJ 等。

  • 从以下链接添加 TestNG 依赖项:https://mvnrepository.com/artifact/org.testng/testng

**DataTest.java** 中的代码实现

package CrossBrw;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.*;
import java.util.concurrent.TimeUnit;

public class DataTest {
   WebDriver driver;
   @BeforeTest
   public void setup() throws Exception {

      // Initiate the Webdriver
      driver = new ChromeDriver();

      // adding implicit wait of 12 secs
      driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

      // Opening the webpage
      driver.get("https://tutorialspoint.com/selenium/practice/register.php#");
   }

   @Test(dataProvider = "registration-data")
   public void userRegistration
   (String fname1, String lname1, String uname1, String pass1) {

      //Identify elements for registration
      WebElement fname = driver.findElement(By.xpath("//*[@id='firstname']"));
      WebElement lname = driver.findElement(By.xpath("//*[@id='lastname']"));
      WebElement uname = driver.findElement(By.xpath("//*[@id='username']"));
      WebElement pass = driver.findElement(By.xpath("//*[@id='password']"));

      // enter details from data provider
      fname.sendKeys(fname1);
      lname.sendKeys(lname1);
      uname.sendKeys(uname1);
      pass.sendKeys(pass1);

      // get values entered
      String text = fname.getAttribute("value");
      String text1 = lname.getAttribute("value");
      String text2 = uname.getAttribute("value");
      String text3 = pass.getAttribute("value");

      System.out.println("Entered first name: " + text);
      System.out.println("Entered last name: " + text1);
      System.out.println("Entered username: " + text2);
      System.out.println("Entered password: " + text3);
   }
   @DataProvider (name = "registration-data")
   public Object[][] registrationData(){
      return new Object[][]
      { {"Ram", "Ganesh", "ABC", "Password12"} };
   }
   @AfterTest
   public void teardown() {
   
      // quitting browser
      driver.quit();
   }
}

添加到 pom.xml 的依赖项。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.example</groupId>
   <artifactId>SeleniumJava</artifactId>
   <version>1.0-SNAPSHOT</version>
   
   <properties>
      <maven.compiler.source>16</maven.compiler.source>
      <maven.compiler.target>16</maven.compiler.target>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
   
   <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
   <dependencies>
      <dependency>
         <groupId>org.seleniumhq.selenium</groupId>
         <artifactId>selenium-java</artifactId>
         <version>4.11.0</version>
      </dependency>
      
      <!-- https://mvnrepository.com/artifact/org.testng/testng -->
      <dependency>
         <groupId>org.testng</groupId>
         <artifactId>testng</artifactId>
         <version>7.9.0</version>
         <scope>test</scope>
      </dependency>
   </dependencies>
</project>

输出

Entered first name: Ram
Entered last name: Ganesh
Entered username: ABC
Entered password: Password12

===============================================
Default Suite
Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
===============================================

Process finished with exit code 0

在上面的示例中,我们从 DataProvider 中提供的数据中在注册页面输入数据,并在控制台中获得输入的值以及消息 - **输入的姓名:Ram,输入的姓氏:Ganesh,输入的用户名:ABC** 和 **输入的密码:Password12**。

控制台中的结果显示 **Total tests run: 1**,因为只有一个方法带有 @Test 注解 - userRegisterration()。

最后,收到消息 **Passes: 1** 和 **Process finished with exit code 0**,表示代码成功执行。

本教程全面介绍了 Selenium Webdriver - 数据驱动框架。我们首先介绍什么是数据驱动框架,为什么要使用数据驱动框架,数据驱动框架的优势是什么,数据驱动框架与关键字驱动框架的区别是什么,并通过示例演示了如何使用 Excel 和 TestNG 中的 DataProvider 以及 Selenium Webdriver 实现数据驱动框架。

这使您掌握了 Selenium Webdriver 中数据驱动框架的深入知识。明智的做法是继续练习您所学到的内容,并探索与 Selenium 相关的其他内容,以加深您的理解并扩展您的视野。

广告