首页 > 解决方案 > 使用赛普拉斯从单独的文件动态调用测试

问题描述

我的目标是解析一些 json 文件,该文件确定应该从另一个文件中包含的更大的测试列表中运行哪一组特定的“it”测试。下面是我思考过程的一个例子。

这个问题背后的上下文是 json 文件包含有关给定用户角色(客户端、管理员、所有者等)可以访问的页面的哪些部分的信息,我只想在页面的部分运行测试用户可以访问多个文件,例如allTestsForPage.js网站上的每个页面。

从我的测试中,我可以运行函数,但不能运行其中的“it”测试。我不确定这是否是正确的思路,或者是否有更好的替代方案来解决这个问题。

// spec.js

describe("run tests dynamically", () => {
    let methods = require('allTestsForPage.js')
    before(() => {
        cy.visit('/') // visit homepage
        cy.fixture('rawData.json').as('data') // get json data
        cy.get('@data').then((data) => {
            // parse json data into list of tests to run
            // Ex: listOfTests = ['a', 'c']
            listOfTests.forEach((test) => {
                methods[test]() // runs the 'it' tests within a() and c() from allTestsForPage.js
            }
            
        }
    }
}
// allTestsForPage.js

function a(){
    it('should load page', () => {
        // do some test
    }
}

function b(){
    it('click an add button', () => {
        // do some test
    }
}

function c(){
    it('click a remove button', () => {
        // do some test
    }
}

module.exports = {
    a:a,
    b:b,
    c:c
}

标签: javascriptcypress

解决方案


您(很可能)无法根据data

cy.fixture('rawData.json')        // don't need to alias the fixture
  .then((data) => {             

因为那使用了一个异步命令。当规范运行时,它需要确切地知道将调用多少个it().

您可以动态skip测试,请参阅如何在赛普拉斯中添加测试用例分组

如果您不使用赛普拉斯获取数据文件,您的方法可能会奏效,

const raw = require('./fixtures/rawData.json')
const data = JSON.parse(raw)

推荐阅读