在每次开玩笑之后检查测试是否失败

Nie*_*dal 5 javascript automated-tests jestjs

当我的一个Jest测试失败时,我想存储一个屏幕截图,但仅当它失败时。

这里以我的测试代码为例,!passedafterEach中的部分不起作用。

describe('Page', () => {  
  it('should contain Text in the header', async () => {
    // Arrange
    const page = new Page(driver);

    // Act
    await page.open();

    // Assert
    expect(await page.getHeaderText()).toBe('Something');
  });

  afterEach(async () => {
    if (!passed) takeScreenshot();
    await driver.quit();
  });
});
Run Code Online (Sandbox Code Playgroud)

使用茉莉花,我会做类似的事情:

  var passed = jasmine.getEnv().currentSpec.results().passed();
Run Code Online (Sandbox Code Playgroud)

但是我找不到Jest的类似东西。也许还有另一种解决方案,例如对每个失败的期望进行截图?我尝试了一下try / catch,但是测试总是通过...

如果在afterEach中测试失败,如何与Jest核对?

Jos*_*ter 7

将当前规格结果存储在 Jasmine 中并在afterEach.

@Niels van Reijmersdal 走在正确的轨道上。然而,截取屏幕截图的缺点specDone是它在 后 afterEach运行,因此,如果其中有某些内容afterEach(例如,导航回几个屏幕),您最终截取的屏幕截图将无法代表错误发生的位置。这是一个答案,允许您在错误发生后立即截取屏幕截图。

  1. 添加自定义 Jasmine 报告器并将specStarted规范结果存储到jasmine.currentTest.

    jasmine.getEnv().addReporter( {
      specStarted: result => jasmine.currentTest = result
    } );
    
    Run Code Online (Sandbox Code Playgroud)

    不直观的是,即使我们在specStarted结果出现之前将其存储,jasmine.currentTest存储对result对象的引用,该对象将在规范运行时动态更新,因此当我们在我们的 中访问它时afterEach,它将保存结果正确的规格。

  2. 检查failedExpectations您的情况afterEach并截取屏幕截图,看看是否有任何失败。

    afterEach( async () => {
      if ( jasmine.currentTest.failedExpectations.length > 0 ) { // There has been a failure.
        await driver.takeScreenshot();
      }
    } );
    
    Run Code Online (Sandbox Code Playgroud)


Lar*_*isa 5

这是我如何在项目中解决它的示例:(假设 afterEach 仅用于截取屏幕截图,而不用于清理和其他导航)

const testIt = (name, action) => {
    test(name, async () => {        
        try {         
            await action()} 
        catch (error) {           
            await screenshots.createScreenshot(page) //take screenshot 
            throw error
        }
    })
  }

describe('Test scenario 1', () => {
   
    testIt('test1 will Pass', async () => {
        expect(true).toBe(true)
    })
        
    testIt('test2 will Fail', async () => {
        expect(true).toBe(false)
    })

    afterEach(async () => {
        //ignored
    })

})
Run Code Online (Sandbox Code Playgroud)

我使用 jest-html-reporters,只有失败的测试才会有附件(此解决方案不需要任何其他配置)。结果:

  • test1 - 通过,无截图
  • test2 - 失败,有屏幕截图


Nie*_*dal 3

看起来 jasmine 对象可以在 Jest 测试中使用,但 currentSpec 在 2.x 版本中已被删除。

我找到了使用茉莉花自定义报告的替代方案。只需确保您也将其移交driver.quit()给记者,因为测试后您可能仍然需要驱动程序。

这是报告者在测试结束时处理失败测试的简单示例:

const reporter = {
  specDone: async (result) => {
    if (result.status === 'failed') {
      takeScreenshot(result.description);
    }
    await driver.quit();
  },
};

jasmine.getEnv().addReporter(reporter);

describe('Page', () => {  
  it('should contain Text in the header', async () => {
    // Arrange
    const page = new Page(driver);

    // Act
    await page.open();

    // Assert
    expect(await page.getHeaderText()).toBe('Something');
  });
});
Run Code Online (Sandbox Code Playgroud)