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数据驱动的更多相关文章

  1. Java&Selenium数据驱动【DataProvider+TestNG+Csv】

    Java&Selenium数据驱动[DataProvider+TestNG+Csv] package testNGWithDataDriven; import java.io.Buffered ...

  2. selenium webdriver testng自动化测试数据驱动

    selenium webdriver testng自动化测试数据驱动 selenium webdriver testng自动化测试数据驱动 一.数据驱动测试概念 数据驱动测试是相同的测试脚本使用不同的 ...

  3. Java&Selenium自动化测试之数据驱动

    一.摘要 本片博文以四个方式展示自动化测试的数据驱动,数组.CSV.Excel.Mysql 二.TestNG&Csv&Driven package testNGWithDataDriv ...

  4. Selenium自动化测试之数据驱动及用例管理

    Selenium自动化测试之数据驱动及用例管理 一.TestNg注解介绍 @Test:表示一个测试方法,在运行测试用例过程中,会自动运行@Test注解的方法. 例:

  5. 读取Excel,通过Testng完成数据驱动

    背景 数据驱动是我们写自动化脚本非常常用的技术,而Testng中数据驱动常用的注解是 @DataProvider,但是这个方法必须返回一个Object[][].最近常有学生问起,如果通过外部文件作为数 ...

  6. selenium+testng+ant+jenkins 手记

    会不会搭建测试平台是一般测试工程师和高级测试工程师分水岭 ----tobecrazy 我们项目有现成的测试平台,使用的是selenium grid+testng+ant+jenkins+VM 但是我平 ...

  7. 也谈自动化平台的搭建,另附高大上的名字---无人值守定时巡检系统(selenium+testng+ant+jenkins)

    最近公司新项目改版,由于没有运维,开发则负责上线任务,并且都是手动上线,并行的项目多了,分支混乱,经常导致B项目上线覆盖A项目,导致系统不定时出现异常,老板知道了便扣了大家的绩效,作为测试这边必须想个 ...

  8. selenium+testNG+Ant

    好几天没写了,抽时间写下,也好有个总结: 1.selenium+testNG+Ant (1)ant 是构建工具 他的作用就是运行你配置好的东西 而tentng.xml你可以认为他是管理test的一个配 ...

  9. Selenium+TestNG+Maven(2)

    转载自http://www.cnblogs.com/hustar0102/p/5885115.html selenium介绍和环境搭建 一.简单介绍 1.selenium:Selenium是一个用于W ...

随机推荐

  1. 量化编程技术—pdb进行调试

    # -*- coding: utf-8 -*- # @Date: 2017-08-26 # @Original: import pdb def gen_buy_change_list(): buy_c ...

  2. django:删除表后怎么重新数据迁移生成表

    1.将对应app下的migrations文件夹下面的除了__init__.py文件外全部删除 2.delete from django_migrations where app='app_name' ...

  3. 启动Oracle 12c数据库实例

    启动Oracle 12c数据库实例 启动Oracle数据库实例,主要分为两步:第一步,启动监听:第二步,启动数据库实例. 1. 切换到oracle用户- su oracle- cd - source ...

  4. 解决org.springframework.dao.DeadlockLoserDataAccessException

    添加链接池后批量添加更新出现了死锁 org.springframework.dao.DeadlockLoserDataAccessException: ### Error updating datab ...

  5. Swarm 集群并用 Portainer 管理

    https://blog.csdn.net/zhrq95/article/details/79430284 使用docker-proxy代理服务(所有节点): docker pull docker.i ...

  6. Zero-shot User Intent Detection via Capsule Neural Networks

    Architecture                 SemanticCaps 通过Bi-LSTM表征得到的隐层向量经过multi-head后可以得到R个表征             Detect ...

  7. jquery监听回车

    jquery监听回车 <pre> $("#loginusername, #loginpassword, #code").keydown(function() { if( ...

  8. 图解分布式一致性协议Paxos

    Paxos协议/算法是分布式系统中比较重要的协议,它有多重要呢? <分布式系统的事务处理>: Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就 ...

  9. STL源码剖析——算法#1 内存处理基本工具

    我们在学习序列式容器时,我们经常会遇到这三个函数:uninitialized_copy.uninitialized_fill.uninitialized_fill_n.在那时我们只是仅仅知道这些函数的 ...

  10. Keyboarding

    题目描述 思路 一开始想先写一个bfs,目标字符串要加上一个'*',表示这是一个换行符,然后一个字母一个字母的找,每次重置一下vis数组,bfs返回的结果再加上1,表示要打印这个字母,结果第一个样例没 ...