尝试让 Cypress、TypeScript 和 IstanbulJS 协同工作

Trying to make Cypress, TypeScript and IstanbulJS work together

我正在尝试使用 IstanbulJS for my code written in TypeScript and tested with Cypress 生成代码覆盖率报告。但是事情被报告不当:

我专门针对这个问题创建了一个git repository MCVE,所以你可以完全重现我的情况:

git clone https://github.com/papb/cy-ts-istanbul-question
cd cy-ts-istanbul-question
npm install
npm test
# And then open the file `coverage/index.ts.html` to see the image above.

如何解决?


详情

我有一些用 TypeScript 编写的代码,我使用 rollup, rollup-plugin-typescript2 and rollup-plugin-istanbul 将其转换并捆绑到单个 JavaScript (ES6) 文件中。这非常有效,我在 TypeScript 中的源代码变成了一个文件,可以用 <script> 标记包含在浏览器中并使用。

其次,我使用 cypress 对 HTML 页面进行 运行 测试,其中包含上述转译的 JS 代码。这也很完美,cypress 能够测试我最初用 TypeScript 编写的函数。

现在,我想为这些测试设置覆盖率报告。在赛普拉斯常见问题解答中,我们可以找到问题 Is there code coverage? to which the answer is currently no (regarding built-in functionality) but is in discussion as a welcome thing to be done in the future, and in fact it can be done.

问题是:上面做这件事的人没有使用 TypeScript。我是。所以我还有一些额外的步骤要做,这就是我目前遇到的问题。直觉上,我认为这只是配置 IstanbulJS 以正确遵循源映射的问题,但我找不到有关如何执行此操作的任何文档。 Every guide about TypeScript + IstanbulJS that I can find 假设我使用的是 Mocha,但我不是 - 我使用的是 Cypress 和来自 TypeScript 的转译源。

注意:我知道一般来说,通常的 "code coverage" 柏树测试方法没有多大意义,但在我的具体情况下,我认为它确实如此,我认为关于它,请不要让这个框架挑战这个问题。


编辑: 需要说明的是,这里使用汇总并不是硬性要求。如果您有一个使用其他东西的解决方案,那也是完全可以接受的。重要的是,正如标题所说,Cypress + TypeScript + IstanbulJS。

我花了一些时间试图解决这个问题。这似乎是汇总如何生成兼容代码的问题。通过更改您的 tsconfig 目标,我能够使分支达到 75%

{
  "compilerOptions": {
    "target": "es5",
    "module": "es2015",
    "declaration": true,
    "declarationMap": true,
    "sourceMap": true,
    "outDir": "./dist",
    "strict": true,
    "esModuleInterop": true
  }
}

它涵盖了所有代码,但必须有一个由 rollup 生成的分支正在通过。但我真的不认为赛普拉斯是为这样的功能测试而设计的

我用了webpack+babel-loader+@babel/preset-typescript+babel-plugin-istanbul

基本上策略是:

  • 检测您的应用代码,以便在 window.__coverage__
  • 上生成覆盖率
  • cypress 规范运行后,使用 cy.writeFile 将报告保存到 .nyc_output
  • 并使用 cy.exec('nyc report --reporter=html')
  • 生成报告

然后您应该能够在 coverage/ 目录中查看 html 覆盖率报告

这是我对您的项目所做的更改,切换到 webpack 并具有完全有效的代码覆盖率:

https://github.com/Bkucera/cypress-code-coverage/commit/40f88aa27778dc55ad3fae56af66724f73b6496d

我整理了其他工作示例 here。它有在新弹出的 create-react-app(使用 webpack)和普通 typescript + webpack 项目之上设置代码覆盖率的示例:

create-react-app-ejected:

cypress 在新弹出的 create-react-app 上设置了代码覆盖率 使用:

  • @babel/preset-typescript
  • @cypress/webpack-preprocessor
  • babel-loader
  • babel-plugin-istanbul

vanilla-typescript-webpack:

vanilla typescript 和 webpack 项目的代码覆盖率 使用:

  • @babel/preset-typescript
  • @cypress/webpack-preprocessor
  • babel-loader
  • babel-plugin-istanbul

在这两个方面,我还检测了柏树代码,以便您可以合并覆盖率报告,但我目前不这样做