测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成

这篇具有很好参考价值的文章主要介绍了测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言        

一、项目框架

1.项目迭代

2.项目时序图

3.项目测试执行

二、项目具体实现

1.创建流水线

2.拉取代码

3.执行测试代码

4.生成测试报告

5.报告内容解读

6.数据统计

7.邮件通知

8.企业微信通知

三、项目遇到的问题

1.go test -args 

2.go test生成html格式的报告

3.数据统计问题

4.相对路径问题

5.错误排查问题


前言        

       目前我们的项目体系流程不够完善,我们针对这一现象引入了“测试驱动开发”观念,在开发测试部署阶段可以节省一部分工作量,对于比较复杂的场景,也可以编写一些测试工具。我们都知道如果仅靠传统的手工测试(偏功能)会存在很多的漏洞,为了提高迭代效率,引入自动化测试、CI/CD,在项目测试阶段、预上线、上线等各个阶段都能快速通过上述手段发现问题,保障产品质量。

     


一、项目框架

        在日常测试过程中,需要验证测试环境&线上环境API接口,为了更方便,研究了通过Jenkins构建自动化项目并生成HTML报告。接下来会详细介绍项目构建步骤和遇到的问题。

1.项目迭代

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

2.项目时序图

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

3.项目测试执行

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维


二、项目具体实现

1.创建流水线

(1)新建任务

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

(2)选择流水线或者复制现有流水线任务

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

(3)配置流水线

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

(4)pipeline脚本的基本框架

#!groovy



pipeline {

    agent any



    environment {

        GO_BINARY = "go"

        TEST_REPORT_PATH = "test-report.xml"

    }

    stages {

        stage('checkout') {

            steps {

                sh"""

                    echo "steps one"

                """

            }

        }

        stage('unit-test') {

            steps {

                echo "step two"

            }

        }

        stage('api-test') {

            steps {

                sh """

                   ehco "step three"

                   """

            }

        }

    }

    post {

        always {

            echo "clean over..."

            echo "send email"

        }

        success {

            echo 'Build && Test Succeeded.'

        }

        failure {

            echo 'Build && Test Failured.'

        }

    }

}

对应在jenkins上的阶段视图:

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

2.拉取代码

repoURL = "git拉取代码地址"

rootPath = "/var/jenkins_work/workspace/pid-openapi-test-report"

repoPath = "${rootPath}/$BUILD_ID"

...

stages {

    stage('checkout') {

        steps {

            sh"""

                export PATH="${arcPath}:${goRoot}:${kubectlRoot}:${makeRoot}:$PATH"

                git clone --depth 1 ${repoURL} ${repoPath}

            """

        }

    }

    ...

}

3.执行测试代码

利用go test命令执行代码。执行go test会进行全代码编译的,会拉取所有的依赖,所以需要提前配置go环境变量。

go test运行指定模块、指定优先级的测试用例,eg:

go test -v ./test/storage/... '-run=^Test+/TestP0' -json

./test/storage/ storage在openapi-go项目中的代码目录

'-run=^Test+/TestP0' ^Test指定Test打头的suite,/TestP0指定该suite下的用例。这样可以将模块storage、用例名称TestP0参数化为MODULE_NAME、PRIORITY,并在jenkins上的参数化构建中进行赋值。

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

配置完成后go test可以写成这样了:

go test -v ./test/$MODULE_NAME/...   -run="^Test"+"/Test"+$PRIORITY

4.生成测试报告

安装go-test-report

go get github.com/vakenbolt/go-test-report/

执行生成html格式测试报告的命令,会在当前目录生成一个test_report.html

go test -v ./test/$MODULE_NAME/...   -run="^Test"+"/Test"+$PRIORITY   -json | go-test-report

jenkins发布报告的pipeline script:

stage('Report') {           

        steps {

            echo "report"

            publishHTML (target: [

            allowMissing: false,

            alwaysLinkToLastBuild: false,

            keepAll: true,

            reportDir: '$BUILD_ID/test-output',

            reportFiles: 'test_report.html',

            reportName: "HTML Report"

        ])

        }

    }

然后就可以在jenkins查看该报告了

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

5.报告内容解读

失败的用例是红色,通过的用例是绿色。失败日志需要关注assert部分的日志,包括报错行数、期望值与实际值的比较结果。

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

6.数据统计

在测试代码执行结果及报告都有了之后就可以统计自已需要的数据,然后放在邮件内容里进行发送。

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

先分析下html源文件的内容,找到自已想要的数据。

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

groovy自带解析html格式的库,但是不太好用。这里采用awk解析数据。

注:substr(s,p,n) 返回字符串s从p开始长度为n的部分

def genReportBody() {
    // 生成测试报告内容
    def testReport = readFile("$BUILD_ID/test-output/test_report.html")
    
    // 获取执行时间
    sh(script: 'pwd')
    def duration = sh(script: 'grep "Duration:" '+"$BUILD_ID/test-output/test_report.html"+' | awk \'{print substr($6,9,length($6)-17)}\'', returnStdout: true).trim()
    echo duration
    def runtime = duration.split("\\.")[0].trim()
    echo runtime

    // 获取总数量
    def total = sh(script: 'grep "Total:" '+"$BUILD_ID/test-output/test_report.html"+' | awk \'{print substr($5,9,length($5)-26)}\'', returnStdout: true).trim()

    // 获取通过率
    def passedCount = sh(script: 'grep "Passed:" '+"$BUILD_ID/test-output/test_report.html"+' | awk \'{print substr($5,9,length($5)-17)}\'', returnStdout: true).trim()
    def skippedCount = sh(script: 'grep "Skipped:" '+"$BUILD_ID/test-output/test_report.html"+' | awk \'{print substr($5,9,length($5)-17)}\'', returnStdout: true).trim()
    def failedCount = sh(script: 'grep "Failed:" '+"$BUILD_ID/test-output/test_report.html"+' | awk \'{print substr($5,9,length($5)-17)}\'', returnStdout: true).trim()
    def passedRate = String.format("%.2f", passedCount.toInteger()/(total.toInteger()-skippedCount.toInteger()) * 100)

7.邮件通知

组装邮件中的内容

 // 生成测试报告
    def reportContent = """
        <h2>OpenAPI Test Report (${MODULE_NAME})</h2>
        <p>Environment: ${ENV}</p>
        <p>Test Time: ${runtime}s</p>
        <h3>Test Cases:</h3>
        <ul>
            <a href="https://jenkins地址/view/pid/job/${JOB_NAME}/$BUILD_ID/HTML_20Report/" target="_blank">https://jenkins地址/view/pid/job/${JOB_NAME}/$BUILD_ID/HTML_20Report/</a>
            
        </ul>
        <p>Pass Rate: ${passedRate}% </p>
        <p>Test Range: ${PRIORITY}</p>
        <h3>Failures: ${failedCount}</h3>
    """

发送邮件,在发送邮件前将无用的测试数据清除

post {

        always {

            sh """

                mv ${repoPath}/test-output ~/temp

                rm -rf ${repoPath}/*

                mv ~/temp/test-output ${repoPath}/

            """

            echo "clean over..."

            emailext body:  genReportBody(),

                    subject: 'Test Report',

                    // to: 'env.RECIPIENTS',

                    to: '${RECIPIENT_LIST}',

                    mimeType: 'text/html'

            // from: '邮件发送地址'

        }

        success {

            echo 'Build && Test Succeeded.'

        }

        failure {

            echo 'Build && Test Failured.'

        }

}

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

8.企业微信通知

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维


三、项目遇到的问题

1.go test -args 

利用该命令自定义参数时发现-args后面所有东西都当成agrs的值,且阻断后面所有指令的执行。后来在stackoverflow看见一个人发了同样的问题,我想到去看下官方说明

In addition to the build flags, the flags handled by 'go test' itself are:



-args

    Pass the remainder of the command line (everything after -args)

    to the test binary, uninterpreted and unchanged.

    Because this flag consumes the remainder of the command line,

    the package list (if present) must appear before this flag.

上面的everything after -args和执行实际效果是一样。这样通过命令行方式来切换环境的做法是行不通,于是采用多个配置文件的方式,全部存放在jenkins机器的~/conf目录。

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

切换方式

if [ $ENV = "test" ]

then

    echo 'cp test .env'

    cp /home/jenkins/conf/.env ${repoPath}/test

    cp /home/jenkins/conf/.env.storage ${repoPath}/test/storage/v1/.env

elif [ $ENV = "dev" ]

then

    #statements

    echo 'cp dev .env'

    cp /home/jenkins/conf/.env.dev ${repoPath}/test/.env

    cp /home/jenkins/conf/.env.storage.dev ${repoPath}/test/storage/v1/.env

    

elif [ $ENV = "prod" ]

then

    echo 'cp prod .env'

    cp /home/jenkins/conf/.env.prod ${repoPath}/test/.env

    cp /home/jenkins/conf/.env.storage.prod ${repoPath}/test/storage/v1/.env

fi

2.go test生成html格式的报告

最开始也是打算接入allure报告,但是发现go test并不支持,所以采用了go-test-report。发布的第一版的go test report时并不是长这样的

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

而是像下面这样不带css样式的

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

解决方法:在jenkins-->系统管理-->脚本命令行,输入以下命令

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

3.数据统计问题

网上有很多groovy统计xml格式的文件,没找到能很好解析html格式的工具,想到awk这个工具。

def passedCount = sh(script: 'grep "Passed:" '+"$BUILD_ID/test-output/test_report.html"+' | awk \'{print substr($5,9,length($5)-17)}\'', returnStdout: true).trim()

4.相对路径问题

我们用IDE编写用例时直接测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维就可以执行了,这种情况下go会把该用例所在的目录当成pwd目录;而流水线中go test是在项目根目录下执行的,这时go是把项目根目录当成pwd目录的。这样用例中使相对路径eg:.env、../.env等都会执行失败。

解决方法:利用runtime获取当前执行路径,然后代码中生成项目根目录,以该路径为基点再去拼接文件的路径,尽量不要使相对路径。

5.错误排查问题

后面发现现有的脚本case编写如果有一个报错,全部都是红色,找到报错点不是很方便,修改脚本case为:

func (s *JobBatchGetSuite) TestP0_Normal() {
	s.Run("TestSuccessJobBatchGet", func() {
		s.TestSuccessJobBatchGet()
	})
}

func (s *JobBatchGetSuite) TestP1_Normal() {
	s.Run("TestJobBatchGetJobIdsTooMuch", func() {
		s.TestJobBatchGetJobIdsTooMuch()
	})
}

在jenkins上执行后,报告展示更为直观。

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维

今天的分享就到此结束喽~

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成,自动化技术,jenkins,自动化,运维文章来源地址https://www.toymoban.com/news/detail-801025.html

到了这里,关于测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Jenkins的开发测试全流程持续集成实践

    目录 一、持续集成全流程介绍 二、ASP.NET Core CI流程部分 三、ASP.NET Core CD流程部分 四、RobotFramework AT流程部分 五、小结 本文将近半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点。当然这仅是一家之言也不够完整,后续还会

    2024年02月12日
    浏览(51)
  • Apipost自动化测试+Jenkins实现持续集成

    Apipost 自动化测试支持「持续集成」功能,在安装了Apipost的服务器中输入命令,即可运行测试脚本。 创建自动化测试脚本 在创建好的测试用例中选择「持续集成」。 点击新建,配置运行环境、循环次数、间隔停顿后点击保存会生成命令。 安装 Apipost-cli npm install -g apipost-cl

    2024年01月25日
    浏览(67)
  • Jenkins+Python自动化测试持续集成详细教程

    ​ Jenkins是一个开源的软件项目,是基于java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。由于是基于java开发因此它也依赖java环境,安装之前需要先安装jdk,建议jdk1.8+,安装后配置java环境变量。安装

    2024年02月08日
    浏览(71)
  • 软件测试学习笔记丨持续集成DevOps - Jenkins安装

    本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/30028 通过 war 包安装 通过安装包安装(不推荐) 通过 docker 命令安装(推荐 Linux 环境): docker pull jenkins/jenkins:lts 2.1 ,war包启动(用于调试,不推荐安装): (1), 下载war包后, 进入对应的war下载的目录,通过命令启

    2024年04月09日
    浏览(56)
  • 前台自动化测试:基于敏捷测试驱动开发(TDD)的自动化测试原理

    一、自动化测试概述 自动化测试主要应用到查询结果的自动化比较,把借助自动化把相同的数据库数据的相同查询条件查询到的结果同理想的数据进行自动化比较或者同已经保障的数据进行不同版本的自动化比较,减轻人为的重复验证测试。多用户并发操作需要自动化模拟来

    2023年04月20日
    浏览(81)
  • Jenkins+Python自动化测试持续集成详细教程(全网独家)

    目录 一、前言 二、环境准备 三、创建Jenkins Job 四、编写Python自动化测试脚本 五、测试报告生成与展示 六、持续集成流程优化 七、实战演练 八、常见问题及解决方案 九、结论 Jenkins是目前最为流行的CI/CD工具之一,它可以支持多种语言和技术栈,如Java、Python、JavaScript等。

    2024年02月06日
    浏览(71)
  • 接口自动化测试-Jmeter+ant+jenkins实战持续集成(详细)

    1、下载安装配置Jmeter 首先下载jmeter工具,并配置好环境变量; 参考之前写过的文章:https://blog.csdn.net/shuang_waiwai/article/details/121641310 jmeter默认保存的是.jtl格式的文件,要设置一下bin/jmeter.properties,文件内容,保存jmeter.save.saveservice.output_format=xml 2、下载安装配置ant 下载ant工

    2024年02月13日
    浏览(76)
  • Linux驱动开发笔记(三):基于ubuntu的helloworld驱动源码编写、makefile编写以及驱动编译加载流程测试

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130542981 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中… 上一篇:《Linux驱动开发笔记(二

    2024年02月05日
    浏览(69)
  • 基于Jenkins + Argo 实现多集群的持续交付

    作者:周靖峰,青云科技容器顾问,云原生爱好者,目前专注于 DevOps,云原生领域技术涉及 Kubernetes、KubeSphere、Argo。 前面我们已经掌握了如何通过 Jenkins + Argo CD 的方式实现单集群的持续交付,明白了整个 CI/CD 过程中不同工具在流水线中的关系。所以接下来我们将更深入的

    2024年04月17日
    浏览(33)
  • 【软件测试】- 将 Selenium 和 JMeter 测试脚本集成到 Jenkins 中实现自动化测试和持续集成(CI)及Jenkinsfile 实现 Jenkins Pipeline 原理介绍

    将 Selenium 和 JMeter 测试脚本集成到 Jenkins 中是实现自动化测试和持续集成(CI)的关键步骤。以下是详细的集成过程: 1、准备工作 安装 Jenkins : 确保您已经在服务器上安装了 Jenkins。 可以从 Jenkins 官网 下载并安装。 安装必要的插件 : 在 Jenkins 中安装所需的插件,如 Git 插

    2024年02月04日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包