带有 python 测试的 Vue Cypress 代码覆盖率报告

Posted

技术标签:

【中文标题】带有 python 测试的 Vue Cypress 代码覆盖率报告【英文标题】:Vue Cypress code coverage report with python tests 【发布时间】:2021-07-23 16:10:34 【问题描述】:

我使用 Selenium 进行 Python 测试来测试我的 Vue 网页。我想获得这些测试的代码覆盖率结果。我已经安装了 babel-plugin-istanbul 来检测应用程序,它可以工作。我有window.__coverage__ 对象,其中包含覆盖信息。

我的问题是,如果我使用 Python 而不是赛普拉斯的测试框架运行测试,我如何获得覆盖率报告。我已经安装了 cypress/code-coverage,但是如果不使用 Cypress 的单元测试框架,我不知道如何生成报告。

另外,如果有其他的 Vue 覆盖率报告框架,更适合我的用例,我愿意提出建议。

【问题讨论】:

【参考方案1】:

这是我在没有任何 Cypress 库的情况下如何做到的:

在测试文件的tearDownClass 方法中(在所有测试之后),我添加了这段代码,将window.__coverage__ 保存到.nyc_output/out.json 文件中:

@classmethod
def tearDownClass(cls):
    # Put coverage data into file.
    data = cls.driver.execute_script('return window.__coverage__')
    
    with open(os.path.join(cls.webAppPath, ".nyc_output", "out.json"), 'w') as outfile:
        json.dump(data, outfile)

    # Generate html coverage report
    os.system("cd %s && %s report --reporter=html -e .vue" % (cls.webAppPath, os.path.join(cls.webAppPath, "node_modules", ".bin", "nyc")))

请注意,.nyc_output 文件夹必须位于 Web 应用程序的文件夹中。此外,在测试期间,不应重新加载网页,因为这会重置覆盖计数器,从而提供不正确的覆盖。

但是,这还不够。伊斯坦布尔的代码中有一个错误,所以我使用了一个修复程序,找到了here。在测试之前,我用这种方式修改了istanbul的一部分代码(然后重新编译了web app的代码):

# Fix a bug in istanbul code coverage lib
pathOfFileToModify = os.path.join(webAppPath, "node_modules/istanbul-lib-source-maps/lib/pathutils.js")

with open(pathOfFileToModify, "r") as fileToModify:
    modified = fileToModify.read().replace('relativeTo(file, origFile) \n        return', 'relativeTo(file, origFile) \n        if (origFile.indexOf(file) !== -1)  return origFile \n        return')

with open(pathOfFileToModify, "w") as fileToModify: # TODO Maybe figure out how to use read-write mode?
    fileToModify.write(modified)

如果有人找到更好的解决方法,请在 cmets 中告诉我。

【讨论】:

处理窗口加载/重新加载赛普拉斯代码覆盖挂钩到windowLoad 事件。这可以在测试运行期间提供多个__coverage__ 对象,这些对象被保存到一个数组中,并在运行结束时使用伊斯坦布尔coverageMap 对象与coverageMap.merge(__coverage__) 组合,然后转储到out.json。我不确定您需要哪个 Selenium 事件(可能是 beforeNavigateTo),但很容易找到。

以上是关于带有 python 测试的 Vue Cypress 代码覆盖率报告的主要内容,如果未能解决你的问题,请参考以下文章

Cypress Vue 组件测试运行程序 - 测试按钮单击已发出事件

如何在本地运行 Vue.js 应用程序并使用 npm 脚本按顺序运行 Cypress 测试

Vue Cypress 和 Gitlab CI/CD

cypress初探

cypress初探

cypress初探