前言

  • 前面介绍 Cypress 如何通过命令行运行,就是采用 cypress run 或 cypress open 命令,但这不是 Cypress 唯一的运行方式
  • Cypress 还允许你将它视为一个 Node Module 来运行,然后通过Node.js运行Cypress,这种方式可以更加灵活地定制测试行为
  • 当想在运行后直接访问测试结果时,此功能很有用

如何有用

  • 挑选测试用例运行
  • 整合所有测试用例,提供一份完整HTML格式的测试报告
  • 重新运行单个失败的 spec 文件
  • 发送有关测试失败的通知,包括附带的屏幕截图
  • 启动其他构建行为或脚本

重点

模块 API支持两个命令: cypress.run() 和 cypress.open()

cypress.run() 命令详解

栗子

代码

  1. // 导入 cypress 模块
  2. const cypress = require('cypress')
  3. // 执行 run 命令
  4. cypress.run({
  5. spec: './cypress/integration/00_examples/actions.spec.js'
  6. })
  7. .then((results) => {
  8. // 打印结果
  9. console.log(results)
  10. })
  11. .catch((err) => {
  12. // 抓取错误信息并打印
  13. console.error(err)
  14. })

运行命令

可以在 cmd 窗口或 npm 脚本中运行下列命令

  1. node 1_run.js

运行结果

Cypress系列(72)- 详解 Module API - 图1
最终运行的是 actions.spec.js 这个测试用例文件

参数列表

和 cypress run 命令行运行的参数一样
Cypress系列(72)- 详解 Module API - 图2

命令返回结果

cypress.run() 返回一个Promise对象,该 Promise 包含测试结果对象(类似 json 格式的数据),典型的运行可能会返回以下内容:

  1. {
  2. startedTestsAt: '2020-10-23T06:22:53.210Z',
  3. endedTestsAt: '2020-10-23T06:23:23.342Z',
  4. totalDuration: 30132,
  5. totalSuites: 1,
  6. totalTests: 14,
  7. totalFailed: 0,
  8. totalPassed: 14,
  9. totalPending: 0,
  10. totalSkipped: 0,
  11. runs: [
  12. {
  13. stats: [Object],
  14. reporter: 'cypress/reporters/custom_reporter.js',
  15. reporterStats: [Object],
  16. hooks: [Array],
  17. tests: [Array],
  18. error: null,
  19. video: 'C:\\Users\\user\\Desktop\\py\\MyCypress\\cypress\\videos\\00_examples\\actions.spec.js.mp4',
  20. spec: [Object],
  21. shouldUploadVideo: true
  22. }
  23. ],
  24. browserPath: '',
  25. browserName: 'electron',
  26. browserVersion: '85.0.4183.121',
  27. osName: 'win32',
  28. osVersion: '10.0.18363',
  29. cypressVersion: '5.4.0',
  30. config: {
  31. defaultCommandTimeout: 10000,
  32. env: {
  33. ENVIRONMENT: 'staging',
  34. dev: [Object],
  35. qa: [Object],
  36. foor: 'bar',
  37. key: '系统环境变量哦',
  38. host: 'test',
  39. api_server: 'http://localhost:8888/api/v1/'
  40. },
  41. configFile: 'C:\\Users\\user\\Desktop\\py\\MyCypress\\cypress.json',
  42. version: '5.4.0',
  43. reporter: 'cypress/reporters/custom_reporter.js',
  44. baseUrls: 'http://localhost:7077/',
  45. retries: 2,
  46. targetEnv: 'dev',
  47. projectRoot: 'C:\\Users\\user\\Desktop\\py\\MyCypress',
  48. projectName: 'MyCypress',
  49. morgan: false,
  50. isTextTerminal: true,
  51. socketId: 'wj65e',
  52. report: true,
  53. browsers: [ [Object], [Object], [Object], [Object] ],
  54. animationDistanceThreshold: 5,
  55. autoOpen: false,
  56. baseUrl: null,
  57. blockHosts: null,
  58. chromeWebSecurity: true,
  59. clientRoute: '/__/',
  60. componentFolder: 'C:\\Users\\user\\Desktop\\py\\MyCypress\\cypress\\component',
  61. execTimeout: 60000,
  62. experimentalSourceRewriting: false,
  63. experimentalComponentTesting: false,
  64. experimentalFetchPolyfill: false,
  65. experimentalNetworkStubbing: false,
  66. fileServerFolder: 'C:\\Users\\user\\Desktop\\py\\MyCypress',
  67. firefoxGcInterval: { runMode: 1, openMode: null },
  68. fixturesFolder: 'C:\\Users\\user\\Desktop\\py\\MyCypress\\cypress\\fixtures',
  69. hosts: null,
  70. ignoreTestFiles: '*.hot-update.js',
  71. includeShadowDom: false,
  72. integrationFolder: 'C:\\Users\\user\\Desktop\\py\\MyCypress\\cypress\\integration',
  73. javascripts: [],
  74. modifyObstructiveCode: true,
  75. namespace: '__cypress',
  76. nodeVersion: 'default',
  77. numTestsKeptInMemory: 0,
  78. pageLoadTimeout: 60000,
  79. pluginsFile: 'C:\\Users\\user\\Desktop\\py\\MyCypress\\cypress\\plugins\\index.js',
  80. port: 59756,
  81. projectId: null,
  82. reporterOptions: null,
  83. reporterRoute: '/__cypress/reporter',
  84. requestTimeout: 5000,
  85. responseTimeout: 30000,
  86. screenshotOnRunFailure: true,
  87. screenshotsFolder: 'C:\\Users\\user\\Desktop\\py\\MyCypress\\cypress\\screenshots',
  88. socketIoRoute: '/__socket.io',
  89. socketIoCookie: '__socket.io',
  90. supportFile: 'C:\\Users\\user\\Desktop\\py\\MyCypress\\cypress\\support\\index.js',
  91. taskTimeout: 60000,
  92. testFiles: '**/*.*',
  93. trashAssetsBeforeRuns: true,
  94. userAgent: null,
  95. video: true,
  96. videoCompression: 32,
  97. videosFolder: 'C:\\Users\\user\\Desktop\\py\\MyCypress\\cypress\\videos',
  98. videoUploadOnPasses: true,
  99. viewportHeight: 660,
  100. viewportWidth: 1000,
  101. waitForAnimations: true,
  102. watchForFileChanges: false,
  103. xhrRoute: '/xhrs/',
  104. cypressEnv: 'production',
  105. resolved: {
  106. animationDistanceThreshold: [Object],
  107. baseUrl: [Object],
  108. blockHosts: [Object],
  109. browsers: [Object],
  110. chromeWebSecurity: [Object],
  111. componentFolder: [Object],
  112. defaultCommandTimeout: [Object],
  113. env: [Object],
  114. execTimeout: [Object],
  115. experimentalSourceRewriting: [Object],
  116. experimentalComponentTesting: [Object],
  117. experimentalFetchPolyfill: [Object],
  118. experimentalNetworkStubbing: [Object],
  119. fileServerFolder: [Object],
  120. firefoxGcInterval: [Object],
  121. fixturesFolder: [Object],
  122. hosts: [Object],
  123. ignoreTestFiles: [Object],
  124. includeShadowDom: [Object],
  125. integrationFolder: [Object],
  126. modifyObstructiveCode: [Object],
  127. nodeVersion: [Object],
  128. numTestsKeptInMemory: [Object],
  129. pageLoadTimeout: [Object],
  130. pluginsFile: [Object],
  131. port: [Object],
  132. projectId: [Object],
  133. reporter: [Object],
  134. reporterOptions: [Object],
  135. requestTimeout: [Object],
  136. responseTimeout: [Object],
  137. retries: [Object],
  138. screenshotOnRunFailure: [Object],
  139. screenshotsFolder: [Object],
  140. supportFile: [Object],
  141. taskTimeout: [Object],
  142. testFiles: [Object],
  143. trashAssetsBeforeRuns: [Object],
  144. userAgent: [Object],
  145. video: [Object],
  146. videoCompression: [Object],
  147. videosFolder: [Object],
  148. videoUploadOnPasses: [Object],
  149. viewportHeight: [Object],
  150. viewportWidth: [Object],
  151. waitForAnimations: [Object],
  152. watchForFileChanges: [Object],
  153. configFile: [Object],
  154. version: [Object]
  155. },
  156. parentTestsFolder: 'C:\\Users\\user\\Desktop\\py\\MyCypress\\cypress',
  157. parentTestsFolderDisplay: 'MyCypress\\cypress',
  158. supportFolder: 'C:\\Users\\user\\Desktop\\py\\MyCypress\\cypress\\support',
  159. integrationExampleName: 'examples',
  160. integrationExamplePath: 'C:\\Users\\user\\Desktop\\py\\MyCypress\\cypress\\integration\\examples',
  161. scaffoldedFiles: [
  162. [Object], [Object], [Object],
  163. [Object], [Object], [Object],
  164. [Object], [Object], [Object],
  165. [Object], [Object], [Object],
  166. [Object], [Object], [Object],
  167. [Object], [Object], [Object],
  168. [Object], [Object], [Object],
  169. [Object], [Object]
  170. ],
  171. resolvedNodeVersion: '12.16.3',
  172. state: {},
  173. proxyUrl: 'http://localhost:59756',
  174. browserUrl: 'http://localhost:59756/__/',
  175. reporterUrl: 'http://localhost:59756/__cypress/reporter',
  176. xhrUrl: '__cypress/xhrs/'
  177. }
  178. }

cypress.open() 命令详解

栗子

代码

  1. // 导入 cypress 模块
  2. const cypress = require('cypress')
  3. // 执行 open 命令
  4. cypress.open({
  5. // 命令参数列表
  6. config: {
  7. baseUrl: 'http://localhost:8080',
  8. },
  9. env: {
  10. login_url: '/login',
  11. products_url: '/products',
  12. }
  13. })

运行命令

可以在 cmd 窗口或 npm 脚本中运行下列命令

  1. node 2_open.js

运行结果

Cypress系列(72)- 详解 Module API - 图3
在 2_open.js 设置的 config 或 env 会当成 CLI 模式下设置的

参数列表

和 cypress open 命令行运行的参数一样
Cypress系列(72)- 详解 Module API - 图4

待更新
完整的 module api 项目

https://www.cnblogs.com/poloyy/p/13858431.html