Java自动化测试系列[v1.0.0][多种数据驱动实现附源码]

数据驱动测试是自动化测试中一种重要的设计模式,这种设计模式可以将测试数据和测试代码分开,实现数据与代码解耦,与此同时还能够实现一次任务中使用不同的数据来执行执行相同的测试脚本,因此它会使得我们的代码层次结构清晰,容易维护,并且大大降低了代码量

数据驱动是自动化测试中非常常见的一种设计模式,应用的场景非常多,无论是在Web自动化还是在接口自动化、单元测试,亦或是在数据分析应用领域的测试上都会得到非常广泛的使用,常见的比如Web自动化的登录功能、一些录入类的功能,再比如接口入参、单元测试的入参,甚至在数据类应用的大量数据输入及结果比较上

[数据驱动Data@Parameters]

测试代码

package com.davieyang.application;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;public class ParameterDemo {@Parameters({"newParameter"})@Testpublic void testCase(String para){System.out.println("参数值为" + para);}
}

配置执行

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<!--Parameters-->
<suite name="All Test Suite"><parameter name="newParameter" value="Niubility"/><test verbose="2" preserve-order="true" name="Demo"><classes><class name="com.davieyang.application.ParameterDemo"><methods><include name="testCase"/></methods></class></classes></test>
</suite>

[数据驱动Data@DataProvider]

TestNG单元测试框架提供了@DataProvider注解,利用这个注解可以很方便实现数据驱动,执行单元测试

package com.davieyang.application;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;public class DataDrivenDemo {@DataProvider(name = "data")public Object[][] dataProvider(){return new Object[][]{new Object[]{"账号为空", "密码正确", "账号不能为空"}, new Object[]{"账号正确", "密码为空", "密码不能为空"},new Object[]{"账号正确", "密码正确", "登陆成功"}};}@Test(dataProvider = "data")public void testCase(String username, String password, String prompt){System.out.println("If input:" + username + " 、" + password + ",提示" + prompt);}
}

[数据驱动DP&CSV]

package testNGWithDataDriven;import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;public class TestNGCsvDriven {public WebDriver driver;String baseUrl = "http://www.sogou.com";//使用注解DataProvider将数据集合命名为“csvTestData”@DataProvider(name = "csvTestData")public static Object[][]words() throws IOException{//调用类中的静态方法getTestData,获取CSV文件的测试数据return getTestData("F:\\TestNGWithDataDriven\\dataDriven\\src\\test\\java\\testData\\testData.csv");}@BeforeMethodpublic void beforeMethod(){driver = new ChromeDriver();}@Test(dataProvider = "csvTestData")public void testSearch(String searchWord1, String searchWord2, String searchResult){driver.get(baseUrl+"/");driver.findElement(By.id("query")).sendKeys(searchWord1+" "+searchWord2);driver.findElement(By.id("stb")).click();Assert.assertTrue(driver.getPageSource().contains(searchResult));}@AfterMethodpublic void afterMethod(){driver.quit();}//读取CSV文件的静态方法,使用CSV文件的绝对文件路径作为函数参数public static Object[][] getTestData(String fileName) throws IOException{List<Object[]> records = new ArrayList<Object[]>();String record;//设定UTF-8字符集,使用带缓冲区的字符输入流BufferedRead读取文件内容BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "GBK"));//忽略读取CSV文件的标题行file.readLine();/** 遍历读取文件中除去第一行外的其他所有内容* 并存储在名人records的ArrayList中* 每一个records中存储的对象为一个String数组*/while ((record=file.readLine())!=null){String fields[]=record.split(",");records.add(fields);}//关闭文件对象file.close();//定义函数返值, 即Object[][]//将存储测试数据的list转换为一个Object的二维数组Object[][] results = new Object[records.size()][];//设置二维数组每行的值,每行是一个Object对象for (int i = 0; i<records.size(); i++){results[i] = records.get(i);}return results;}
}

[数据驱动DP&MySql]

package testNGWithDataDriven;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.sql.*;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;public class TestNGDBDriven {public WebDriver driver;String baseUrl = "http://www.sogou.com";@DataProvider(name="testdata")public static Object[][] words() throws IOException{return getTestData("testdata");}@Test(dataProvider = "testdata")public void testSearch(String searchWord1, String searchWord2, String searchResult){driver.get(baseUrl + "/");driver.findElement(By.id("query")).sendKeys(searchWord1+" "+searchWord2);driver.findElement(By.id("stb")).click();Assert.assertTrue(driver.getPageSource().contains(searchResult));}@BeforeMethodpublic void beforeMethod(){driver = new ChromeDriver();}@AfterMethodprivate void afterMethod(){driver.quit();}public static Object[][] getTestData(String tablename) throws IOException{//声明Mysql数据库的驱动String dbDriver = "com.mysql.cj.jdbc.Driver";String url = "jdbc:mysql://127.0.0.1:3306/testng?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";String user = "root";String password = "root";//声明存储测试数据的List对象List<Object[]> records = new ArrayList<Object[]>();try{//设定驱动Class.forName(dbDriver);Connection conn = DriverManager.getConnection(url,user,password);if (!conn.isClosed())System.out.println("连接数据库成功");//创建statement对象Statement statement = conn.createStatement();//拼接sql语句String sql = String.format("Select * from %s", tablename);//声明结果集对象rs,用于存储执行sql语句返回的数据结果集ResultSet rs = statement.executeQuery(sql);//声明一个ResultSetMetaData对象ResultSetMetaData rsMetaData = rs.getMetaData();//调用ResultSetMetaData对象的getColumnCount方法获取数据行的列数int cols = rsMetaData.getColumnCount();/**使用next方法遍历数据结果集中的所有数据行*/while (rs.next()){//声明一个字符串型数组,数组大小使用数据行的列个数进行声明String fields[] = new String[cols];int col = 0;//遍历所有数据行中的所有数据,并存储在字符串数组中for (int colIdx = 0; colIdx<cols; colIdx++){fields[col] = rs.getString(colIdx+1);col++;}//将每一行的数据存储到字符串数组后,存储到records中records.add(fields);//输出数据行中的前三列内容,用于验证数据库内容是否正确读取System.out.println(rs.getString(1)+" "+rs.getString(2)+" "+rs.getString(3));}//关闭数据结果集对象rs.close();//关闭数据库连接conn.close();}catch (ClassNotFoundException e){System.out.println("未能找到Mysql的驱动类");e.printStackTrace();} catch (Exception e){e.printStackTrace();}//定义函数返回值,即Object[][]//将存储测试数据的list转换为一个Object的二维数组Object[][] results = new Object[records.size()][];//设置二维数组每行的值,每行是一个Object对象for (int i = 0; i<records.size(); i++){results[i] = records.get(i);}return results;}
}

[数据驱动DP&数组]

package testNGWithDataDriven;import java.util.concurrent.TimeUnit;
import org.testng.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;public class TestNGDriven {private static WebDriver driver;@DataProvider(name="searchWords")public static Object[][] words(){return new Object[][]{{"蝙蝠侠","主演","迈克尔"},{"超人","导演","唐纳"},{"生化危机","编剧","安德森"}};}@Test(dataProvider = "searchWords")public void test(String searchWord1, String searchWord2, String SearchResult){driver = new ChromeDriver();driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);driver.get("http://www.sogou.com");driver.findElement(By.id("query")).sendKeys(searchWord1+" "+searchWord2);driver.findElement(By.id("stb")).click();try{Thread.sleep(3000);}catch (InterruptedException e){e.printStackTrace();}Assert.assertTrue(driver.getPageSource().contains(SearchResult));driver.quit();}
}

[数据驱动DP&Excel]

package testNGWithDataDriven;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;public class TestNGExcelDriven {public WebDriver driver;String baseUrl = "http://www.sogou.com";@DataProvider(name="testData")public static Object[][] words() throws IOException{return getTestData("F:\\TestNGWithDataDriven\\dataDriven\\src\\test\\java\\testData", "testData.xlsx", "Sheet1");}@Test(dataProvider = "testData")public void testSearchExcel(String searchWord1, String searchWord2, String searchWord3, String searchResult){driver.get(baseUrl + "/");driver.findElement(By.id("query")).sendKeys(searchWord1+" "+searchWord2+" "+searchWord3);driver.findElement(By.id("stb")).click();Assert.assertTrue(driver.getPageSource().contains(searchResult));}@BeforeMethodpublic void beforeMethod(){driver = new ChromeDriver();}@AfterMethodprivate void afterMethod(){driver.quit();}public static Object[][] getTestData(String filePath, String fileName, String sheetName) throws IOException{File file = new File(filePath + "\\" + fileName);//创建FileInputStream对象用于读取Excel文件FileInputStream inputStream = new FileInputStream(file);//声明Workbook对象Workbook workbook = null;//获取文件名参数的扩展名,判断是.xlsx文件还是.xls文件String fileExtensionName = fileName.substring(fileName.indexOf("."));//如果是.xlsx,则用XSSFWorkbook对象进行实例化,如果是.xls则使用HSSFWorkbook对象进行实例化if (fileExtensionName.equals(".xlsx")){workbook = new XSSFWorkbook(inputStream);}else if (fileExtensionName.equals(".xls")) {workbook = new HSSFWorkbook(inputStream);}//通过sheetName参数生成Sheet对象Sheet sheet = workbook.getSheet(sheetName);//获取Excel数据文件Sheet1中数据的行数,getLastRowNum方法获取数据的最后一行行号//getFirstRowNum方法获取数据的第一行行号,相减之后算出数据的行数//Excel行和列都是从0开始int rowCount = sheet.getLastRowNum()-sheet.getFirstRowNum();//创建名为records的list对象来存储从Excel数据文件读取的数据List<Object[]> records = new ArrayList<Object[]>();//使用两个for循环遍历Excel数据文件除去第一行外所有数据//所以i从1开始,而不是从0开始for (int i = 1; i<rowCount+1; i++){Row row = sheet.getRow(i);//声明一个数组,用来存储Excel数据文件每行中的数据,数组的大小用getLastCellNum办法来进行动态声明,实现测试数据个数和数组大小相一致String fields[] = new String[row.getLastCellNum()];for (int j = 0; j<row.getLastCellNum();j++){//调用getCell和getStringCellValue方法获取Excel文件中的单元格数据fields[j] = row.getCell(j).getStringCellValue();}//将fields的数据兑现存储到records的list中records.add(fields);}//定义函数返回值,即Object[][]//将存储测试数据的list转换为一个Object的二维数组Object[][] results = new Object[records.size()][];//设置二维数组每行的值,每行是一个Object对象for (int i = 0; i<records.size(); i++){results[i] = records.get(i);}return results;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/235076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构学习 Leetcode300最长递增子序列

是我在学习动态规划时遇到的一道题。 题目&#xff1a; 一共有两种解法&#xff1a; 动态规划贪心 二分&#xff08;很难理解&#xff0c;我还没完全懂。。。&#xff09; 解法一&#xff1a;动态规划 思路&#xff1a; 状态&#xff1a;nums的前i个数的最长递增子序列。dp…

天空卫士协助蒙牛打造数据安全堡垒

“真正的世界领先不光是看规模和销量&#xff0c;还要看给行业、给消费者、给这个世界带来更多的价值与贡献。” ——蒙牛总裁 卢敏放蒙牛集团1999年成立于内蒙古自治区&#xff0c;总部位于呼和浩特&#xff0c;是全球乳业八强。除中国内地外&#xff0c;蒙牛产品还进入了东南…

量子登月计划!Infleqtion与日本JST研发中性原子量子计算机

​&#xff08;图片来源&#xff1a;网络&#xff09; 美国量子信息公司Infleqtion&#xff0c;已被日本科学技术振兴机构&#xff08;JST&#xff09;选定为“量子登月计划”唯一的外国量子计算合作伙伴。该计划旨在增强日本的量子技术能力&#xff0c;预计将在2050年之前对日…

LDO的工作原理

LDO&#xff0c;全称是低压差线性稳压器。LDO使用的是在线性区域内运行的晶体管或者场效应管。通过调节晶体管或场效应管两端的电压&#xff0c;产生经过调整过的输出电压。 但仅能使用在降压应用中&#xff0c;也就是输出电压必须小于输入电压。 LDO内部基本都是由4大部件构成…

前端加密后端校验(MD5)

前端加密后端校验&#xff08;MD5&#xff09; 因为md5是RSA数据安全公司开发的一种单向散列算法&#xff0c;非可逆&#xff0c;相同的明文产生相同的密文。因此校验可以比较加密之后的密文是否相同。 前端 md5 加密工具类&#xff08;js&#xff09;: https://pan.baidu.…

Java8中的流如何正确使用?

Java 8引入的流&#xff08;Stream&#xff09;是一种强大而灵活的处理数据集合的方式。流提供了一种声明性的编程风格&#xff0c;使得对数据的操作更为简洁和可读。以下是一些关于如何正确使用Java 8中的流的建议&#xff1a; 创建流&#xff1a; 使用Collection接口的stream…

翻译: 负责任的人工智能 Responsible AI

负责任的人工智能指的是以道德、值得信赖和社会负责任的方式开发和使用人工智能。许多开发者、企业和政府都关心这一点&#xff0c;并且一直在进行对话&#xff0c;也在努力确保人工智能的构建和使用是负责任的。由于对负责任的人工智能的所有这些关注和努力&#xff0c;我们在…

信息收集 - 端口

端口 -简介 端口是计算机网络中用于标识特定应用程序或服务的数字标识符。当计算机之间进行通信时,数据传输通过端口进行。每个端口都有一个唯一的数字值,范围从0到65535。 端口分为三类: 知名端口(Well-known Ports):范围从0到1023,这些端口通常被系统或公共服务使用。…

2. 运算符和表达式

2. 运算符和表达式 ​ 在Java中&#xff0c;使用算术运算符、-、*、/表示加、减、乘、除运算。 ​ 当参与/运算时&#xff0c;两个操作数都是整数时&#xff0c;表示整除法&#xff1b;否则表示浮点除法。 ​ 整数的求余操作&#xff08;取模&#xff09;用%表示。例如&…

求解器的可行解存在一个允许的误差范围

在模型计算中&#xff0c;由于浮点计算的存在&#xff0c;包括数学建模当中常用的大M法等&#xff0c;都可能会使得结果存在轻微偏离预期的情况。然而&#xff0c;对于一些一定范围内的轻微偏移&#xff0c;我们常常是能够接受的&#xff0c;因为这些轻微的偏移能通过简单的调整…

听力句子100

[ 30 ] Now, you are going to be working on / writing a series of music lessons / for very young children. 现在&#xff0c;你将为年幼的孩子们编写一系列音乐课程 As before, youll be basing / the degin of your lessons / on the existing research / into how c…

苏州和数荣获苏州市软件行业协会“杰出贡献理事单位”

2023年12月14日&#xff0c;苏州市软件行业协会第五届第五次理事会议在金螳螂大厦顺利召开。 苏州市工信局副局长万资平&#xff0c;苏州市工信局大数据处处长卢剑荣&#xff0c;苏州市工信局大数据处丁天龙&#xff0c;江苏省软件行业协会副秘书长夏冰莹&#xff0c;苏州市软…

【SpringBoot快速入门】(2)SpringBoot的配置文件与配置方式详细讲解

之前我们已经学习的Spring、SpringMVC、Mabatis、Maven&#xff0c;详细讲解了Spring、SpringMVC、Mabatis整合SSM的方案和案例&#xff0c;上一节我们学习了SpringBoot的开发步骤、工程构建方法以及工程的快速启动&#xff0c;从这一节开始&#xff0c;我们开始学习SpringBoot…

SpringSecurity深度解析与实践(1)

目录 引言1. SpringSecurity1.1 SpringSecurity简介1.2 SpringSecurity工作原理1.3.特点 2. SpringSecurity的快速使用总结 引言 SpringSecurity作为Spring框架中的一个重要组成部分&#xff0c;扮演着保护应用程序安全的重要角色。本文将深入探讨SpringSecurity的原理、使用方…

logging模块

【 一 】前言 logging 模块是 Python 中用于记录日志信息的标准库模块。通过使用 logging 模块&#xff0c;你可以在应用程序中设置日志记录以追踪代码执行、错误报告等信息。 debug : 打印全部的日志( notset 等同于 debug )info : 打印 info, warning, error, critical 级别的…

Playground AI刚刚推出了它的新宠儿——Playground V2,去试试?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Vue 异步组件:提升应用性能与加载速度

Vue.js 是一款流行的 JavaScript 框架&#xff0c;其中异步组件是优化大型应用性能的重要工具之一。通过异步组件&#xff0c;我们可以按需加载和渲染组件&#xff0c;提高应用的加载速度和用户体验。本文将深入探讨 Vue 异步组件的概念、使用方法以及如何在实际项目中有效地应…

react useState异步问题

1. useState执行后 不能立马拿到新的数据&#xff0c;下次更新绘图就可以拿到了 然后当执行完第一次render时候&#xff0c;比如去点击按钮啥的执行某个方法这个时候就可以拿到数据了 例子&#xff1a; const UseState () > { // 函数组件中没有this const [count, setCou…

vlan的通信(hcia)

有两种情况 第一种 vlanif的接口 VLANIF接口&#xff1a;VLANIF接口是一种三层的逻辑接口。在VLANIF接口上配置P地址 后&#xff0c;没备会在MAC地址表中添加VLANIF接口的MAC地址VD表项&#xff0c;并且为表项的 三层转发标志位置位。当报文的目的MAC地址匹配该表项后&a…

Linux-----17、软件包管理

# 软件包管理 # 1、软件包分类 # ㈠ 软件包类型 二进制包源码包 # ① 二进制包 什么是二进制包&#xff1f;有什么特点&#xff1f; 二进制包&#xff0c;指的是已经 1 好了的软件包&#xff0c;只需要直接安装就可以使用。二进制包&#xff0c;不需要编译&#xff0c;直接…