Selenium+TestNG+CSV数据驱动
1、工程的目录结构:
# saas
SAAS_UI自动化测试工程 # 一、工程的目录结构
1、saas/src是工程的入口
a、saas/src/main/java/com/saas/encapsulation是常用方法的封装包
b、saas/src/main/resources/csv是预置数据文件目录
c、saas/src/main/resources/driver是浏览器驱动目录
d、saas/src/test/java/com/saas是测试用例包
2、saas/log4j.xml是日志的配置文件
3、saas/pom.xml是maven的构建文件
4、saas/testng.xml是测试用例的组织文件 # 二、页面对象+数据驱动的思路
1、使用IDEA创建Maven工程,添加Selenium Webdriver、TestNG等依赖;把Selenium常用的方法封装起来,作为方法层;把页面对象封装起来,作为页面层;把读取Excel和CSV文件的方法封装起来,作为工具层;把JDBC封装起来,作为数据库操作层;
2、写测试用例类,使用数据驱动的模式,读取配置文件中的数据,断言前端抛出的异常是否和预期的一致;从数据库读取数据,断言页面中显示的元素是否和数据库一致;使用Log4j记录日志,使用Screenshot在测试用例执行失败时截图,使用testng.xml文件把全部的测试用例组织起来并运行,使用ReportNG记录测试过程,生成测试报告并美化之;
3、使用Jenkins实现无人值守。
2、文件举例:
log4j.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">
<appender name="fileAppender" class="org.apache.log4j.FileAppender">
<param name="Threshold" value="INFO" />
<param name="File" value="logfile.log" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p [%c{1}] %m %n" />
</layout>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="fileAppender" />
</root>
</log4j:configuration>
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>shanghai</groupId>
<artifactId>saas</artifactId>
<version>1.0-SNAPSHOT</version> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.soureEncodng>UTF-8</maven.compiler.soureEncodng>
</properties> <dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.11</version>
</dependency> <dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.9.1</version>
</dependency> <dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.9.1</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.8-dmr</version>
</dependency> <dependency>
<groupId>org.uncommons</groupId>
<artifactId>reportng</artifactId>
<version>1.1.4</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>4.1.0</version>
<scope>test</scope>
</dependency> <dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
</dependency> <dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build> </project>
testng.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="SAAS_UI自动化测试" verbose="2" preserve-order="true"> <test name="用户登录" >
<classes>
<class name="com.saas.login.Login" />
<class name="com.saas.login.Logout" />
</classes>
</test> <test name="账户管理_资料管理" >
<classes>
<class name="com.saas.material.BasicInformation" />
<class name="com.saas.material.InvoiceManage" />
<class name="com.saas.material.AddressAdd" />
<class name="com.saas.material.AddressDel" />
<class name="com.saas.material.AddressMessage" />
</classes>
</test> <test name="账户管理_部门管理" >
<classes>
<class name="com.saas.department.DepartmentAdd" />
<class name="com.saas.department.DepartmentManage" />
<class name="com.saas.department.DepartmentSearch" />
</classes>
</test> <test name="账户管理_角色管理" >
<classes>
<class name="com.saas.role.RoleAdd" />
<class name="com.saas.role.RoleManage" />
<class name="com.saas.role.RoleSearch" />
<class name="com.saas.role.RoleEmpower" />
</classes>
</test> <test name="账户管理_员工管理" >
<classes>
<class name="com.saas.personnel.PersonnelAdd"/>
<class name="com.saas.personnel.PersonnelManage" />
<class name="com.saas.personnel.PersonnelSearch" />
<class name="com.saas.personnel.PersonnelReset" />
</classes>
</test> <test name="客户关系管理_商机管理" >
<classes>
<class name="com.saas.business.BusinessAdd"/>
<class name="com.saas.business.BusinessContactsAdd" />
<class name="com.saas.business.BusinessManage" />
<class name="com.saas.business.BusinessDetails" />
<class name="com.saas.business.BusinessContactsDel" />
<class name="com.saas.business.BusinessDetailsRemarks" />
<class name="com.saas.business.BusinessSearch" />
<class name="com.saas.business.BusinessExport" />
<class name="com.saas.business.BusinessMessage" />
</classes>
</test> <test name="客户关系管理_客户管理" >
<classes>
<class name="com.saas.customer.CustomerManage"/>
<class name="com.saas.customer.CustomerRelease" />
<class name="com.saas.customer.CustomerAdd" />
<class name="com.saas.customer.CustomerDetails" />
<class name="com.saas.customer.CustomerExport" />
<class name="com.saas.customer.CustomerMessage" />
</classes>
</test> <test name="客户关系管理_公海客户" >
<classes>
<class name="com.saas.communal.PublicManage" />
<class name="com.saas.communal.PublicExport" />
<class name="com.saas.communal.PublicDetails" />
<class name="com.saas.communal.PublicReceive" />
</classes>
</test> <test name="客户关系管理_拜访管理" >
<classes>
<class name="com.saas.visit.VisitManage"/>
<class name="com.saas.visit.VisitAdd" />
<class name="com.saas.visit.VisitExport" />
<class name="com.saas.visit.VisitMessage" />
</classes>
</test> <test name="销售管理_销售订单" >
<classes>
<class name="com.saas.sale.SellManage" />
</classes>
</test> <test name="采购管理_采购订单" >
<classes>
<class name="com.saas.purchase.PurchaseManage" />
</classes>
</test> <test name="信用管理_额度查询" >
<classes>
<class name="com.saas.quota.CreditManage" />
</classes>
</test> <test name="保理业务管理_保理合同" >
<classes>
<class name="com.saas.Insurance.InsuranceManage" />
</classes>
</test> <listeners>
<listener class-name="org.uncommons.reportng.HTMLReporter" />
<listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
</listeners> </suite>
AddressAdd.java:
package com.saas.material; import com.saas.encapsulation.EncapsulationAssertion;
import com.saas.encapsulation.SeleniumCommonMethod;
import com.saas.encapsulation.ReadCSV;
import com.saas.encapsulation.SaasPageObject;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; import java.io.IOException; public class AddressAdd {
@BeforeMethod
public void beforeMethod(){
SaasPageObject.openUrl();
SaasPageObject.login();
SaasPageObject.information();
} @Test(dataProvider = "addAddress")
//新增收货地址的测试用例 11条 public void addAddress(
String people, String address,
String tel, String code,
String mail, String response,
String case_1 )
throws InterruptedException {
SeleniumCommonMethod.clickJS(".//*[@id='app']/section/div[3]/section/div/div[2]/div/a[3]");
//点击收货地址
SeleniumCommonMethod.loadForClick(".//*[@id='app']/section/div[3]/section/div/div[3]/a/button");
SeleniumCommonMethod.click(".//*[@id='app']/section/div[3]/section/div/div[3]/a/button");
//点击新增地址
SeleniumCommonMethod.loadForClick(".//*[@id='app']/section/div[3]/section/div/form/div[1]/div/div/input"); SeleniumCommonMethod.input(".//*[@id='app']/section/div[3]/section/div/form/div[1]/div/div/input", people);
//收货人
SeleniumCommonMethod.county(".//*[@id='app']/section/div[3]/section/div/form/div[2]/div/span/span",
"html/body/div[2]/ul/li[1]",
"html/body/div[2]/ul[2]/li",
"html/body/div[2]/ul[3]/li[1]");
//地区
SeleniumCommonMethod.input(".//*[@id='app']/section/div[3]/section/div/form/div[3]/div/div[1]/input", address);
//详细地址
SeleniumCommonMethod.input(".//*[@id='app']/section/div[3]/section/div/form/div[4]/div/div/input", tel);
//手机号码
SeleniumCommonMethod.telphone(".//*[@id='app']/section/div[3]/section/div/form/div[5]/div/div[1]/input","021",
".//*[@id='app']/section/div[3]/section/div/form/div[5]/div/div[2]/input","88887777",
".//*[@id='app']/section/div[3]/section/div/form/div[5]/div/div[3]/input","1234");
//座机号码
SeleniumCommonMethod.input(".//*[@id='app']/section/div[3]/section/div/form/div[6]/div/div/input", code);
//邮编
SeleniumCommonMethod.input(".//*[@id='app']/section/div[3]/section/div/form/div[7]/div/div/input", mail);
//电子邮箱 SeleniumCommonMethod.drag(".//*[@id='app']/section/div[3]/section/div/form/div[9]/div/button[1]");
SeleniumCommonMethod.loadForClick(".//*[@id='app']/section/div[3]/section/div/form/div[9]/div/button[1]");
SeleniumCommonMethod.click(".//*[@id='app']/section/div[3]/section/div/form/div[9]/div/button[1]");
//提交
Thread.sleep(2000); EncapsulationAssertion.check(response, case_1);
} @AfterMethod
public void afterMethod() {
SeleniumCommonMethod.quit();
} @DataProvider(name = "addAddress")
public Object[][] dp() throws IOException {
return ReadCSV.getTestData(
"src/main/resources/csv/addAddress.csv");
}
}
Selenium+TestNG+CSV数据驱动的更多相关文章
- Java&Selenium数据驱动【DataProvider+TestNG+Csv】
Java&Selenium数据驱动[DataProvider+TestNG+Csv] package testNGWithDataDriven; import java.io.Buffered ...
- selenium webdriver testng自动化测试数据驱动
selenium webdriver testng自动化测试数据驱动 selenium webdriver testng自动化测试数据驱动 一.数据驱动测试概念 数据驱动测试是相同的测试脚本使用不同的 ...
- Java&Selenium自动化测试之数据驱动
一.摘要 本片博文以四个方式展示自动化测试的数据驱动,数组.CSV.Excel.Mysql 二.TestNG&Csv&Driven package testNGWithDataDriv ...
- Selenium自动化测试之数据驱动及用例管理
Selenium自动化测试之数据驱动及用例管理 一.TestNg注解介绍 @Test:表示一个测试方法,在运行测试用例过程中,会自动运行@Test注解的方法. 例:
- 读取Excel,通过Testng完成数据驱动
背景 数据驱动是我们写自动化脚本非常常用的技术,而Testng中数据驱动常用的注解是 @DataProvider,但是这个方法必须返回一个Object[][].最近常有学生问起,如果通过外部文件作为数 ...
- selenium+testng+ant+jenkins 手记
会不会搭建测试平台是一般测试工程师和高级测试工程师分水岭 ----tobecrazy 我们项目有现成的测试平台,使用的是selenium grid+testng+ant+jenkins+VM 但是我平 ...
- 也谈自动化平台的搭建,另附高大上的名字---无人值守定时巡检系统(selenium+testng+ant+jenkins)
最近公司新项目改版,由于没有运维,开发则负责上线任务,并且都是手动上线,并行的项目多了,分支混乱,经常导致B项目上线覆盖A项目,导致系统不定时出现异常,老板知道了便扣了大家的绩效,作为测试这边必须想个 ...
- selenium+testNG+Ant
好几天没写了,抽时间写下,也好有个总结: 1.selenium+testNG+Ant (1)ant 是构建工具 他的作用就是运行你配置好的东西 而tentng.xml你可以认为他是管理test的一个配 ...
- Selenium+TestNG+Maven(2)
转载自http://www.cnblogs.com/hustar0102/p/5885115.html selenium介绍和环境搭建 一.简单介绍 1.selenium:Selenium是一个用于W ...
随机推荐
- Java8 特性
1.jdk8的特性stream().map() 2.Java8中用Lambda表达式的groupBy合并多个相同属性的对象集合 3.Java8 Stream 语法详解 & 用法实例
- Android Studio 开发
Android studio安装与配置 (收藏) https://www.cnblogs.com/gufengchen/p/10991886.html ------------------------ ...
- VisualVM使用
sualVM是JDK自带的一个用于Java程序性能分析的工具 在JDK安装目录的bin文件夹下名称为 jvisualvm.exe 在左侧选择应用 (1)概述 应用程序和运行时环境的基本信息 基本参数 ...
- Hadoop入门——初识Hadoop
一.hadoop是什么 Hadoop被公认是一套行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力.几乎所有主流厂商都围绕Hadoop开发工具.开源软件.商业化工具和技术服务.今年大型IT ...
- POJ-动态规划-背包问题模板
背包问题模板 一.0-1背包 状态:背包容量为j时,求前i个物品所能达到最大价值,设为dp[i][j].初始时,dp[0][j](0<=j<=V)为0,没有物品也就没有价值. 状态转移方程 ...
- linux 压缩文件 查找
zgrep '20190521155553776237' stdout-20190521.log.gz
- Java开发笔记(一百四十二)JavaFX的对话框
JavaFX的对话框主要分为提示对话框和文件对话框两类,其中提示对话框又分作消息对话框.警告对话框.错误对话框.确认对话框四种.这四种对话框都使用Alert控件表达,并通过对话框类型加以区分,例如Al ...
- Python3 - Bytes类型
Python3 新增 bytes 类型,是指一堆字节的集合,十六进制表现形式,两个十六进制数构成一个 byte ,以 b 开头的字符串都是 bytes 类型. 计算机只能存储二进制,字符.图片.视频. ...
- day26——tyoe元类与object的联系、反射、函数与方法的区别、双下方法
day26 type元类与object联系 type 获取对象从属于的类 python 中一切皆对象, 类在某种意义上也是一个对象,python中自己定义的类,以及大部分内置类,都是由type元类(构 ...
- vue+element项目中 给input赋值之后无法修改
点击修改按钮 将值赋值给 input 但是无法修改,input不可编辑,部分input可以编辑 , 解决方法一. 改变data数据初始值 解决方法二. 用this.$set input:{ descr ...