自动化测试框架的Step By Step搭建及测试实战(1)
1.1什么是自动化测试框架
1.什么是自动化框架
自动化框架是应用与自动化测试的程序框架,它提供了可重用的自动化测试模块,提供最基础的自动化测试功能,或提供自动化测试执行和管理功能的架构模块。它是由一个或多个自动化测试基础模块、自动化管理模块、自动化测试统计模块等组成的工具集合
2.自动化测试框架常见的4种模式
1)数据驱动测试框架
使用数据数组、测试数据文件或者数据库等方式接入自动化测试框架,此框架一般用于在一个测试中使用多组不同的测试数据
2)关键字驱动测试框架
关键字驱动使用被操作的元素对象、操作的方法和操作的数值作为测试过程输入的自动化测试框架,可以兼容更多的自动化测试操作类型,大大提高了自动化测试框架的使用灵活性
3)混合型测试框架
在关键字驱动测试框架中加入了数据驱动功能
4)行为驱动测试框架
支持自然语言作为测试用例描述的自动化测试框架,例如前面章节讲到的Cucumber框架
3.自动化测试框架的作用
(1)能够有效组织和管理测试脚本
(2)进行数据驱动或关键字驱动的测试
(3)将基础的测试代码进行封装,降低测试脚本编写的复杂性和重复性
(4)提高测试脚本维护和修改的效率
(5)自动执行测试脚本,并自动发布测试报告,为持续集成的开发方式提供脚本支持
(6)让不具备编程能力的测试工程师开展自动化测试工作
4.自动化测试框架的核心设计思想
自动化测试框架的核心思想是将常用的脚本代码或者测试逻辑进行抽象和总结,然后将这些代码进行面向对象设计,将需要复用的代码封装到可公用的类方法中
1.2数据驱动框架及实战
数据驱动框架搭建步骤:
(1)新建一个java工程,命名为DataDrivenFrameWork,配置好工程中的WebDriver和TestNG环境环境,并导入Excel操作相关和Log4j相关的JAR文件到工程中
(2)新建4个Package分别命名为:
cn.gloryroad.appModules,主要用于实现复用的业务逻辑封装方法
cn.gloryroad.pageObjects,主要用于实现被测试对象的页面对象
cn.gloryroad.testScripts,主要用于实现具体的测试脚本逻辑
cn.gloryroad.util,主要用于实现测试过程中调用方法例如文件操作、页面元素对象操作
(3)在cn.gloryroad.util的Package中新建ObjectMap类,代码如下
package cn.gloryroad.util; import java.io.FileInputStream;
import java.util.Properties; import org.openqa.selenium.By; public class ObjectMap {
Properties properties;
public ObjectMap(String propFile){
properties = new Properties();
try {
FileInputStream in = new FileInputStream(propFile);
properties.load(in);
in.close();
} catch (Exception e) {
System.out.println("读取对象文件出错");
e.printStackTrace();
}
}
public By getLocator(String ElementNameInpropFile) throws Exception{
//根据变量ElementNameInpropFile从属性文件中读取对应的配置文件
String locator = properties.getProperty(ElementNameInpropFile);
//将配置对象的定位类型存到locatorType变量,将表达式的值存入locatorValue变量
String locatorType = locator.split(">")[0];
String locatorValue = locator.split(">")[1];
//默认为ISO-8859-1编码存储,使用getBytes方法可以将字符串编码转换为UTF-8,解决在配置文件读取中文乱码问题
locatorValue = new String(locatorValue.getBytes("ISO-8859-1"),"UTF-8");
//输出locatorType和locatorValue变量的值,验证赋值是否正确
System.out.println("获取的定位类型:"+locatorType+"\t获取的定位表达式"+locatorValue);
//根据locatorType的变量值内容判断返回何种定位方式的By
if(locatorType.toLowerCase().equals("id"))
return By.id(locatorValue);
else if(locatorType.toLowerCase().equals("name"))
return By.name(locatorValue);
else if((locatorType.toLowerCase().equals("classname")) || (locatorType.toLowerCase().equals("class")))
return By.className(locatorValue);
else if((locatorType.toLowerCase().equals("tagname")) || (locatorType.toLowerCase().equals("tag")))
return By.tagName(locatorValue);
else if((locatorType.toLowerCase().equals("linktext")) || (locatorType.toLowerCase().equals("link")))
return By.linkText(locatorValue);
else if(locatorType.toLowerCase().equals("partiallinktext"))
return By.partialLinkText(locatorValue);
else if((locatorType.toLowerCase().equals("cssselector")) || (locatorType.toLowerCase().equals("css")))
return By.cssSelector(locatorValue);
else if(locatorType.toLowerCase().equals("xpath"))
return By.xpath(locatorValue);
else
throw new Exception("输入的咯差投入type未在程序中被定义:"+locatorType);
}
}
(4)在工程中添加一个存储页面表达式和定位方式的配置文件objectMap.properties内容如下:
163mail.loginPage.username=xpath>//input[@placeholder='\u90AE\u7BB1\u8D26\u53F7\u6216\u624B\u673A\u53F7\u7801']
163mail.loginPage.password=xpath>//input[@placeholder='\u8F93\u5165\u5BC6\u7801']
163mail.loginPage.loginbutton=id>dologin
(5)在cn.gloryroad.pageObjects的Package下新建类LoginPage,用于实现163邮箱登录页面的PageObject对象。LoginPage类代码如下:
package cn.gloryroad.pageObjects; import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement; import cn.gloryroad.util.ObjectMap; public class LoginPage {
private WebElement element = null;
//指定元素定位表达式配置文件的绝对路径
private ObjectMap objectMap = new ObjectMap("E:\\project\\DataDrivenFrameWork\\objectMap.properties");
private WebDriver driver;
public LoginPage(WebDriver driver){
this.driver = driver;
}
//返回登录页面中的用户名输入框页面元素对象
public WebElement userName() throws Exception {
element = driver.findElement(objectMap.getLocator("163mail.loginPage.username"));
return element;
}
//返回登录页面中的密码输入框页面元素对象
public WebElement password() throws Exception{
element = driver.findElement(objectMap.getLocator("163mail.loginPage.password"));
return element;
}
//返回登录页面中的登录按钮的页面元素对象
public WebElement loginButton() throws Exception{
element = driver.findElement(objectMap.getLocator("163mail.loginPage.loginbutton"));
return element;
}
}
(6)在cn.gloryroad.testScripts的Package中新建TestMaill163Login测试类,具体测试代码如下:
package cn.gloryroad.testScripts; import org.testng.annotations.Test; import cn.gloryroad.pageObjects.LoginPage;
import junit.framework.Assert; import org.testng.annotations.BeforeMethod; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod; public class TestMail163Login {
public WebDriver driver;
String url = "http://mail.163.com/";
@Test
public void testMailLogin()throws Exception {
driver.get(url);
driver.switchTo().frame(0);
LoginPage loginPage = new LoginPage(driver);
loginPage.userName().sendKeys("m17805983076");
loginPage.password().sendKeys("*****");
loginPage.loginButton().click();
Thread.sleep(5000);
Assert.assertTrue(driver.getPageSource().contains("未读邮件"));
}
@BeforeMethod
public void beforeMethod() {
//设定Chrome支持的绝对路径
System.setProperty("webdriver.chrome.driver", "D:\\WebDriver\\chromedriver_win32\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
} @AfterMethod
public void afterMethod() {
driver.quit();
} }
(7)在cn.gloryroad.appModules中新增Login_Actiob类,具体代码如下
package cn.gloryroad.appModules; import org.openqa.selenium.WebDriver; import cn.gloryroad.pageObjects.LoginPage; public class Login_Action {
public static void execute(WebDriver driver,String userName,String passWord)throws Exception{
driver.get("http://mail.163.com");
LoginPage loginPage = new LoginPage(driver);
driver.switchTo().frame(0);
loginPage.userName().sendKeys(userName);
loginPage.password().sendKeys(passWord);
loginPage.loginButton().click();
Thread.sleep(5000);
}
}
(8)修改测试类TestMail163Login的代码,修改后的代码如下
package cn.gloryroad.testScripts; import org.testng.annotations.Test; import cn.gloryroad.appModules.Login_Action;
import cn.gloryroad.pageObjects.LoginPage;
import junit.framework.Assert; import org.testng.annotations.BeforeMethod; import java.util.concurrent.TimeUnit; import org.apache.log4j.xml.DOMConfigurator;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod; public class TestMail163Login {
public WebDriver driver;
String url = "http://mail.163.com/";
@Test
public void testMailLogin()throws Exception {
Login_Action.execute(driver, "m17805983076", "*****");
Thread.sleep(5000);
Assert.assertTrue(driver.getPageSource().contains("未读邮件"));
}
@BeforeMethod
public void beforeMethod() {
DOMConfigurator.configure("log4j.xml");
//设定Chrome支持的绝对路径
System.setProperty("webdriver.chrome.driver", "D:\\WebDriver\\chromedriver_win32\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
} @AfterMethod
public void afterMethod() {
driver.quit();
} }
比较修改前后的代码登录操作步骤被一个函数调用就替代了,实现了业务逻辑的封装,减少了脚本的重复编写
(9)在cn.gloryroad.pageobject的Package中新建HomePage和AddressBookPage类,并在配置文件objectMap.properties中补充新的定位表达式
配置文件objectMap.properties配置文件更新后的内容如下
163mail.loginPage.username=xpath>//input[@placeholder='\u90AE\u7BB1\u8D26\u53F7\u6216\u624B\u673A\u53F7\u7801']
163mail.loginPage.password=xpath>//input[@placeholder='\u8F93\u5165\u5BC6\u7801']
163mail.loginPage.loginbutton=id>dologin
163mail.homePage.addressbook=xpath>//li[@title='\u901A\u8BAF\u5F55']
163mail.addressBook.createContactPerson=xpath>//span[text()='\u65B0\u5EFA\u8054\u7CFB\u4EBA']
163mail.addressBook.contactPersonName=id>input_N
163mail.addressBook.contactPersonEmail=xpath>//*[@id='iaddress_MAIL_wrap']//input
163mail.addressBook.contactPersonMobile=xpath>//*[@id='iaddress_TEL_wrap']//input
163mail.addressBook.saveButton=xpath>//span[text()='\u786E \u5B9A']
HomePage类代码如下:
package cn.gloryroad.pageObjects; import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement; import cn.gloryroad.util.ObjectMap; public class HomePage {
private WebElement element = null;
private ObjectMap objectMap = new ObjectMap("E:\\project\\DataDrivenFrameWork\\objectMap.properties");
private WebDriver driver;
public HomePage(WebDriver driver){
this.driver = driver;
}
//获取登录后主页中的“通讯录”链接
public WebElement addressLink() throws Exception{
element = driver.findElement(objectMap.getLocator("163mail.homePage.addressbook"));
return element;
}
//如果要在HomePage页面操作更多元素,可根据需要自定义
}
AddressBookPage类代码如下
package cn.gloryroad.pageObjects; import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement; import cn.gloryroad.util.ObjectMap; public class AddressBookPage {
private WebElement element = null;
private ObjectMap objectMap = new ObjectMap("E:\\project\\DataDrivenFrameWork\\objectMap.properties");
private WebDriver driver;
public AddressBookPage(WebDriver driver){
this.driver = driver;
}
//获取新建联系人按钮
public WebElement createContactPersonButton() throws Exception{
element = driver.findElement(objectMap.getLocator("163mail.addressBook.createContactPerson"));
return element;
}
//获取新建联系人姓名输入框
public WebElement contactPersonName() throws Exception{
element = driver.findElement(objectMap.getLocator("163mail.addressBook.contactPersonName"));
return element;
}
//获取新建联系人界面中的电子邮件输入框
public WebElement contactPersonEmail() throws Exception{
element = driver.findElement(objectMap.getLocator("163mail.addressBook.contactPersonEmail"));
return element;
}
//获取新建联系人手机号码输入框
public WebElement contactPersonMobile() throws Exception{
element = driver.findElement(objectMap.getLocator("163mail.addressBook.contactPersonMobile"));
return element;
}
//获取新建联系人界面中保存信息的确定按钮
public WebElement saveButton() throws Exception{
element = driver.findElement(objectMap.getLocator("163mail.addressBook.saveButton"));
return element;
}
}
(10)在cn.gloryroad.appModules中增加ADDContactPerson_Action类具体类代码如下
package cn.gloryroad.appModules; import org.openqa.selenium.WebDriver; import cn.gloryroad.pageObjects.LoginPage; public class Login_Action {
public static void execute(WebDriver driver,String userName,String passWord)throws Exception{
driver.get("http://mail.163.com");
LoginPage loginPage = new LoginPage(driver);
driver.switchTo().frame(0);
loginPage.userName().sendKeys(userName);
loginPage.password().sendKeys(passWord);
loginPage.loginButton().click();
Thread.sleep(5000);
}
}
(11)在cn.gloryroad.testScripts的Package包中新增测试类TestMail163AddContactPerson,测试类的代码如下
package cn.gloryroad.testScripts; import org.testng.annotations.Test; import cn.gloryroad.appModules.AddContactPerson_Action; import org.testng.annotations.BeforeMethod; import java.util.concurrent.TimeUnit; import org.junit.Assert;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod; public class TestMail163AddContactPerson {
public WebDriver driver;
String url = "http://mail.163.com/";
@Test
public void testAddContactPerson()throws Exception {
AddContactPerson_Action.execute(driver, "m17805983076", "*****", "张三", "zhangsan@163.com", "17807805930");
Thread.sleep(3000);
Assert.assertTrue(driver.getPageSource().contains("张三"));
Assert.assertTrue(driver.getPageSource().contains("zhangsan@163.com"));
Assert.assertTrue(driver.getPageSource().contains("17807805930"));
}
@BeforeMethod
public void beforeMethod() {
System.setProperty("webdriver.chrome.driver", "D:\\WebDriver\\chromedriver_win32\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
} @AfterMethod
public void afterMethod() {
driver.quit();
} }
(12)在cn.gloryroad.util的Package中新建Constant类,具体代码如下
package cn.gloryroad.util; public class Constant {
//定义测试网址的常量
public static final String Url = "http://mail.163.com/";
//定义邮箱用户名的常量
public static final String MialUsername = "m17805983076";
//定义邮箱密码的常量
public static final String MailPassword = "******";
//定义新建联系人用户名的常量
public static final String ContactPersonName = "张三";
//定义新建联系人邮箱的常量
public static final String ContactPersonEmail = "zhangsan@163.com";
//定义新建联系人手机号码的常量
public static final String ContactPersonMobile = "17807805930";
}
在cn.gloryroad.testScripts的Package中修改TestMail163AddContactPerson测试类代码,修改后代码如下
package cn.gloryroad.testScripts; import org.testng.annotations.Test; import cn.gloryroad.appModules.AddContactPerson_Action;
import cn.gloryroad.util.Constant; import org.testng.annotations.BeforeMethod; import java.util.concurrent.TimeUnit; import org.junit.Assert;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod; public class TestMail163AddContactPerson {
public WebDriver driver;
//调用Constant类中的常量
private String url = Constant.Url;
@Test
public void testAddContactPerson()throws Exception {
driver.get(url);
//调用Constant类中的常量
AddContactPerson_Action.execute(driver, Constant.MialUsername, Constant.MailPassword,
Constant.ContactPersonName, Constant.ContactPersonEmail, Constant.ContactPersonMobile);
Thread.sleep(3000);
Assert.assertTrue(driver.getPageSource().contains(Constant.ContactPersonName));
Assert.assertTrue(driver.getPageSource().contains(Constant.ContactPersonEmail));
Assert.assertTrue(driver.getPageSource().contains(Constant.ContactPersonMobile));
}
@BeforeMethod
public void beforeMethod() {
System.setProperty("webdriver.chrome.driver", "D:\\WebDriver\\chromedriver_win32\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
} @AfterMethod
public void afterMethod() {
driver.quit();
} }
自动化测试框架的Step By Step搭建及测试实战(1)的更多相关文章
- Java自动化测试框架-11 - TestNG之annotation与并发测试篇 (详细教程)
1.简介 TestNG中用到的annotation的快速预览及其属性. 2.TestNG基本注解(注释) 注解 描述 @BeforeSuite 注解的方法只运行一次,在当前suite所有测试执行之前执 ...
- HttpRunnerManager接口自动化测试框架在win环境下搭建教程
近几日一直在研究如何把接口自动化做的顺畅,目前用的是轻量级jmeter+ant+Jenkins自动化测试框架,目前测试界的主流是python语言,所以一直想用搭建一个基于python的HttpRunn ...
- hibernate框架学习笔记1:搭建与测试
hibernate框架属于dao层,类似dbutils的作用,是一款ORM(对象关系映射)操作 使用hibernate框架好处是:操作数据库不需要写SQL语句,使用面向对象的方式完成 这里使用ecli ...
- Python3+Selenium2完整的自动化测试实现之旅(五):自动化测试框架、Python面向对象以及POM设计模型简介
前言 之前的系列博客,陆续学习整理了自动化测试环境的搭建.IE和Chrome浏览器驱动的配置.selenium-webdriver模块封装的元素定位以及控制浏览器.处理警示框.鼠标键盘等方法的使用,这 ...
- 【转】robot framework + python实现http接口自动化测试框架
前言 下周即将展开一个http接口测试的需求,刚刚完成的java类接口测试工作中,由于之前犯懒,没有提前搭建好自动化回归测试框架,以至于后期rd每修改一个bug,经常导致之前没有问题的case又产生了 ...
- robot framework + python实现http接口自动化测试框架
https://www.jianshu.com/p/6d1e8cb90e7d 前言 下周即将展开一个http接口测试的需求,刚刚完成的java类接口测试工作中,由于之前犯懒,没有提前搭建好自动化回归测 ...
- UI自动化测试框架之Selenium关键字驱动 (转)
摘要 自动化测试框架demo,用关键字的形式将测试逻辑封装在数据文件中,测试工具解释这些关键字即可对其应用自动化 一.原理及特点 1. 关键字驱动测试是数据驱动测试的一种改进类型 2. 主要 ...
- 【转】UI自动化测试框架之Selenium关键字驱动
原网址:https://my.oschina.net/hellotest/blog/531932#comment-list 摘要: 自动化测试框架demo,用关键字的形式将测试逻辑封装在数据文件中,测 ...
- Robot Framework作者建议如何选择自动化测试框架
本文摘自:InfoQ中文站http://www.infoq.com/cn/news/2012/06/robot-author-suggest-autotest Robot Framework作者建议如 ...
随机推荐
- javascript实现文字逐渐显现
下面是文字逐渐显现的JS代码<pre id="wenzi"></pre><div style="display:none" id= ...
- 整数中1出现的次数(从1到n整数中1出现的次数)(python)
题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了. ...
- cmd中sudo以后显示password不能输入密码
文本界面还是图形界面下输入密码都不会有回显,这是为了安全考虑. 其实你不是不能输入密码只是你看不到而已,事实上你已经输入进去了,回车后就能看到效果了. 来源于:https://zhidao.baidu ...
- Java的三种代理模式(Spring动态代理对象)
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
- vm ware虚拟机ping不通解决办法
本人是linux菜鸟,在使用vm ware的时候,在多台电脑上安装了多个虚拟机,这多台电脑是同一网段的,并且能够互相ping通,但是vm ware下的虚拟机就无法ping通 通过自己的各种才是,发现在 ...
- (转)css3实现load效果
本文转自:https://www.cnblogs.com/jr1993/p/4625628.html 谢谢作者 注:gif图片动画有些卡顿,非实际效果! 第一种效果: 代码如下: <div cl ...
- 508. Most Frequent Subtree Sum 最频繁的子树和
[抄题]: Given the root of a tree, you are asked to find the most frequent subtree sum. The subtree sum ...
- 网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP (转)
网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP 27 March 2013 TUN 设备 TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为.先来看看物理设 ...
- playframework 一步一步来 之 日志(一)
日志模块是一个系统中必不可少的一部分,它可以帮助我们写程序的时候查看错误信息,利于调试和维护,在业务面,它也可以记录系统的一些关键性的操作,便于系统信息的监控和追踪. play的日志是基于logbac ...
- oracle服务端与客户端字符集不同导致中文乱码解决方案
1.问题描述 用pl/sql登录时,会提示“数据库字符集(ZHS16GBK)和客户端字符集(2%)是不同的,字符集转化可能会造成不可预期的后果”,具体问题是中文乱码,如下图 2.问题分析 不管错误信息 ...