我试图用它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)
| 归档时间: |
|
| 查看次数: |
716 次 |
| 最近记录: |