相关文章推荐
讲道义的水桶  ·  使用C++编写一个可视化窗口_c++做可视化 ...·  1 年前    · 
呐喊的键盘  ·  R - 上海交大超算平台用户手册 ...·  1 年前    · 
任性的凉面  ·  Uncaught (in promise) ...·  2 年前    · 
体贴的骆驼  ·  终于明白如何去写原生AJAX - 掘金·  2 年前    · 
Code  ›  GitLab CI 并行执行 Cypress 测试脚本_gitlab ci cypress_tomoyachen的博客
test node gitlab 测试脚本
https://blog.csdn.net/tomoya_chen/article/details/112322442
月球上的红金鱼
2 年前
  • 1. 目前流行的并行运行方法
    • 1.1 官方 parallel 参数
    • 1.2 个人开发者写的插件
    • 1.3 基于 CI 平台的
  • 2. GitLab CI Parallel
    • 2.1 介绍
    • 2.2 使用方法
  • 3. 根据 CI_NODE_INDEX 生成测试目录
    • 3.1 切分用例的不同方向
    • 3.2 实现效果
    • 3.3 源码
  • 4. gitlab-ci.yaml 中的改动
    • 4.1 由js脚本来生成测试目录
  • 5. 效果如何?
    • 5.1 耗时变小了
    • 5.2 retry 成本变低了

    2.2 使用方法

    如果只是单纯的在 gitlab-ci.yaml 文件中加上 parallel: 5,只会让你的测试重复跑5遍,这显然不是我们想要的效果。

    那么如何能5个并行任务执行不同的测试用例呢?

    官方文档中指出,提供了2个参数,CI_NODE_INDEX 和 CI_NODE_TOTAL,分别是当前下标 与 总数量。

    那么我们通过编写一个脚本,根据一定规则来切分用例为5份。然后运行cypress时,指定spec参数为不同的测试目录,是不是就可以实现了呢?

    3. 根据 CI_NODE_INDEX 生成测试目录

    3.1 切分用例的不同方向

    前文提到的 大佬 的想法是,获取所有.spec.js文件,再均匀分配给所有并行job,分组对象是用例。
    好处是执行时间更平均,但是业务结构被破坏了,个人更倾向于,按用例文件夹来分组,也就是分组对象是第一层文件夹(模块)。

    大家可以参考我的脚本,也可以参考大佬的切分方法。其中我增加了 -b 参数来接收业务,再指定目录的逻辑,是基于业务,可以忽略。

    3.2 实现效果

    例如 /integration 目录下有10个文件夹,当前 CI_NODE_INDEX 是 1,CI_NODE_TOTAL 是 3的情况下,会返回 1,4,7,10 这4个目录。

    3.3 源码

    ./scripts/cypress-parallel.js

    const fs = require('fs')
    const path = require('path')
    const NODE_INDEX = Number(process.env.CI_NODE_INDEX || 1)
    const NODE_TOTAL = Number(process.env.CI_NODE_TOTAL || 1)
    var TEST_FOLDER = './cypress/integration'
    var program = require('commander')
    program.version('1.0.0').option('-b, --business_line [value]', '业务线', '').parse(process.argv)
     * 输出测试目录列表
    console.log(getSpecDirs().join(','))
     * 获取当前需要运行的测试目录
    function getSpecDirs () {
      if (program.business_line.toUpperCase() === 'C') {
        TEST_FOLDER += /c'
      } else if (program.business_line.toUpperCase() === 'B') {
        TEST_FOLDER += '/b'
      const allSpecFiles = walk(TEST_FOLDER)
      return allSpecFiles.sort().filter((_, index) => index % NODE_TOTAL === NODE_INDEX - 1)
     * 生成指定目录下所有可测试目录
     * @param {string} dir 目录地址
    function walk (dir) {
      const files = fs.readdirSync(dir)
      var specDirs = []
      var hasFile = false
      files.forEach((file) => {
        const filePath = path.join(dir, file)
        const stats = fs.statSync(filePath)
        if (stats.isDirectory() && ['pages'].indexOf(file)) {
          specDirs.push(filePath + '/**/*.spec.js')
        } else if (stats.isFile() && !hasFile && file.indexOf('spec.js') !== -1) {
          specDirs.push(path.join(dir) + '/*.spec.js')
          hasFile = true
      return specDirs.reduce((all, folderContents) => all.concat(folderContents), [])
    

    4. gitlab-ci.yaml 中的改动

    4.1 由js脚本来生成测试目录

    其实原理非常简单,用 $(node **.js) 调用js脚本,生成一个测试目录集合给spec参数。

    # gitlab-ci.yaml
    test:
      stage: test
      parallel: 5
      script:
        - yarn cypress run --spec $(node scripts/cypress-parallel.js)
    

    如果你也需要传入业务线参数,那么是这样的

    # gitlab-ci.yaml
    # BUSINESS_LINE 可能是 C, 可能是 B
    test:
      stage: test
      parallel: 5
      script:
        - yarn cypress run --spec $(node scripts/cypress-parallel.js -b ${BUSINESS_LINE})
    

    如果你和我一样,通过一个参数来控制测试环境,那么效果是这样的。

    # gitlab-ci.yaml
    #TEST_ENV 可能是 dev, 可能是 prod
    test:
      stage: test
      parallel: 5
      script:
        - yarn cypress run --spec $(node scripts/cypress-parallel.js -b ${BUSINESS_LINE}) --env config=${TEST_ENV}
    

    5. 效果如何?

    5.1 耗时变小了

    原来需要48分钟执行完的脚本,只需要20分钟了。

    5.2 retry 成本变低了

    retry 成本变低了,重跑只跑局部用例。

    本篇文章向大家介绍一下二个关键词,parallel与timeout。对于在流水现在中比较耗时的作业,比如一个作业平均运行1个小时,这种作业有时可以拆分成多个作业来完成,而parallel就是来完成拆分的。如果一个作业太耗时,会一直占用我们的系统资源,这时需要设置作业的超时时间,使用timeout。要使用parallel,不光要runner支持,作业的script也要支持。每一个被分割的作业都有一个特定的变量。使用该变量来判断,当前作业是第几个作业。...... 添加为子模块 git submodule add https://github.com/awesome-inc/monorepo.gitlab.git .monorepo.gitlab 并更新.gitlab-ci.yml 。 添加一些variables和一个before_script以获取Gitlab CI中的最后一个绿色提交 # needs `curl`, `jq` 1.5 and `${PRIVATE_TOKEN}, cf.: # - https://docs.gitlab.com/ee/api/#personal-access-tokens # - https://docs.gitlab.com/ce/ci/variables/ 1.首先安装一下gitlab,有详细亲测有效的教程:https://www.cnblogs.com/zhangycun/p/10963094.html 2.安装gitlab Runner,有详细亲测有效的教程:https://blog.csdn.net/qq_27520051/article/details/80552220 3.个人总结: 1.持续集成相关概念 1.1 什么是持续集成 持续集成是... runner_v1 是一个带有递归的承诺池 - runner_v2 是一个基于事件的,带有状态 - ,用于节点 12+ Runner v2 尝试解决多个 Cypress xvfb 实例同时产生并争夺相同资源导致跳过某些套件的问题。 现在可以配置参数timeout ,如果上次启动的超时尚未完成,它将阻止新实例生成 cypress。 timeout值应该是启动 cypress 和打开浏览器之间的 +/- 平均时间,这取决于您的测试套件大小和可用的机器资源。 参数: executors = 选择要运行的规范的链接器的数量; filter = 按关键字过滤规格路径; 如何运行 runner v1: yarn cy:run - 单个执行器 yarn cy:run:paralle 先构建 gitlab-runner 的 docker 镜像 Cypress 的运行需要安装一些依赖,官方提供了一些 docker 镜像:https://github.com/cypress-io/cypress-docker-images/tree/master/base 我选择的是 CentOS 7 的镜像,但构建过程中,node 装不上需要更新 Yum 源,这里贴一下 Dockerfile... 本文先介绍了GitLab Runner,继而引出.gitlab-ci.yml各项配置,文中样例的注释基本能满足日常需求。当然,我们现在gitlab上使用的CICD不需要你自己搭建Runner,只需要简单注册就能使用了,但核心原理是一样的,希望大家都能掌握.gitlab-ci.yml。... 上一篇博文中,同样围绕这个主题,我写了一些独立于 CI/CD 平台的并行化解决方案。紧接其后,在本篇文章中,我将回顾常见 CI/CD 平台的并行化功能,其中一些功能我们在以前的文章中已提到:Jenkins、Bamboo、GitLab、CircleCI 和 Bitbucket。这些 CI 系统使用简单的声明性语法,并用Web UI 进行状态报告并生成日记,帮助团队突破单机的限制,进行并行化开发。 1、将代码托管在git 2、在项目根目录创建ci文件.gitlan-ci.yml 在文件中指定构建,测试和部署脚本 3、gitlab将检测到他并使用名为git Runner的工具运行脚本 4、脚本被分组为作业,他们共同组成了一个管道 gitlab-ci的脚本执行,需要自定义按照对应的gitlab-runner来执行,代码puhs之后 webhook检测到代码变化就会触发gitlan-cl,分配到各个Runner来运行相应的脚本script gitlab Runner ​ shared 共享 提测说明研发对于模块的编写实现以及接口的完成按照产品提供的prd 实现,然后测试开始测试的一个流程 同时在测试的过程中,一定要越提前越好 ,避免提测的时候太晚 出现各种预料之外的问题,如一下问题: 功能跟产品PRD里的不一样,走偏了; 前端BUG几百个; 严重阻塞性BUG几十个; 测 cypress 测试Learn to run e2e tests faster to save both from time and resources. 学习更快地运行e2e测试,以节省时间和资源。 Okay, now for some reason, you’ve finally chosen to write some cypress tests for your development e... apache-maven-3.6.3-bin.tar.gz 下载maven https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz tar -zxf 文件 -C 指定目录 配置环境变量 # Maven export MAVEN_HOME=/opt/software/apache- 文章目录概念PipelineStagesJobsjob分组variables自定义变量预定义变量使用变量关键词全局关键词before_scriptafter_scriptincludeStage关键词Job关键词scriptimageartifactstagscachestagewhenonly/exceptdependenciesextendstriggerrulesallow_failurecoveragepagesreleaseresource_groupretrytimeout参考gitlabci变
 
推荐文章
讲道义的水桶  ·  使用C++编写一个可视化窗口_c++做可视化界面-CSDN博客
1 年前
呐喊的键盘  ·  R - 上海交大超算平台用户手册 Documentation
1 年前
任性的凉面  ·  Uncaught (in promise) Error: Network Error at createError(axios跨域问题) - 野夏之说 - 博客园
2 年前
体贴的骆驼  ·  终于明白如何去写原生AJAX - 掘金
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号