无需重复代码即可将单个测试合并为单个端到端测试

时间:2018-11-29 17:54:43

标签: cypress

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

我们找不到任何文档来讨论这是否可行以及如何实现。我们的想法是能够创建一个customer_life_cycle_spec.js文件,该文件随后将调用login(),addcustomer(),dojob(),orderitems(),receiveitems()等。

1 个答案:

答案 0 :(得分:0)

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

然而Cypresscy.request()允许您比用户更有效地控制浏览器的状态,从而使测试更简单 >,更快更可靠

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

commands/index.js中:

Cypress.Commands.add('login', (user) => {
    cy.request('POST', `${apiUrl}/users/login`, user)
})

Cypress.Commands.add("register", (user) => {
    cy.request('POST', `${apiUrl}/users/register`, user)
})

Cypress.Commands.add('getUser', (username) => {
    return cy.request('GET', `${apiUrl}/users/${username}`)
})

register.spec.js中:

it ('can register', () => {
    const user = {
      name: 'jake',
      email: 'jake@jake.com',
      password: '12345'
    }

    cy.visit('/register')
    cy.get('input[name="name"]').type(user.name)
    cy.get('input[name="email"]').type(user.email)
    cy.get('input[name="password"]').type(user.password)
    cy.get('input[name="password-confirm"]').type(user.password)
    cy.get('input[type="submit"]').click()

    // ensure register page sends you /home after register
    cy.url().should('contain', '/home')

    // expect user from server to match user from test
    cy.getUser(user.name)
    .then((dbUser) => expect(dbUser).to.deep.eql(user))
})

login.spec.js中:

it('can log in', () => {
    const user = {
        name: 'jane',
        email: 'jane@jane.com',
        password: '12345'
    }

    // register w/out UI
    cy.register(user)

    cy.visit('/login')
    cy.get('input[name="name"]').type(user.name)
    cy.get('input[name="password"]').type(user.password)
    cy.get('input[type="submit"]').click()

    // ensure the login page sends you home after login
    cy.url().should('contain', '/home')
})

userSettings.spec.js中:

it('can change email', () => {
    const user = {
        name: 'jane',
        email: 'jane@jane.com',
        password: '12345'
    }

    // register and login w/o UI
    cy.register(user)
    cy.login(user)

    cy.visit('/settings')
    cy.get('input[name="email"]').type('UpdatedEmail@jane.com')
    cy.get('input[type="submit"]').click()

    cy.getUser(user.name)
    .then((dbUser) => expect(dbUser.email).to.eql('UpdatedEmail@jane.com'))
})