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 ...
随机推荐
- 搭建基于docker 的redis分布式集群在docker for windows
https://blog.csdn.net/xielinrui123/article/details/85104446 首先在docker中下载使用 docker pull redis:3.0.7do ...
- 使用tomcat7-maven-plugin
2019-01-0714:16:44 功能: (使用maven中的tomcat插件,就可以将tomcat集成到项目中,效果就是:在不同平台中无需配置tomcat就可以直接运行web) 地址: tomc ...
- Qt中 布局管理器失效问题
1 问题描述 在Qt5.12.0 版本中,使用 自动管理器发生,无法生效 2 问题代码 Widget::Widget(QWidget *parent) : QWidget(parent), butto ...
- 【C语言】 strlen()入参空指针导致段错误
背景: 在工作中调试sqlite3相关代码的时候,调用printf()打印sqlite3_exec()的执行日志:因为sqlite3_exec()保存日志的参数传入时为NULL,且没有执行错误,所以再 ...
- LeetCode 1259. Handshakes That Don't Cross - Java - DP
题目链接:https://leetcode-cn.com/problems/handshakes-that-dont-cross/ You are given an even number of pe ...
- hystrix,request collapser,请求合并
多个商品,需要发送多次网络请求,调用多次接口,才能拿到结果 可以使用HystrixCollapser将多个HystrixCommand合并到一起,多个command放在一个command里面去执行,发 ...
- spring Boot 学习(五、Spring Boot与安全)
一.安全Spring Security是针对Spring项目的安全框架,也是Spring Boot底层安全模 块默认的技术选型.他可以实现强大的web安全控制.对于安全控制,我们仅 需引入spring ...
- C# vb .net实现焦距淡色特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的焦距淡色效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...
- kubernetes使用securityContext和sysctl
前言 在运行一个容器时,有时候需要使用sysctl修改内核参数,比如net..vm..kernel等,sysctl需要容器拥有超级权限,容器启动时加上--privileged参数即可.那么,在kube ...
- 变量.argsort()的用法
a=[1,2,5,9,7,3]a=np.array(a)order = a.argsort() # 从小到大排序,并返回索引值print('order=',order)order1= a.argsor ...