Cypress 在不重复代码的情况下,将单个测试组合到单个端到端测试中

Cypress 在不重复代码的情况下,将单个测试组合到单个端到端测试中,cypress,Cypress,我们已经编写了一系列Cypress测试来检查我们应用程序每个部分的特定功能:customer_spec.js、order_spec.js、delivery_spec.js、doJob_spec.js等。这似乎遵循Cypress推荐的最佳实践,单独测试每件事情。我们希望能够在一个文件中调用这些单独的测试或部分测试,以构建端到端测试,同时仍然保持运行单独测试的能力。这个概念在一定程度上存在于command.js文件中创建的命令中,比如login,您可以在单独的测试中调用它(使用login()),而不

我们已经编写了一系列Cypress测试来检查我们应用程序每个部分的特定功能:customer_spec.js、order_spec.js、delivery_spec.js、doJob_spec.js等。这似乎遵循Cypress推荐的最佳实践,单独测试每件事情。我们希望能够在一个文件中调用这些单独的测试或部分测试,以构建端到端测试,同时仍然保持运行单独测试的能力。这个概念在一定程度上存在于command.js文件中创建的命令中,比如login,您可以在单独的测试中调用它(使用login()),而不是重复登录代码


我们找不到任何关于这是否可行以及如何实现的文档。我们的想法是能够创建一个customer\u life\u cycle\u spec.js文件,然后调用login()、addcustomer()、dojob()、orderitems()、receiveitems()等。

是的,
Cypress
支持在UI中创建和重用操作和状态,例如在测试前注册和登录

但是,
Cypress
,通过
cy.request()
可以比用户更有效地控制浏览器的状态,使测试更简单、更快、更可靠

查看下面的示例,其中
cy.request
用于在服务器上创建/读取状态

命令/index.js
中:

Cypress.Commands.add('login',(用户)=>{
cy.request('POST',`${apirl}/users/login',user)
})
Cypress.Commands.add(“寄存器”,(用户)=>{
cy.request('POST',`${apirl}/users/register',user)
})
Cypress.Commands.add('getUser',(用户名)=>{
返回cy.request('GET',`${apirl}/users/${username}`)
})
register.spec.js
中:

it('可以注册',()=>{
常量用户={
名字:“杰克”,
电邮:'jake@jake.com',
密码:“12345”
}
cy.visit(“/register”)
cy.get('input[name=“name”]”)。类型(user.name)
cy.get('input[name=“email”]”)。键入(user.email)
cy.get('input[name=“password”]”)。键入(user.password)
cy.get('input[name=“password confirm”]”)。键入(user.password)
cy.get('input[type=“submit”]”)。单击()
//确保注册页面在注册后发送给您/主页
cy.url()应该('contain','/home'))
//期望来自服务器的用户与来自测试的用户匹配
cy.getUser(user.name)
.then((dbUser)=>expect(dbUser).to.deep.eql(user))
})
login.spec.js
中:

it('可以登录',()=>{
常量用户={
姓名:'简',
电邮:'jane@jane.com',
密码:“12345”
}
//带输出用户界面的寄存器
cy.register(用户)
cy.visit(“/login”)
cy.get('input[name=“name”]”)。类型(user.name)
cy.get('input[name=“password”]”)。键入(user.password)
cy.get('input[type=“submit”]”)。单击()
//确保登录页面在登录后将您发送回家
cy.url()应该('contain','/home'))
})
userSettings.spec.js
中:

it('可以更改电子邮件',()=>{
常量用户={
姓名:'简',
电邮:'jane@jane.com',
密码:“12345”
}
//不带用户界面注册和登录
cy.register(用户)
cy.login(用户)
cy.visit(“/settings”)
cy.get('input[name=“email”]”)。键入('UpdatedEmail@jane.com')
cy.get('input[type=“submit”]”)。单击()
cy.getUser(user.name)
.then((dbUser)=>expect(dbUser.email).to.eql('UpdatedEmail@jane.com'))
})

我不请自来的建议:我猜有人(你的经理?)告诉你,你需要那种类型的工作流测试,尽管你已经测试了每个单独的操作,这提供了相同的覆盖范围和信心。我建议您教育他们为什么Cypress建议以这种方式进行测试,而不是编写重复的测试来取悦他们。隔离测试是一种很好的做法,但与大多数应用程序一样,该应用程序中存在相互依赖性,隔离无法测试。我们的端到端测试旨在确认对一个实体的更改会影响另一个实体。我们正在尝试重新创建一个工作流,这是一个创建实体、使用实体、验证、撤消和清理实体的真实测试。孤立地测试事物不允许我们创建真实世界的测试,这是Cypress的另一个目标。撇开哲学问题不谈,只是确定技术的可行性。我相信你们可以在独立的测试中设置状态,这样长时间运行的端到端测试就不会有任何额外的测试,但我们同意在这一点上存在分歧。如果您打算这样做,我会使用自定义命令,如“createEntity”、“readEntity”、“updateEntity”、“deleteEntity”(或根据您的应用程序使用的任何名称)。然后从两个测试中调用它们。较小的测试将通过API设置、验证和分解状态,所有UI操作都将通过这些自定义命令完成。您可以通过将外部
description
包装到函数中,然后从另一个测试导入和调用该函数来模块化测试套件。但是,我不确定如何在Cypress runner中单独(自动)运行包装好的测试套件。