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的变量值内容判断返回何种定位方式的Byif(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);elsethrow 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/";@Testpublic 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("未读邮件"));}@BeforeMethodpublic 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);}@AfterMethodpublic 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/";@Testpublic void testMailLogin()throws Exception {Login_Action.execute(driver, "m17805983076", "*****");Thread.sleep(5000);Assert.assertTrue(driver.getPageSource().contains("未读邮件"));}@BeforeMethodpublic 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);}@AfterMethodpublic 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/";@Testpublic 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"));}@BeforeMethodpublic 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);}@AfterMethodpublic 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;@Testpublic 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));}@BeforeMethodpublic 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);}@AfterMethodpublic void afterMethod() {driver.quit();}}

转载于:https://www.cnblogs.com/z-zzz/p/10600439.html

自动化测试框架的Step By Step搭建及测试实战(1)相关推荐

  1. Java自动化测试框架-11 - TestNG之annotation与并发测试篇 (详细教程)

    1.简介 TestNG中用到的annotation的快速预览及其属性. 2.TestNG基本注解(注释) 注解 描述 @BeforeSuite 注解的方法只运行一次,在当前suite所有测试执行之前执 ...

  2. Appium - 自动化测试框架 - 工作原理、环境搭建

    前言 Appium是移动端的UI自动化测试框架,基于C/S模式,特点是支持跨平台(安卓,ios),支持多语言(对java,python都有支持的API).本文系博主对于该框架的部分学习记录. 一.什么 ...

  3. Unittest自动化测试框架教程(四)——Python中的数据驱动测试DDT

     " 数据驱动测试DDT(Data Drivern test),是自动化测试领域优势中亮眼的闪光点,在unittest测试框架中对数据驱动更是提供了强大的支持,文章通过基础概念的引入,介绍了 ...

  4. HttpRunnerManager接口自动化测试框架在win环境下搭建教程

    1.下载源码 git下载:https://github.com/HttpRunner/HttpRunnerManager 网盘下载:https://pan.baidu.com/s/1bNME6xu9g ...

  5. python ui自动化测试框架_基于python语言下的UI自动化测试框架搭建(一)

    最近在搭一个UI自动化测试框架,想把整个搭建过程分享出来,如果有不对的地方,希望大家能够指正,首先创建一个名称为,antomation_framework_demo的工程文件, pycharm中工程及 ...

  6. 如何从零搭建自动化测试框架

    搭建的自动化测试框架要包括API测试,UI测试,APP测试三类.以上三类其实可以简化为两类,那就是: 1)接口自动化测试框架搭建 2)UI自动化测试框架搭建. 没问题,安排,且是手把手教你如何搭建以上 ...

  7. 用robot framework + python实现http接口自动化测试框架

    前言 下周即将展开一个http接口测试的需求,刚刚完成的java类接口测试工作中,由于之前犯懒,没有提前搭建好自动化回归测试框架,以至于后期rd每修改一个bug,经常导致之前没有问题的case又产生了 ...

  8. python接口自动化测试框架pdf,Python接口自动化测试框架设计到开发完整版2019

    1:课程详细介绍.mp4 ; k& X* V: X! X% \; ]; u- V$ z7 L) h: C; h2:课程答疑.mp4+ J  K* q0 O  x + j( v2 n7 B7 s ...

  9. python接口自动化测试框架实战从设计到开发_【B0753】[java视频教程]Python接口自动化测试框架设计到开发完整版视频教程 it教程...

    Java视频教程名称:Python接口自动化测试框架设计到开发完整版视频教程   java自学网[javazx.com]  Python视频教程   it教程 Java自学网收集整理 java论坛&q ...

  10. Java接口自动化测试框架学习

    Java接口自动化测试框架学习 高级软件测试,性能测试,功能测试,自动化测试,接口测试,移动端测试,手机测试,WEB测试,渗透测试,测试用例设计,黑盒测试,白盒测试,UFT高级测试,Android测试 ...

最新文章

  1. java中string.trim()函数
  2. alphac测试和bata测试区别_电缆识别仪与电缆故障测试仪的区别
  3. python3一个中文3个字符_高手接招! 小应用 用python3判断一个字符串是不是中文组成的...
  4. mysql all语法怎么用_MySQL UNION 与 UNION ALL 语法与用法
  5. 《SAS编程与数据挖掘商业案例》学习笔记之九
  6. 设计模式(二)模板方法模式
  7. 统计两个IP地址之间的IP个数
  8. 祥云,灯笼,剪纸……春节海报,点缀必备PSD素材
  9. git pull git add git commit git branch git更新代码git提交git分支管理
  10. Deformable ConvNets自己的理解
  11. matlab | 与 || 的区别
  12. 第十届中国证券金紫荆奖名单揭晓 华能国际斩获两项大奖
  13. 【雷达信号处理基础】第1讲 -- 雷达系统概述
  14. linux 更改sh文件权限不够,linux权限不够,sh不能用
  15. 解决微信公众号accessToken白名单问题
  16. 文本数据挖掘(Text Mining)
  17. 货币信息高于货币价值而存在
  18. android 网易新闻 登录界面,Android实现仿网易新闻主界面设计
  19. Axure 放大与缩小
  20. 面试问题:如何开展接口测试

热门文章

  1. VS code(Visual Studio Code)乱码解决方法
  2. python stack unstack_Python之数据重塑
  3. FITS python
  4. 安卓DEVICE ID为何有15位和16位
  5. 图片占位符placehold.it
  6. easyui datagrid deleteRow(删除行)的BUG!
  7. 苹果手机注册时显示链接服务器出现问题,苹果连接服务器出现问题怎么办_苹果id连接到服务器时出现问题的解决方法...
  8. 单片机开发,推荐开源跨平台的SDCC编译器
  9. linux中-f的含义,linux 下shell中if的“-e,-d,-f”的含义
  10. Flink之DataSet转换操作(二)