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 ...
随机推荐
- kubernetes之kube-proxy运行机制分析
在kubernetes集群的每个node都会运行一个kube-proxy服务进程,这个进程可用看作Service的透明代理兼负载均衡器.其核心功能是将到某个Service的访问请求转发到后端的多个po ...
- 【ARM-Linux开发】Linux模块机制浅析
Linux模块机制浅析 Linux允许用户通过插入模块,实现干预内核的目的.一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析. 模块的Hello World! ...
- 翻书shader
//把下面的shader挂载到plane上,调节_Angle Shader "Unlit/PageTurning"{ Properties { _Color ("Colo ...
- jQuery中$(this)与this的区别
经常在写jQuery的时候分不清this 和 $(this),为了方便起见尽量不用this,只用$(this).但是今天在别人的代码的基础上改一些东西,又遇到了这个this,不得不把它弄明白. $(t ...
- Fineui 实现点击左边树状主菜单链接 打开新窗口或打开多个同一个tab
原文:http://fineui.com/bbs/forum.php?mod=viewthread&tid=7019&page=1#pid31469 代码如下: < ...
- Leetcode Note
算法刷题笔记 Leetcode-11. Container With Most Water Method: (对撞指针)每次保留两指针中最大的那个即可求得最大的面积 Runtime: 16 ms, f ...
- 重置 Macbook 登录密码
1.按 开机键 的同时 按 Command + R,等进度条走完,会出现如下图 2.在菜单栏,选取“实用工具”>“终端”. 3.在终端窗口,键入下面的命令:resetpassword 按下回车键 ...
- (谷歌浏览器)前端以FormData类形成表单(含文件),通过ajax提交,PHP后端$_POST数组为空
[错误信息] PHP获取不到前端发来的POST数据 [前端代码] [HTTP请求] [后端报错]
- 查询系统table条数
), RowCnt INT) EXEC sp_MSforeachtable 'INSERT INTO temp SELECT ''?'',COUNT(*) FROM ?' SELECT TableNa ...
- SonarQube安装教程与简单使用(基于Centos7,JDK1.8)
SonarQube 若要转载本文,请务必声明出处:https://www.cnblogs.com/zhongyuanzhao000/p/11686522.html 概念: SonarQube是一种自动 ...