之前弄了一个基于 Python 的 BDD 测试框架 behave 的接口测试,测了 4 个项目,已经用了大半年;

后来又顺便体验了下面 4 点

1.Jenkins CI 持续集成
2.SonarQube 静态扫描
3.写了 Python 项目的单元测试
4.及单元测试覆盖率的统计

期间翻阅了一些资料,捣鼓了几天就成功了,难度还行~快过年了,总结了一下配置步骤分享给大家(文笔不好莫见怪😳~)

Jenkins CI 持续集成

在 jenkins/jenkins 基础上构建自定义的 docker image

脚本编写思路:
-安装 vim 工具
-安装 Python 虚拟环境工具 pyEnv;
-安装 Python 3.7.2 和 2.7

Dockerfile

FROM jenkins/jenkins:lts
USER root
RUN apt-get update && apt-get install -y vim
# https://github.com/pyenv/pyenv/wiki
RUN apt-get install -y --no-install-recommends make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
RUN curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
RUN echo '#!/bin/bash ' > /etc/profile.d/pyenv.sh
RUN echo 'export PYENV_ROOT="$HOME/.pyenv"' >> /etc/profile.d/pyenv.sh
RUN echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> /etc/profile.d/pyenv.sh
RUN echo 'eval "$(pyenv init -)"' >> /etc/profile.d/pyenv.sh
RUN chmod 755  /etc/profile.d/pyenv.sh
# source profile.d/pyenv.sh and  install python 3.7.2
RUN . /etc/profile.d/pyenv.sh && pyenv install 3.7.2

构建命令

docker build jenkins/ -t jenkins/wxp

启动 docker container

资料

sudo docker run -d -u 0 -p 8080:8080 -p 50000:50000 --ulimit nofile=4096:8192 -v /Users/grabbywu/jenkins_home:/var/jenkins_home jenkins/wxp

Jenkins 配置

Plugin

allure jenkin plugin

Run.sh

#!/bin/sh
# 1.第一个参数为 环境 env 第二个参数 需要执行的features 列表
if [ ! -n $1 ]&&[ ! -n $2 ];then
    echo "please input env and features"
    exit 1
fi
# https://www.cnblogs.com/han-1034683568/p/7211392.html
# bash [[ ]] ==
# sh [] =
# 2.当前目录切换python 环境,如果在本地调试,不需要这一步
. /etc/profile.d/pyenv.sh
python --version
pyenv local 3.7.2
python --version
# 3.导入环境变量
if [ "$1" = "test" ]; then
    export TestEnv='test'
elif [ "$1" = "uat" ]; then
    export TestEnv='uat'
else
    echo "please input test or uat"
    exit 1
fi
# 4.移除旧的报告文件夹
if [ -d allure_results ]; then
   rm -rf allure_results
fi

# 5.运行测试
j=1
for i in $@
do
  echo $i
  # 变量名和等号之间不能有空格
  # int值比较用-eq  大于-gt
  if [ $j -eq 2 ]||[ $j -gt 2 ]; then
    {
    behave -f allure_behave.formatter:AllureFormatter -o allure_results $i --tags=$1
    }||{
    echo "execute error!"
    exit 1
    }
  fi
  j=$(($j+1))
done

Pipline

node {
   stage('Git CheckOut') { // for display purposes
        #  这里填成自己的git地址
        git credentialsId: '038dd26b-e3eb-4175-af22-6213a1759425', url: 'http://gitlab.XXX.com/XXX/rest-api-bdd.git' 
   }
   stage('Preparation') {
      sh '''#!/bin/bash
        . /etc/profile.d/pyenv.sh
        python --version
        pyenv local 3.7.2
        python --version
        if [[ -f requirements.txt ]]; then
             pip install -r requirements.txt
        fi
     '''
   }
   stage('Run TEST') {
            sh '''
                echo ${TestEnv}
                echo ${features}
                sh jenkins/run.sh ${TestEnv} ${features}
            '''
   }
    stage('allure Report') {
      allure includeProperties: false, jdk: '', results: [[path: 'allure_results']]
   }
}

执行及结果

报告例子

![](/uploads/photo/2019/c098ca95-4eab-451f-8433-6be05da82936.png! large

遇到的问题

Q1. 设置 jenkins 时间为 北京时间

系统设置>执行脚本

System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')

Q2. Shell 脚本 bash 解释器与 sh 解释器的差异

解决方法 1:

统一解释器注释为 #!/bin/sh 或 #!/bin/bash
解决方法 2:

知道 sh 与 bash 的语法区别,如 比较 赋值

Q3. Debian 修改时区 tzselect

PS.最好,在代码中进行时区设置;不用受服务器时区影响

Q4. shell 执行有时候会遇到需要异常捕获的情况,但是又没有 Try catch 这种

解决办法:

{
behave -f allure_behave.formatter:AllureFormatter -o allure_results $i --tags=$1
}||{
echo "execute error!"
exit 1
}

测试:


↙↙↙阅读原文可查看相关链接,并与作者交流