背景介绍
公司预计开发一套可在嵌入式设备运行的大型系统。涉及项目数100+,由多个团队共同开发提交代码。持续集成团队负责每日构建镜像,对于引起功能异常的项目进行排查,通知相关项目组进行修复。
目前开发一套Merge查看平台,可用于查看镜像版本之间项目代码变化。
业务介绍
使用方式
- 登陆Merge平台
- 选择产品线、分支、构建记录,构建版本,查看信息
主要功能
- 该构建版本与上个版本之间的Merge变化,有变化构建版本显示粉色,无变化显示灰色。
- 该构建版本的所有项目地址及最新一次commit。
测试方案
痛点1
- 该测试属于web测试,之前主要由手工完成。历史构建版本需要定期测试,新版本不断增加。越来越多后效率很低。
解决方案
- 遍历构建版本,存储关键数据。采用数据驱动方式生成大量测试用例,每次测试覆盖全部构建版本。
技术架构
- 主要使用pytest+selenium+allure的技术架构,借助pytest的用例分发和执行优势,并且实现参数化和数据驱动,输出详细的测试用例运行日志并能结合allure输出测试报告。
测试流程
模块设计
config: 保存日志配置、环境配置、常量字典
data: 通过csv格式记录通过页面读取的版本号记录和状态记录
logs: 保存测试用例运行日志和断言结果
result: 记录allure生成的中间结果
testcases:测试用例
utils: 通用工具和模块
- 版本列表获取和保存模块
- 鉴权模块
- allure报告生成模块
- csv读取写入模块
- 数据驱动模块
痛点2
- 多人需要查阅Merge平台测试报告,allure方式生成测试结果不易保存,历史数据难存档。
- 测试用例需定期执行,例如每天早10点
- 公司主要采用飞书办公,邮件查阅较少
解决方案
采用jenkins+allure插件完成测试用例执行、报告生成。以参数化形式创建job,job可定时也可手动启动。
allure插件配置。
- allure插件安装与配置:网上例子较多,可参加:Jenkins集成allure测试报告 - linux超 - 博客园
jenkinsfile 设计
#!groovy
def current_timestamp = System.currentTimeMillis()
pipeline {
agent any
options{
timestamps()
}
triggers {
cron('00 10 * * *')
}
parameters {
string(name: 'NOTIFY_MEMBER', defaultValue: 'xiaoming,xiaohong', description: '通知人,以逗号分隔,无需通知不填写')
string(name: 'NOTIFY_CHAT_NAME', defaultValue: 'None', description: '通知群名称,默认为None')
}
stages {
stage('Init') {
steps {
script{
START_TIMESTAMP = current_timestamp
// 初始化目录
}
}
}
stage('Build') {
steps {
sh '''
cd ${WORKSPACE}/workspace/allure-autotest/mina/seleniumtest/
pytest selenium_test.py --alluredir=${WORKSPACE}/workspace/allure-autotest/allure-results
'''
}
}
}
post {
success {
script {
END_TIMESTAMP = current_timestamp
allure includeProperties: false, jdk: '', results: [[path: '${WORKSPACE}/workspace/allure-autotest/allure-results']]
sh "curl -X GET ${URL}/send_feishu_card?START_TIMESTAMP=${START_TIMESTAMP}&END_TIMESTAMP=${END_TIMESTAMP}&NOTIFY_MEMBER=${NOTIFY_MEMBER}&NOTIFY_CHAT_NAME=${NOTIFY_CHAT_NAME}&BUILD_NUMBER=${BUILD_NUMBER}&BUILD_RESULT=SUCCESS"
}
}
failure {
script {
END_TIMESTAMP = current_timestamp
allure includeProperties: false, jdk: '', results: [[path: '${WORKSPACE}/workspace/allure-autotest/allure-results']] build result
sh "curl -X GET ${URL}/send_feishu_card?START_TIMESTAMP=${START_TIMESTAMP}&END_TIMESTAMP=${END_TIMESTAMP}&NOTIFY_MEMBER=${NOTIFY_MEMBER}&NOTIFY_CHAT_NAME=${NOTIFY_CHAT_NAME}&BUILD_NUMBER=${BUILD_NUMBER}&BUILD_RESULT=FAILURE"
}
}
}
}
主要分为3个阶段:
init:初始化,完成构建环境初始化化
build:完成pytest测试,输出测试结果到指定目录
post:生成测试报告,发送测试报告链接给指定人
job截图:
参数化构建
观察发现,测试报告的URL只与构建号有关,因此报告地址可以拼接。
生成完报告后,可通过发送url请求触发飞书卡片。
URL触发卡片
url放在post过程中,其中携带参数为:
示例:
curl -X GET ${URL}/send_feishu_card?START_TIMESTAMP=${START_TIMESTAMP}&END_TIMESTAMP=${END_TIMESTAMP}&NOTIFY_MEMBER=${NOTIFY_MEMBER}&NOTIFY_CHAT_NAME=${NOTIFY_CHAT_NAME}&BUILD_NUMBER=${BUILD_NUMBER}&BUILD_RESULT=FAILURE
参数说明:
-
START_TIMESTAMP:开始时间,放在init过程中获取
-
END_TIMESTAMP:结束时间,放在post阶段中获取
-
NOTIFY_MEMBER:通知人,参数填入,逗号分隔,不通知为空
-
NOTIFY_CHAT_NAME:通知群名,默认为None,不同通知
-
BUILD_NUMBER:构建号,jenkins自带参数
-
BUILD_RESULT:构建阶段中获取
飞书卡片示例: