python+jenkins+pytest实现机器学习项目接口自动化测试

背景介绍

算法机器学习项目代码为python实现。
整体实现:通过 http接口接受参数,调用dubbo thrift 服务,再调用算法文件,算法返回结果给dubbo thrfit,dubbo thrift 返回给http后台
python+jenkins+pytest实现机器学习项目接口自动化测试_第1张图片

(dubbo 和thrift 待详细了解)

实现的接口自动化流程

python+jenkins+pytest实现机器学习项目接口自动化测试_第2张图片
调用的为dubbo接口

jenkins配置

1,SVN路径
2,轮询SCM
H/10 * * * *
3,拉取的代码放置路径
python+jenkins+pytest实现机器学习项目接口自动化测试_第3张图片
source files设置
**/**.**,**/** 可以摘取所有文件。因为模型文件比较大,拉取会比较慢。这里没有设置拉取。
4,构建后操作–构建其他工程
构建测试代码工程

遇到的问题:
问题描述:

执行启动脚本,jenkins工程构建成功,控制台输出也没有错误信息。但实际thrift服务没有并启动。在xshell终端中执行脚本可以成功。执行停服务脚本可以成功。
启动脚本内容主要为

nohup python -u ${server_file} 18090 >> ${log_dir}/nohup_18090.out 2>&1 &
问题排查:

通过google和不断尝试,发现以下情况:
Jenkins不能执行python命令,需要带上python的全路径,如 /home/anaconda2/bin/python
Jenkins默认会在构建结束后Kill掉所有的衍生进程

原本想在服务器上添加python路径的环境变量,但发现已经有,仍然不能启动服务。
读者也可以尝试下,看看自己的是否会成功。
添加python环境变量方法参考

问题解决:

1,在jenkins中添加环境变量
2,通过更改BUILD_ID达到不被杀进程的目的

OLD_BUILD_ID=$BUILD_ID
BUILD_ID=dontKillMe
export PATH=/home/anaconda2/bin/:$PATH
cd /home/XXXX/
sh stop.sh
sh start.sh
BUILD_ID=$OLD_BUILD_ID
测试脚本工程配置

python+jenkins+pytest实现机器学习项目接口自动化测试_第4张图片
python+jenkins+pytest实现机器学习项目接口自动化测试_第5张图片

使用单元测试框架pytest+python编写代码

主要是使用pytest的参数化@pytest.mark.parametrize("case_name,code, param", data())
case_name 为用例名
code 为断言使用的响应码
param 为请求的参数
新建case_data.py的脚本,编写测试用例,主要形式内容如下

data()
    name1 = ""
    code1 = ""
    param1 = ""
    params = [(name1, code1, param1), (name2, code2, param2)]
    return params

也考虑过用excel文件读取测试数据,觉得没有这样方便。

断言

算法返回结果定义为JSON格式,返回内容不固定。比如推荐系统的推荐,无法对内容做断言。
输出的内容也不是相对固定的,所为这里只对响应code码做断言。这code码不是http的响应码,是算法工程师和大数据JAVA开发定义的。所以不会像http返回200,实际响应报错情况。

构建结果

加上–junit-xml=test_result.xml参数,jenkins上可以查看Test Result 测试结果报告
jenkins安装钉钉插件,构建后发消息到钉钉。钉钉access token,钉钉群中添加群机器人获取。

你可能感兴趣的:(测试)