在 Cypress 中的测试之间保留动态变量

Ton*_*ell 3 javascript cypress

我正在尝试进行赛普拉斯测试,我想在输入中设置一个随机数,然后检查随机数在另一个页面中是否设置正确。我正在使用此函数创建随机数:

function getRandomArbitrary(min, max, decimals) {
  return (Math.random() * (max - min) + min).toFixed(decimals);
}
Run Code Online (Sandbox Code Playgroud)

并在描述中设置变量,如下所示:

  describe('Reflect changes from X to the Y', () => {
  const termCap = getRandomArbitrary(0.01, 0.3, 2);
  const termCapFee = getRandomArbitrary(0.01, 0.3, 2);
Run Code Online (Sandbox Code Playgroud)

我当前遇到的问题是变量在我创建的每个不同的 it() 中重置。我不知道会发生什么,因为我希望通过所有测试保持相同的一致数字。

我尝试将它们设置在 before() 中,但这也不起作用。

有谁知道我应该如何创建变量?

Old*_*led 6

我尝试将它们设置在 before() 中,但这也不起作用。

before块应该可以工作。也许该before块设置不正确?我可以使用以下设置使其正常工作。

describe("Foo Fighter", function() {
    var foo;
    before(function () {
        foo = getRandomArbitrary(1,10,1);
    });

    it("Fighting foo 1", function () {
        cy.log(foo);
    });
    it("Fighting foo 2", function () {
        cy.log(foo);
    });
    it("Fighting foo 3", function () {
        cy.log(foo);
    });
});
function getRandomArbitrary(min, max, decimals) {
  return (Math.random() * (max - min) + min).toFixed(decimals);
}
Run Code Online (Sandbox Code Playgroud)

这会产生以下结果,随机数在每个块期间保持不变it

测试运行

逻辑流程是:

  • describe块中,声明您的变量。
  • before块中,使用随机数设置变量。
  • it块中,使用设置变量。

编辑

回答您的评论:

如果我像你一样设置它,它工作得很好,但想象一下,如果在第一个它你访问谷歌,在第二个你访问github,之前的块将运行两次

这里的问题是,当您访问新站点时,Cypress 会重新加载整个测试上下文,因此before就像您提到的那样,每次重新加载测试上下文(即每次访问新域时)都会再次运行一个块。

解决这个问题的方法是通过设置另一个首先运行的描述并将变量写入固定装置并在测试中使用这些固定装置来进行作弊,如下所示:

describe("Before Describe", function(){
    const foo = getRandomArbitrary(1,10,1);
    it("Setting up test context", function() {
        cy.writeFile("cypress/fixtures/test.json", { "foo" : foo});
    });
});



describe("Foo Fighter", function() {
    it("Fighting foo 1", function () {
        cy.visit("https://example.cypress.io");
        cy.fixture("test.json").then(kung => {
            cy.log(kung.foo);
        })
    });
    it("Fighting foo 2", function () {
        cy.visit("https://google.com")
        cy.fixture("test.json").then(kung => {
            cy.log(kung.foo);
        })
    });
    it("Fighting foo 3", function () {
        cy.fixture("test.json").then(kung => {
            cy.log(kung.foo);
        })
    });
});

function getRandomArbitrary(min, max, decimals) {
  return (Math.random() * (max - min) + min).toFixed(decimals);
}
Run Code Online (Sandbox Code Playgroud)

这将产生以下结果:

测试二

诚然,这不是构建测试流程的最干净的方法,但是,它会产生您想要的结果。如果您将设置放在与其他测试相同的it第一个测试中,也应该可以工作。describe