Jest.js 检查每次测试后测试是否失败

iswrvxsc  于 2023-04-10  发布在  Jest
关注(0)|答案(4)|浏览(183)

当我的一个Jest测试失败时,我想存储一个屏幕截图,但只有当它失败时。
这里是我的一段测试代码作为示例,afterEach中的**!passed**部分不起作用。

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();
  });
});

对于Jasmine,我会做这样的事情:

var passed = jasmine.getEnv().currentSpec.results().passed();

但是我找不到类似的Jest。也许有另一种解决方案,比如在每个失败的expect上截取屏幕截图?我在expect周围尝试了try/catch,但是测试总是通过...
如果我的测试在afterEach中失败了,我如何使用Jest进行检查?

9o685dep

9o685dep1#

将当前spec结果保存在Jasmine中,并在afterEach中访问。

  • @Niels货车Reijmersdal是正确的。然而,在specDone中截图的缺点是它在**afterEach之后运行,所以如果afterEach中有什么东西,比如说,向后导航几个屏幕,您最终拍摄的屏幕截图并不能代表错误发生的位置。这是一个答案,允许您在错误发生后立即截图。*

1.为specStarted添加一个自定义Jasmine报告程序,并将spec结果存储到jasmine.currentTest

jasmine.getEnv().addReporter( {
  specStarted: result => jasmine.currentTest = result
} );

不直观的是,即使我们在结果进入之前将其存储在specStarted中,jasmine.currentTest存储了对result对象的引用,该引用将随着spec运行而动态更新,因此当我们在afterEach中访问它时,它将正确地保存spec的结果。
1.检查afterEach中的failedExpectations,如果有任何故障,请截图。

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

ggazkfy82#

下面是我在项目中解决这个问题的一个例子:(假设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
    })

})

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

  • test1 -通过,无屏幕截图
  • test 2-失败,有屏幕截图
ql3eal8s

ql3eal8s3#

jasmine对象似乎可以在Jest测试中使用,但是currentSpec在2.x版本中被删除了。
我已经找到了一个使用Jasmine自定义报告的替代方案。只要确保您也将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');
  });
});
knpiaxh1

knpiaxh14#

提供了不再工作的答案,因为jest现在使用的是jest-circus,而不是jasmine。请参阅线程的可能解决方案:https://github.com/facebook/jest/issues/5292#issuecomment-1328993445

相关问题