【问题标题】:Is there a hook (or equivalent solution) for "right at the end of the test" for WebdriverIO?WebdriverIO 是否有“在测试结束时”的钩子(或等效解决方案)?
【发布时间】:2020-03-26 10:14:33
【问题描述】:

我一直在这个问题上兜圈子——我不相信这是可能的——希望有人能证明我错了!

在 WebdriverIO 中,我有一个类似的测试套件(这里大大简化了!):

describe ('My suite', function () {
  it ('Is the first test', function () {
     expect(1).to.equal(2);
  });
  it ('Is the second test', function () {
     expect(2).to.equal(2);
  });
});

我想做的是在我的两个测试的每一个结束时调用某种钩子,但代码中将包含进一步的“所有测试最后的共同点”断言,因此可能会影响测试的结果 - 因此为什么“afterTest”不好。显然我可以重复代码,或者在每个测试中定义一个函数并调用它,但是任何人都可以提供一种方法来作为某种钩子,所以实际上不需要包含对它的调用在每次测试结束时 - 只是一个自动或隐含的调用?

谢谢!

【问题讨论】:

    标签: javascript mocha.js chai webdriver-io


    【解决方案1】:

    真的有可能✅。请参考以下代码。要求包含 it() 块的测试文件,并在下一个实际的 it() 块开始执行之前将其从缓存中删除。我附上了执行截图。

    spec.js

    describe('Basic checks for internet app', () => {
    
      let resolved
    
      it('should have the right title', async () => {
        await browser.url('https://webdriver.io');
        const title = await browser.getTitle();
        assert.strictEqual(title, 'WebdriverIO · Next-gen WebDriver test framework for Node.js');
        require('./test');
        resolved = require.resolve('./test');
        delete require.cache[resolved];
      })
    
    
    
      it('should assert the wrong right title', async () => {
        await browser.url('https://webdriver.io');
        const title = await browser.getTitle();
        return assert.strictEqual(title, 'Next-gen WebDriver test framework for Node.js');
        require('./test');
        resolved = require.resolve('./test');
        delete require.cache[resolved];
      })
    
    
    })
    

    test.js

    import assert from 'assert';
    
        assert.equal(2, 2)
    

    (或)

    如果您希望这是一个单独的测试,请按照以下方式进行操作

    spec.js

    describe('Basic checks for internet app', () => {
    
      let resolved
    
      it('should have the right title', async () => {
        await browser.url('https://webdriver.io');
        const title = await browser.getTitle();
        return assert.strictEqual(title, 'WebdriverIO · Next-gen WebDriver test framework for Node.js');
      })
    
      require('./test');
      resolved = require.resolve('./test');
      delete require.cache[resolved];
    
      it('should assert the wrong right title', async () => {
        await browser.url('https://webdriver.io');
        const title = await browser.getTitle();
        return assert.strictEqual(title, 'Next-gen WebDriver test framework for Node.js');
      })
    
      require('./test');
      resolved = require.resolve('./test');
      delete require.cache[resolved];
    
    
    })
    

    test.js

    import assert from 'assert';
    
    it('should be executed', () => {
    
        assert.equal(2, 2)
    
    })
    

    【讨论】:

    • 我的观点是 test.js 被视为一个单独的测试,而不是它是一个钩子。有没有办法影响之前测试本身的结果?
    • 你可以在 it() 块中请求这个 JS 文件。我们需要删除 test.js 文件中的 it() 并且保留断言并保持不变。
    • @Raju 我已经编辑了答案并上传了截图。我已经提供了这两个选项。
    • 嗨@BharathKumarS - 感谢您为此付出的努力。不幸的是,虽然您的第一个解决方案(其中 test.js 不包含它自己的“it”块)很接近,但这个解决方案仍然存在我试图避免的相同问题 - 我不想重复代码(例如,在每个测试中都需要调用 test.js)。我希望用一个钩子来做 - 例如有点像'afterEach' - 但是afterEach的问题是在它执行时,当前测试已经完成,并且afterEach代码对测试结果没有影响...
    • 为了提供更多上下文,我实际上在做的是在多个测试中跨多个断言使用 try/catch 块,然后我希望在每个测试的末尾都有一个包装钩子/函数测试以抛出该测试的错误,然后再进行下一个测试,如果这有意义的话!
    猜你喜欢
    • 1970-01-01
    • 2020-09-07
    • 2011-10-26
    • 1970-01-01
    • 2022-06-28
    • 2020-05-22
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多