【问题标题】:Parallel Cypress tests on TeamCityTeamCity 上的并行 Cypress 测试
【发布时间】:2019-12-01 18:08:17
【问题描述】:

我们目前有一个包含 24 个integration/*.js 文件的存储库。我们正在通过 TeamCity CI 工作流程成功运行赛普拉斯测试,但是,我无法让测试并行运行。

通过配置,我们将 repo/tests 连接到 dashboard.cypress.io 中的一个组织。除了仪表板键之外,我们还通过 npm run 在 TeamCity 构建步骤中调用赛普拉斯,并在 package.json scripts{} 中使用以下配置:

"cypress:run:qa": "cypress run -c cypress.qa.json --record --key xyxyxyx-xyxyx-xyxyx-xyxyx-xyxyxyxyxyxy --parallel --config baseUrl=\"https://some.url.com\" --ci-build-id=%BUILD_ID_CYPRESS%"

上面传入的 %BUILD_ID_CYPRESS% 环境变量是 TeamCity 构建 ID 和编号的自定义组合,以使其唯一。

package.json 列出了以下依赖项:

"devDependencies": {
    "cypress": "^3.3.2",
    "cypress-plugin-retries": "^1.2.0"
  },
  "dependencies": {
    "ldclient-electron": "^1.0.1",
    "ldclient-js": "^2.10.0",
    "ldclient-node": "^5.7.4"
  }

cypress.qa.json 配置文件内容为:

{
  "projectId": "*redacted*",
  "baseUrl": "https://some.url.com",
  "numTestsKeptInMemory": 50,
  "port": 3002,
  "reporter": "teamcity",
  "reporterOptions": null,
  "watchForFileChanges": true,
  "viewportWidth": 1280,
  "viewportHeight": 720,
  "defaultCommandTimeout": 30000,
  "execTimeout": 90000,
  "taskTimeout": 90000,
  "pageLoadTimeout": 60000,
  "requestTimeout": 60000,
  "responseTimeout": 60000,
  "screenshotsFolder": "cypress/screenshots",
  "trashAssetsBeforeRuns": true,
  "videoCompression": 32,
  "videosFolder": "cypress/videos",
  "video": true,
  "videoUploadOnPasses": false,
  "env": {
    "retryAttempts": "2",
    "*redacted URL Name*": "https://some.otherURL.com/someSubDirectory/"

  }

  }

在 TeamCity 中,我在构建日志中看到以下输出,这似乎表明 Cypress 正在正确传递并行配置:

[15:48:08]  [Step 8/11] ================================================================================
[15:48:08]  [Step 8/11] 
[15:48:08]  [Step 8/11]   (Run Starting)
[15:48:08]  [Step 8/11] 
[15:48:09]  [Step 8/11]   ┌────────────────────────────────────────────────────────────────────────────�
[15:48:09]  [Step 8/11]   │ Cypress:  3.4.0                                                            │
[15:48:09]  [Step 8/11]   │ Browser:  Electron 61 (headless)                                           │
[15:48:09]  [Step 8/11]   │ Specs:    24 found (**spec names redacted*** │
[15:48:09]  [Step 8/11]   │ Params:   Group: false, Parallel: true                                     │
[15:48:09]  [Step 8/11]   │ Run URL:  https://dashboard.cypress.io/#/projects/*redactedProjID*/runs/26           │
[15:48:09]  [Step 8/11]   └────────────────────────────────────────────────────────────────────────────┘
[15:48:09]  [Step 8/11] 
[15:48:09]  [Step 8/11] 2019-07-23T15:48:10.502Z cypress:server:record before spec run { spec: undefined }
[15:48:09]  [Step 8/11] 2019-07-23T15:48:10.503Z cypress:server:api request to url: POST https://api.cypress.io/runs/*redactedGUID*/instances with params: {"body":{"spec":null,"groupId":"win32-Electron-61-abcabcabc","machineId":"**RedactedMachineID","platform":{"osCpus":[{"model":"Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz","speed":2400,"times":{"user":*redacted*,"nice":0,"sys":*redacted*,"idle":*redacted*,"irq":*redacted*}},{"model":"Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz","speed":2400,"times":{"user":*redacted*,"nice":0,"sys":*redacted*,"idle":8866723484,"irq":517593}}],"osName":"win32","osMemory":{"free":956882944,"total":4294557696},"osVersion":"6.3.9600","browserName":"Electron","browserVersion":"61.0.3163.100"}},"headers":{"x-route-version":"5","x-os-name":"win32","x-cypress-version":"3.4.0"}} and token: undefined
[15:48:09]  [Step 8/11] 2019-07-23T15:48:10.624Z cypress:server:api response { spec: 'cypress\\integration\\*redacted*.js', instanceId: '*redactedGUID*', claimedInstances: 1, totalInstances: 24, estimatedWallClockDuration: 675698 }

但是,相同的machineId 在每个后续测试运行的日志输出中重复出现,所有这些都在同一个 TeamCity 代理上连续运行。

我们没有对 Cypress 中的测试分组做任何花哨的事情,也没有做任何其他特别独特的事情,我可以看到,但是 Cypress 运行继续连续执行。

我特别担心的是:

  • 我缺少一个 TeamCity 配置(TeamCity 或 Cypress 方面没有关于我可以找到的 TeamCity/Cypress 集成的具体文档)
  • 我上面的赛普拉斯配置中有一个明显的遗漏,希望有好心的陌生人能指出来。

【问题讨论】:

    标签: continuous-integration teamcity integration-testing cypress


    【解决方案1】:

    我不确定你的方法。但几乎没有其他选择。

    一种方法是在 TC 上使用 docker-compose 运行测试。这是一个示例项目。此脚本将为您的项目创建一个 docker 映像并运行您的映像的多个实例。

    https://github.com/SgSridhar/cypress-docker-parallel-tests/blob/master/package.json#L25

    我一直在强调这一点。赛普拉斯 github 操作似乎是在您想要的任何模式下运行测试的最佳选择。

    https://github.com/SgSridhar/cypress-docker-parallel-tests/commit/d49db3edfe1ee59bc42d990c708152d98350f411/checks?check_suite_id=375441436

    我建议采用 github 操作方法。您可以节省大量时间。

    【讨论】:

    • 对于那些已经致力于 teamcity 的人,我不遵循 github 操作建议,尽管只要它确实有效,使用 docker-compose 进行扩展似乎是可行的。还是您建议 github 操作可以与 teamcity 融合?
    • 不,您不能将 github 操作与 TC 混合。您可以像这里一样设置 github 操作,github.com/SgSridhar/cypress-docker-parallel-tests/blob/master/… 并且 github 操作将在您推送代码时运行。
    • 你可以通过在这个数组中添加一个数字来扩展 github 操作,github.com/SgSridhar/cypress-docker-parallel-tests/blob/master/…
    • docker 的问题在于,创建镜像、动态启动容器需要大量时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多