自动化测试框架[Cypress PO模式]

自动化测试框架[Cypress PO模式]【附源码】在Cypress中并不认为PO是个很好的模式,Cypress认为跨页面共享逻辑是一个反模式(Anti-Pattern),在Cypress中,它提供了很多方式,允许用户通过更简单的方式直接设置被测应用程序达到的待测试状态,不需要再不同页面一遍又一遍的执行相通操作

大家好,又见面了,我是你们的朋友全栈君。

Cypress的PO模型

将元素定位器剥离

首先在工程的Cypress路径下新建一个pages目录,然后在该目录下新建一个JS文件,并命名为login.js

//login.js
export default class LoginPage{ 
   
	constructor(){ 
   
		this.userName='input[name=username]'
		this.password='input[name=password]'
		this.form='form'
		this.url='http://localhost:7077/login'
	}
	isTargetPage(){ 
   
		cy.visit('/login')
		cy.url().should('eq', this.url)
	}
	login(username, password){ 
   
		cy.get(this.userName).type(username)
		cy.get(this.password).type(password)
		cy.get(this.form).submit()
	}
}

然后在Cypress路径下的integration路径下新建一个JS文件,并命名为testLogin.js

//testLogin.js
/// <reference types="cypress" />
import LoginPage from "../pages/login"
describe('登录测试,PageObject模式', function () { 
   
    const username = 'davie.yang'
    const password = 'yangdawei'
    it('登录成功', function () { 
   
    	// 创建pageobject实例
        const loginInstance = new LoginPage()
        loginInstance.isTargetPage()
        loginInstance.login(username, password)
        cy.url().should('include', '/dashboard')
    })
})

改造login.js

//login.js
export default class LoginPage{ 
   
	constructor(){ 
   
		this.userNameLocator='input[name=username]'
		this.passwordLocator='input[name=password]'
		this.formLocator='form'
		this.url='http://localhost:7077/login'
	}
	get username(){ 
   
		return cy.get(this.userNameLocator)
	}
	get password(){ 
   
		return cy.get(this.passwordLocator)
	}
	get form(){ 
   
		return cy.get(this.formLocator)
	}
	isTargetPage(){ 
   
		cy.visit('/login')
		cy.url().should('eq', this.url)
	}
	login(userName, passWord){ 
   
		this.username.type(userName)
		this.password.type(passWord)
		this.form.submit()
	}
}

在pages路径下新建JS文件,并命名为mainPage.js

//mainPage.js
export default class mainPage{ 
   
	constructor(){ 
   
		this.h1Locator='h1'
		this.url='http://localhost:7077/dashboard'
	}
	get welComeText(){ 
   
		return cy.get(this.h1Locator)
	}
	isTargetPage(){ 
   
		cy.url().should('eq', this.url)
	}
}

更新testLogin.js文件,验证登陆成功后跳转到mainPage页面

//testLogin.js
/// <reference types="cypress" />
import LoginPage from "../pages/login"
import mainPage from "../pages/mainPage"
describe('登录测试,PageObject模式', function () { 
   
    const username = 'davie.yang'
    const password = 'yangdawei'
    it('登录成功', function () { 
   
        const loginInstance = new LoginPage()
        loginInstance.isTargetPage()
        loginInstance.login(username, password)
        cy.url().should('include', '/dashboard')
        const mainInstance = new mainPage()
        mainInstance.isTargetPage()
        mainInstance.welComeText.should('contain', 'davie.yang')
    })
})

进一步更新,将每个页面都公用的部分再次剥离,在pages路径下新建一个JS文件,并命名为commonPage.js

//commonPage.js
export default class CommonPage { 
   
    constructor() { 
   
        //构造函数,可以为空。
        //如果不为空,应该是所有 page 都会用到的变量。
    }
    isTargetPage() { 
   
        cy.url().should('eq', this.url)
    }

}

然后更新login.js文件

//login.js
import CommonPage from './commonPage'
export default class LoginPage extends CommonPage { 
   
    constructor() { 
   
        super()
        this.userNameLocator = 'input[name=username]'
        this.passwordLocator = 'input[name=password]'
        this.formLocator = 'form'
        this.url = 'http://localhost:7077/login'
    }
    get username() { 
   
        return cy.get(this.userNameLocator)
    }
    get password() { 
   
        return cy.get(this.passwordLocator)
    }
    get form() { 
   
        return cy.get(this.formLocator)
    }
    visitPage() { 
   
        cy.visit('/login')
    }
    login(userName, passWord) { 
   
        this.username.type(userName)
        this.password.type(passWord)
        this.form.submit()
    }
}

更新pages文件夹下的mainPage.js文件

import CommonPage from './commonPage'

export default class mainPage extends CommonPage { 
   
    constructor() { 
   
        super()
        this.h1Locator = 'h1'
        this.url = 'http://localhost:7077/dashboard'
    }
    get welComeText() { 
   
        return cy.get(this.h1Locator)
    }
}

到此一个PO模式实现完毕

Cypress的PO模式弊端

如果一个测试需要访问多个页面对象,这就意味着测试过程中需要初始化多个页面对象的实例,如果大多数页面对象需要 登陆才能访问,则每次初始化都需要先登录再访问,因为只有登陆后才能重用cookie,这无疑会增加测试执行的时间

因此在Cypress中并不认为PO是个很好的模式,Cypress认为跨页面共享逻辑是一个反模式(Anti-Pattern),在Cypress中,它提供了很多方式,允许用户通过更简单的方式直接设置被测应用程序达到的待测试状态,不需要再不同页面一遍又一遍的执行相通操作,这个更简单的方式就是***Custom Commands***

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137793.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 测试用例编写流程_测试用例的状态有几种

    测试用例编写流程_测试用例的状态有几种测试用例分层每个测试用例都有1个或多个测试步骤(List[step]),每个测试步骤对应一个API请求或其他用例的引用。从上图分析,我们可以看到testsuite中包含了3个测试用例,testca

    2022年8月6日
    4
  • MPP架构概念_体系架构是什么意思

    MPP架构概念_体系架构是什么意思MPP架构概念1.什么是MPPMPP(MassivelyParallelProcessing),即大规模并行处理。什么是并行处理?在数据库集群中,首先每个节点都有独立的磁盘存储系统和内存系统,其次业务数据根据数据库模型和应用特点划分到各个节点上,MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果。什么是大规模?每台数据节点通过专用网络或者商业通用网络互相连接,彼此协同计算,作为整体提供数据库服务。整个集群称为非共享数据库集群,非

    2022年10月27日
    0
  • Chapter 4 Invitations——14

    Chapter 4 Invitations——14

    2021年6月5日
    123
  • 数据库函数的用法「建议收藏」

    数据库函数的用法「建议收藏」dgkhjbxx–客户表   列(khmc)客户名称     列(khbh)客户编号apply_main_crdt–申请表  列(cust_no)客户编号 createorreplacefunctioncmis_getkhmc(idvarchar2)returnvarchar2iskhmc_mingchengdgkhjbxx.khmc%type;be…

    2022年6月16日
    28
  • GraphQL学习

    GraphQL学习

    2021年6月14日
    158
  • 目标跟踪之Lukas-Kanade光流法

    目标跟踪之Lukas-Kanade光流法光流是图像亮度的运动信息描述。光流法计算最初是由Horn和Schunck于1981年提出的,创造性地将二维速度场与灰度相联系,引入光流约束方程,得到光流计算的基本算法.光流计算基于物体移动的光学特性提出了2个假设:①运动物体的灰度在很短的间隔时间内保持不变;②给定邻域内的速度向量场变化是缓慢的。算法原理假设图像上一个像素点(x,y),在t时刻的亮度为E(x+Δx,y+Δy,t+

    2022年7月23日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号