为什么赛普拉斯打印“cy.log”输出的时间比我预期的要晚?

Eur*_*eka 8 cypress

我试图用它cy.log来帮助我理解测试失败的原因。不幸的是,我似乎无法让它记录我想要的消息。经过一番摆弄后,我进行了这个测试:

describe.only("In what order are these messages printed?", () => {
  it("I would expect the LOG to be printed before the EXPECT", () => {
    cy.log("Hello from cy.log");
    expect(1 + 1).to.equal(2);
  });
});
Run Code Online (Sandbox Code Playgroud)

我希望“Hello”首先出现,但我得到的是:

在此输入图像描述

此外,在一次失败的测试中,cy.log似乎根本没有出现,这对我来说是不幸的。同样,这是一个简单但极端的例子。

describe.only("Here is my real problem", () => {
  it("I would expect the LOG to be printed before the test fails", () => {
    cy.log("Hello from cy.log");
    expect(2 + 2).to.equal(42);
  });
});
Run Code Online (Sandbox Code Playgroud)

这会产生这样的结果:

在此输入图像描述

这是赛普拉斯的预期行为吗?

如果是这样,我可以求助于console.log. 尽管遗憾的是我们无法在 Cypress 主窗口本身中整齐地报告日志。

或者我是否不小心设置了一个扰乱时间的设置cy.log

更新:答案摘要

下面有很好的答案。关键是要意识到,当您编写如下所示的 Cypress 测试时:

it("...",()=>{
   callFunctionA()
   b += 1;
   cy.log("Hello from line C")
   d = 10;
   cy.get("#input-box-e")
   console.log("f")
})
Run Code Online (Sandbox Code Playgroud)

...实际发生的是:

   callFunctionA()
   b += 1;
   Add to list to do LATER: cy.log("Hello from line C")
   d = 10;
   Add to list to do LATER: cy.get("#input-box-e")
   console.log("f")
Run Code Online (Sandbox Code Playgroud)

为什么?我认为这是因为 Cypress 是专门为与网页交互而设计的。因此,压倒性的优先级是对命令进行排队cy.get(),并重试它们,直到超时等。这一点非常重要,以至于 Cypress 的制造商愿意(并且实际上被迫)颠覆我们对明显同步列表的天真期望。代码语句的意思。

只有将cy.get命令推送到可以尝试和重试的队列中,网页交互才能如此顺利。

我假设cy.log已添加到添加到该队列的一组内容中,只是因为它是cy..

我所看到的行为的解释

我认为在我上面的例子中发生的事情是expect,实际上,普通的Javascript(不是悬而未决的东西cy.),所以它首先被执行,而cy.log被推入队列稍后执行。

当期望成功时,cy.log最终会打印出来。

当期望失败时,会中止cy.该测试的命令队列,因此cy.log永远不会打印。

解决方案

所以是的,如果我们想立即记录输出而不是有条件地在测试通过时记录输出,我们应该使用console.lognot cy.log

cy.或者我们可以使用延迟测试在队列内进行cy.then(),如 @Fody 所示。

Fod*_*ody 14

Cypress 使用队列系统,基本上任何东西cy.*都是一条指令,将某些内容添加到命令队列中。

当测试代码运行时,所有内容都按照正常的 javascript 顺序执行,除了命令队列在测试代码执行后运行。

您可以使用 将同步 javascript 放入队列中cy.then(),并根据命令队列获取日志顺序。

describe.only("Here is my real problem", () => {
  it("I would expect the LOG to be printed before the test fails", () => {
    cy.log("Hello from cy.log");
    cy.then(() => expect(2 + 2).to.equal(42))
  })
})
Run Code Online (Sandbox Code Playgroud)

  • 如果你尝试一下,你会感到惊讶:) (4认同)