【问题标题】:More information about failed tests?有关失败测试的更多信息?
【发布时间】:2021-12-03 21:29:32
【问题描述】:

如何获取有关失败测试的更多信息? 理想情况下,我希望在 except 函数上有第二个参数,我可以在其中传递将显示在控制台上的字符串。比如:

var i = 0;
var j = 0;
expect( i / j, `failed when dividing ${i} ${j}` )

我也试过这个:

test.describe("Test description", () => {
    test("Test name", async ({ page }) => {
        ...snip...
        await test.step("Testing DIV0 is fail", async () => {
            await expect(4/0).toBe(5);
        });
       ...snip...
    });
});

命令行可能会快速闪烁文本Testing DIV0 is fail 1/1000 秒。这没有帮助。如果我找不到我想要发现的问题,基本上 Playwright 是无法使用的。

我所看到的:


  1) myTests.spec.ts:40:2 › Test description 

    Error: expect(received).toBe(expected) // Object.is equality

    Expected: 5
    Received: Infinity

      44 |              await test.step("Testing DIV0 is fail", async () => {
    > 45 |                      await expect(4/0).toBe(5);
         |                                        ^
      46 |              });


        at myTests.spec.ts:45:22
        at TestTypeImpl._step (...\node_modules\@playwright\test\lib\test\testType.js:213:13)
        at Function.step (...\node_modules\@playwright\test\lib\test\transform.js:133:12)
        at ...\tests\myTests.spec.ts:44:14
        at WorkerRunner._runTestWithBeforeHooks (...\node_modules\@playwright\test\lib\test\workerRunner.js:450:7)

  Slow test: basicPageChecks.spec.ts (24s)

  1 failed
    myTests.spec.ts:40:2 › Test description 
  12 skipped

我可以很容易地在代码中添加注释。或者添加日志记录。

也许这些额外的数据可以在报告中获得??我错过了什么吗??

【问题讨论】:

  • 没有办法在开玩笑的期望中传递额外的消息(并且在剧作家期望中扩展了这些消息)。在您的示例中,输出清楚地显示 `Expected: 5 Received: Infinity`,因此您可以看到预期值和实际值。您在输出中遗漏了哪些信息?
  • 在第一个代码 sn-p 中,我给出了我想要的详细程度的示例:failed when dividing ${i} ${j})。我希望能够传递一个字符串,我可以在其中提供我想要的信息。也许代码在数据集上循环,一个例子失败了。最好能得到哪条数据失败。此外,我解释说我看不到字符串 Testing DIV0 is fail 也符合我的标准。
  • 我有幸与熟悉剧作家的人交谈,似乎问题已经得到解决。这并不完全直观。属于test() 的console.log 输出不仅会在执行时记录,还会再次记录在显示的摘要下。
  • 为了清楚起见,console.log 不是答案的原因是它总是 记录。目标是仅在必要时记录额外信息。
  • 您可以随时手动检查您的条件并抛出您喜欢的任何消息: if (i/j !== 5) throw new Erorr(`failed when division ${i} ${j}` );

标签: playwright


【解决方案1】:

从这个答案中大量借鉴:Re-throwing exception in NodeJS and not losing stack trace

一个很好的解决方案(意味着只记录错误,它不需要使用额外的 if 语句仔细检查每个逻辑步骤,并且不会将 try/catch 包装每个例外的代码行数增加三倍)是执行以下操作:

添加一个新类

export class RethrownError extends Error {
    constructor(message, error) {
        super(message);
        this.name = this.constructor.name;
        if (!error) {
            throw new Error("RethrownError requires a message and error");
        } else {
            this.original_error = error;
            this.stack_before_rethrow = this.stack;
            const message_lines =  (this.message.match(/\n/g)||[]).length + 1;
            this.stack = this.stack.split("\n").slice(0, message_lines+1).join("\n") + "\n" + error.stack;
        }
    }
    static expectWithMessage(message, cb) {
        try {
            cb()
        } catch(ex) {
            throw new RethrownError(message, ex);
        }
    }
}

更改除外

await expect(4/0).toBe(5);

await RethrownError.expectWithMessage("DIV by zero", () => {expect(4/0).toBe(5); });

这个解决方案的问题是期望线非常难看(线长)。

希望有一天 MS 会更新 expect() 以接受第二个错误消息参数。

【讨论】:

    猜你喜欢
    • 2019-08-29
    • 1970-01-01
    • 2012-06-02
    • 2015-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2018-04-06
    相关资源
    最近更新 更多