背景
目前跑的接口自动化是通过Testng Jenkins来做的, 但是项目可能跑在不同的平台上, 不同的平台有不同的ip.
目前是使用了Jenkins的参数化构建功能, 每次跑的时候,手动输入一个ip,然后对该ip的服务进行自动化测试.
Testng框架的配置文件是application.properties, 我们将服务的ip记录在这个文件中.
需求
根据从Jenkins传入的参数, 动态修改application.properties中的ip变量,然后进行后续测试工作.
application.properties 示例
代码语言:javascript复制server_ip=http://192.168.100.100
port=9000
path=/home/data
需求分析
目前想到的方法有2个:
- 用python脚本读取文件,正则替换制定文本,生成个新文件
- 用shell脚本来操作
从最简化考虑,优先考虑shell的方法.
Linux有3剑客: grep ,sed, awk.其中grep主要做过滤, sed主要做文本的相关处理(如修改替换等),awk主要做数据处理,报告输出等。所以应该考虑使用sed命令来解决此问题.
实际操作
- 从网上搜了下相关的sed用法, 参考链接: https://blog.csdn.net/ganfanren00001/article/details/122765854
本次用到的sed命令截图
- 举一反三, 我是这样使用的
sed "/server_ip=/c server_ip=http://192.168.200.200" application.properties
- 但是这样有个问题,这样修改的只是暂时的,并没实际影响到真实的文件.其实sed有个-i参数,加上这个参数才会对真实的文件生效, 所以优化下就是
sed -i "/server_ip=/c server_ip=http://192.168.200.200" application.properties
- 这个命令在本地跑通了,接下来就是集成到Jenkins中使用这个命令
- 首先在Jenkins中,选择参数化构建,我定义的参数名是server_ip
- 在shell脚本中使用这个变量即可
注: Jenkins使用传入变量的格式为:${变量名}
代码语言:javascript复制#!/bin/bash
echo "传入的ip是:${server_ip}"
# 根据传入参数修改项目的ip
cd /home/data/jenkins/workspace/maven_testng/maven_testng/src/main/resources
sed -i "/server_ip=/c server_ip=http://${server_ip}" application.properties
echo "项目已更改为传入的ip: ${server_ip}"
踩坑点: sed 命令后面要使用双引号, 不能使用单引号, 否则会将变量识别成普通字符串!