在Selenium中实现数据驱动的测试

411 阅读9分钟

在Selenium中实现数据驱动的测试

发布者::Ramit Dhamija inSoftware Development October 30th, 2021 0 Views

数据驱动测试是一种常用的软件测试方法,测试数据在外部以电子表格或表格的形式存储。数据驱动测试使测试团队能够针对从精确表格中提供的大量测试数据执行功能测试,并在相同或不同表格中输出测试结果。它也被称为参数化测试或表驱动测试。

当以下问题开始出现时,数据驱动测试通常会出现在画面中。

  • 测试数据散落在多个测试脚本中
  • 对于不同的测试环境,不同的测试数据需要在测试脚本中维护。
  • 测试数据的维护涉及到大量的人力资源,需要花费大量的时间和人工。

对于针对大量数据和多个环境运行测试的测试团队来说,采用数据驱动的测试方法很重要。这将减少添加和维护现有测试数据的努力和成本,并进一步在业务流程逻辑变化的情况下改变测试数据的间隔。此外,数据驱动测试可以帮助分析对特定测试环境更重要的数据。这种分析定义了对特定数据进行测试的清晰图像。

Selenium中的数据驱动测试

在转向硒的数据驱动测试之前,让我们快速了解测试自动化框架到底是什么。

测试自动化框架是一套规则或工具,被纳入自动化测试案例。它不仅仅是一个单一的工具,而是一个平行运行的工具和流程的集合,以实现测试自动化。自动化框架是一个完整的功能组合,如测试数据、库、依赖性和可实现的模块。

自动化框架中的规则集定义了编码标准、测试数据处理技术、存储和显示测试结果的方式以及对象库。

Selenium中自动化框架的类型。

  1. 数据驱动测试框架: 它用于将测试数据与测试脚本分离。同样的测试脚本可以进一步针对庞大的测试数据集顺序或平行地执行,而不是单一的硬编码测试数据。
  2. 关键字驱动的测试框架: 这是一种脚本方法,利用表格或电子表格来维护被测应用程序的关键字。关键字定义了执行每个步骤所需的动作集。
  3. 混合测试框架: 它是数据驱动和关键字驱动测试框架的组合,其中关键字和测试数据都在外部维护,可能是以表格或电子表格的形式。这种框架也可以让非技术专业人员参与进来,因为他们可以看一下关键词和测试数据,以获得对测试脚本流程的基本了解。

什么是Selenium的数据驱动框架?

一般来说,当一个应用程序被手动测试时,不同的场景会针对不同的测试数据进行。用于手工测试的测试数据通常存储在一些文件中,如excel文件,csv文件,文本文件或可能是数据库中。

同样,对于针对大量的测试数据运行自动测试,我们可以有不同的存储库/数据库/文件来维护测试数据。selenium数据驱动框架被用来驱动外部化数据的测试脚本。外部化的数据可能来自数据表,如xls、xlsx和csv文件。

Selenium的数据驱动框架是一种普遍采用的技术,将 "测试数据集 "与实际 "测试案例 "分开。由于测试数据是在外部维护的,测试数据可以随时被修改而不需要对代码做任何修改。

例如,如果一个登录页面需要针对具有字符、数字和字母数字组合的多个测试数据进行测试,这些测试数据可以存储在excel或csv中,以便在执行时可以将相同的数据输入测试脚本。

Selenium是一个广泛使用的Web应用程序的开源自动化测试框架,然而,它不支持任何预定义的功能,可以用来执行 - 创建、读取、更新和删除(CRUD)的外部维护的测试数据,从excel、csv、数据库等。值得庆幸的是,有多种工具/api可以为测试脚本提供外部测试数据,并可以根据项目要求对测试数据进行其他相关操作。

在这篇文章中,我们将了解Apache POI API,它可以与Selenium集成来执行CRUD操作。

数据驱动框架的优点和缺点

数据驱动测试框架的优点。

  • 允许在回归测试中针对巨大的测试数据集测试一个应用程序
  • 测试数据可以在外部保持在一个文件中,并且可以与测试脚本分开保存。
  • 允许维护测试数据的输入和特定测试数据的结果输出的记录。
  • 通过对多个测试数据执行测试脚本,有助于提高测试效率和增加测试覆盖率
  • 测试脚本中的任何变化都不会影响测试数据,反之亦然。
  • 同一测试方法可以用不同的测试数据多次执行,而不是为多个测试数据分别创建/调用相同的测试方法。
  • 外部测试数据甚至可以由非技术专业人员审查,因为他们不需要挖掘代码。

数据驱动测试框架的缺点。

  • 在大数据集的情况下,数据读取和验证可能会消耗大量的时间。
  • 在将Selenium与数据驱动框架整合时,代码量会增加
  • 随着时间的推移,数据驱动测试框架的代码可能需要维护。
  • 开发数据驱动测试框架需要高水平的技术技能。
  • 对于不同的测试模块,需要创建不同的测试数据文件

使用Apache POI库实现Selenium的数据驱动框架

Apache POI(Poor Obfuscation Implementation)是一个由Apache软件基金会开发的开源库。它是构建Selenium数据驱动框架的最理想的API。Apache POI API使我们能够使用Java程序对excel文件进行操作。简而言之,我们可以用Apache POI函数轻松地对excel进行读写操作。通过这样的读写操作,外部维护的测试数据可以顺利地提供给测试脚本。

用Apache POI实现数据驱动框架的先决条件。

  1. Eclipse, Intellij或任何IDE
  2. JDK
  3. Microsoft excel或LibreOffice excel
  4. TestNG、Selenium、Apache POI的Maven依赖项

测试场景: 针对不同的工作邮箱和密码验证pCloudy登录系统

  1. 直接进入pCloudy登录页面
  2. 输入工作邮箱
  3. 输入密码
  4. 点击登录
  5. 获取登录后的登陆页面的标题
  6. 在excel中设置相应测试数据的测试案例结果

在实现Selenium的数据驱动框架之前,从外部维护测试数据是很重要的。为了实现上述情况的自动化,我们可以创建一个具有工作电子邮件和相应密码的excel表。我们的目标是将行和列中的所有数据,即工作电子邮件和密码,输入测试脚本,以实现最大的测试覆盖率。

现在让我们详细了解一下用Selenium实现数据驱动框架。

  1. **1.Pom.xml--**项目对象模型文件包含了maven项目的信息和配置,如依赖项、插件、目标、构建目录等。以下是进行TestNG、Selenium和Apache POI所需的几个依赖项。
<dependencies>
		<dependency>
			<groupId>org.testng</groupId>
			<artifactId>testng</artifactId>
			<version>6.10</version>
		</dependency>

		<dependency>
			<groupId>io.github.bonigarcia</groupId>
			<artifactId>webdrivermanager</artifactId>
			<version>3.8.1</version>
			<scope>compile</scope>
		</dependency>
		
		<dependency>
			<groupId>org.seleniumhq.selenium</groupId>
			<artifactId>selenium-java</artifactId>
			<version>2.53.1</version>
		</dependency>
		
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>4.1.2</version>
		</dependency>
                <dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>4.1.2</version>
			<scope>test</scope>
		</dependency>
	        </dependencies>
  • 2. **ExcelOperations类:**这是一个实用类,包括对excel进行的所有操作。

  • setExcelFile : 初始化一个工作簿并使用excel文件路径设置excel文件。

  • getCellData : 读取excel中的测试数据。使用行号和列号读取excel中保存的测试数据。

  • getRowCountInSheet : 获取工作表中占用的行数。

  • setCellValue : 使用行号和列号将数值写入excel表的单元格中。

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelOperations {

	private static HSSFWorkbook workbook;
    private static HSSFSheet sheet;
    private static HSSFRow row;
    private static HSSFCell cell;

   public void setExcelFile(String excelFilePath,String sheetName)
 throws IOException {
       File file =    new File(excelFilePath);
       
       //Creating object of FileInputStream class to read excel
       FileInputStream inputStream = new FileInputStream(file);
       
       //creating a workbook instance (.xls file)
       workbook=new HSSFWorkbook(inputStream);
       
       sheet=workbook.getSheet(sheetName);
   }

    public String getCellData(int rowNumber,int columnNumber){
       //getting the cell value from rowNumber and column Number
        cell =sheet.getRow(rowNumber).getCell(columnNumber);
        
        return cell.getStringCellValue();
    }

    public int getRowCountInSheet(){
    	//getting the count of rows in sheet
       int rowcount = sheet.getLastRowNum()-sheet.getFirstRowNum();
       return rowcount;
    }

    public void setCellValue(int rowNum,int columnNum,String 
cellValue,String excelFilePath) throws IOException {
    	//creating a new cell in row and writing value to it      
    	sheet.getRow(rowNum).createCell(columnNum).setCellValue(cellValue);
        
    	FileOutputStream outputStream = new FileOutputStream(excelFilePath);
    	workbook.write(outputStream);
    }
    
}
  • **3.常量类:**这个类的创建是为了分离测试脚本常量,以便这些常量可以在整个测试套件中重复使用。创建常量类的主要优点是,如果需要对值进行任何改变,只需在常量类中修改值,而不是妨碍不同的测试脚本。我们已经在下面的常量类中指定了测试应用程序的URL,测试数据的Excel文件路径,测试数据的Excel文件名称。
public class Constants {
	
   public static final String URL = "https://device.pcloudy.com/login";
   public static final String TestData_FILEPATH = "/home/ramit/Documents/";
   public static final String TestData_FILENAME = "LoginTestData.xls";

}
  • 4.pCloudyLogin类: 这是一个测试脚本类,针对存储在excel文件中的多个工作邮件和密码的测试数据验证pCloudy登录系统。excelOperations类的方法在这个类中被调用,以便从外部化的excel文件中向这个测试脚本提供数据。此外,在针对每个测试数据执行测试案例后,相应的测试结果将被自动添加到同一表格中。
import java.io.IOException;
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.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;

public class pCloudyLogin {
	
    static ExcelOperations excel = new ExcelOperations();    
    static String excelFilePath 
=Constants.TestData_FILEPATH+Constants.TestData_FILENAME;
	static WebDriver driver;
	
	@BeforeClass
	public void setup() 
	{
		  WebDriverManager.chromedriver().setup(); 
		  driver = new ChromeDriver();
	}


   @Test
   public void loginTest() throws InterruptedException, IOException
   {
	  
	   driver.get(Constants.URL);
	   driver.manage().window().maximize();
	   driver.manage().deleteAllCookies();
	   
	   excel.setExcelFile(excelFilePath, "LoginTestData");

	   
	   for(int i=1;i<=excel.getRowCountInSheet();i++)
       {
		   WebElement workEmail =
 driver.findElement(By.id("userId"));
		   workEmail.clear();
		   workEmail.sendKeys(excel.getCellData(i, 0));
		  
		   WebElement passWord = 
driver.findElement(By.name("password"));
		   passWord.clear();
		   passWord.sendKeys(excel.getCellData(i, 1));
		   
		   WebElement createAccountButton =
 driver.findElement(By.id("loginSubmitBtn"));
		   createAccountButton.click();
		   
		   String title = driver.getTitle();
		   if(title.equals("HubSpot Form"))
		   {
			   excel.setCellValue(i, 2, "Passed", excelFilePath);
		   }
		   else
		   {
			   excel.setCellValue(i, 2, "Failed", excelFilePath);
		   }	
       }
	   
   }
   
   @AfterClass
   public void tearDown()
   {
	  driver.quit();
   }
}

输出。

由我们JCG项目的合伙人Ramit Dhamija授权发表在Java Code Geeks上。点击这里查看原文。在Selenium中实现数据驱动的测试

Java Code Geeks的撰稿人所表达的观点属于他们自己。

Selenium 测试 2021-10-30

吕晓明