Files
baim0-learn/nginx/16.Nginx和Python白盒测试.md
T
2024-03-09 13:38:35 +08:00

8.8 KiB
Raw Blame History

16.Nginx和Python白盒测试

[什么是白盒测试]

提到测试工程师,我们不陌生, 不过测试到底是什么含义呢?
其实测试的基本原则 就是检验I/O (输入输出 针对代码 或者 是针对产品功能)
比如 LNMP环境的创建,以及后续的开源站点部署,站点部署好以后,用户的访问就是input(输入),结果的返回就是output(输出)
接下来 我们把检测一个LNMP环境 以PYthon来做, 并且加入持续集成中

不管是安装还是部署,只要是有了改动 就一定需要经过测试,不是说放上去了就万事大吉了
(如果是真实的企业环境部署 一旦出现纰漏 都有可能直接引起线上使用问题)

这就需要测试了,而测试工程师 一般分为 黑盒/白盒测试
黑盒就是外围的应用功能测试(APP bug fix, QA 逐一进行应用测试 模拟用户的使用流程)
白盒指的是代码和系统级别的测试(要求必须熟练掌握 一定的脚本变成 , 对代码的流程 需要有一定的认知)

在我们的持续集成课程中,出马的自然是白盒测试咯,因为我们需要对安装的环境,部署的站点 进行测试(后续 还有增量的代码更新 也需要测试)
而白盒测试使用的语言 可以说Python为主 因为大多数情况下 测试的量较多 开发速度也得快 对性能有要求 (Java)

接下来咱们就来模拟一下 持续集成中 白盒测试做的工作
我们先得安装python3.x (Centos 默认都只是自带 python 2.x )

https://www.python.org/downloads/source/ 下载python3.x

[python]

[root@server01 down]# wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz

选择 source tarball

接下来我们进行安装 (我们的安装方法 是2.x 3.x 共存的 安装在 /usr/python/ 避免覆盖)

先提前安装好如下的 依赖包

yum install libffi-devel -y ; yum install gcc-c++ zlib zlib-devel -y

接下来 我们解压Python3.7 并安装

[root@server01 down]# cd Python-3.7.0b3

./configure --prefix=/usr/python

make ; make install

如上即可

安装好以后 路径如下

/usr/python/bin/python3.7

做一下软连接, python3 python2 都有了


 cd /usr/bin/ &&  /usr/python/bin/python3 python3

上面的python3的安装 , 基于Linux下 (server01 -> Jenkins server)

安装一下 jenkins的两个 python插件

python 脚本 我们添加如下

#! /usr/bin/python3

import os

def remote_check(hostname):
    str1=hostname
    #print (str1)
    cmd_line="sudo ssh" + ' ' + str1 + ' ' + "netstat -tnlp"
    print ("run cmd is :" , cmd_line)

    cmd_re=os.popen(cmd_line).readlines()
    if 'nginx' in str(cmd_re):
       print ("NGINX IS RUNNING")
    else:
       print ("NGINX RETURN IN NOT RUNNING!!!!")
       os._exit(1)

    if 'php-fpm' in str(cmd_re):
       print ("PHP IS RUNNING")
    else:
       print ("PHP RETURN IN NOT RUNNING!!!!")
       os._exit(2)

    if 'mysqld' in str(cmd_re):
       print ("MYSQL IS RUNNING")
    else:
       print ("MYSQL RETURN IN NOT RUNNING!!!!")
       os._exit(3)

def remote_check_php(hostname):
    str1="sudo ssh" + ' ' +  hostname
    print (str1)
    cmd_line=str1 + ' ' +  "curl -q http://127.0.0.1:8080/index.php | grep -i -o --color 'php version 5.6'"
    print ("run cmd is :" , cmd_line)
    cmd_re_1=os.popen(cmd_line).readlines()
    print (cmd_re_1)

    if 'PHP Version 5.6' in str(cmd_re_1):
       print ("PHP index.php IS FUNCTIONNING")
    else:
       print ("PHP index.php IS NOT OK!!!!")
       os._exit(4)

def remote_check_web(hostname):
    str1="sudo ssh" + ' ' +  hostname
    print (str1)
    cmd_line=str1 + ' ' +  "curl -q -I http://127.0.0.1:8080/php/wstweb/  | grep 'HTTP/1.1 200 OK'"
    print ("run cmd is :" , cmd_line)
    cmd_re_1=os.popen(cmd_line).readlines()
    print (cmd_re_1)

    if 'HTTP/1.1 200 OK' in str(cmd_re_1):
       print ("PHP WEB IS FUNCTIONNING")
    else:
       print ("PHP WEB IS NOT OK!!!!")
       os._exit(4)

def remote_check_curl_100(hostname,port):
    curl_str1="curl -q -I  "
    curl_url="/php/wstweb/"
    cmd_line=curl_str1 + hostname + ':' + str(port) + curl_url
    print ("run cmd is :" , cmd_line)
    HTTP_CODE_LIST = []
    HTTP_CODE_200_SUM = 0

    for i in range(0,100):
        cmd_re_1=os.popen(cmd_line).readlines()
        if 'HTTP/1.1 200 OK' in str(cmd_re_1):
            HTTP_CODE_LIST.append('200') 

        #print (cmd_re_1)
    for k in range(0,100):
        if HTTP_CODE_LIST[k] == '200':
           HTTP_CODE_200_SUM = HTTP_CODE_200_SUM + 1
           print  (HTTP_CODE_200_SUM)

    HTTP_CODE_PERCENTAL =  (HTTP_CODE_200_SUM / 100) * 100

    if HTTP_CODE_PERCENTAL < 98:
       print ("HTTP_CODE_PERCENTAL < 98 NOT ACCEPTABLE AND EXIT")
       os.exit(98)
    else:
       HTTP_CODE_PERCENTAL_RESULT = str(HTTP_CODE_PERCENTAL) + '%'
       print (HTTP_CODE_PERCENTAL_RESULT)
       print (hostname)
       if hostname == "server04":
          cmd_git_commit="cd /var/lib/jenkins/workspace/GIT_CODING_TRIGGER/php/ ; sudo git checkout master ; sudo git pull  ; sudo git merge stage ; sudo git push origin master ; sudo git checkout stage"
          git_re=os.popen(cmd_git_commit).readlines()
          print (hostname)
          print (cmd_git_commit)
       else:
          print (hostname)
          print ('hostname NOT == server04')

hostname=os.getenv('RUN_SERVER_TO_QA')
remote_check(hostname)
remote_check_php(hostname)
remote_check_web(hostname)
remote_check_curl_100(hostname,8080)

这一段脚本,我们大致讲解一下

主要是使用os.popen的方式,把命令行直接送到linux上执行

然后,在测试的部分,我们主要依据的是,多少次的访问请求中,多少可以正常返回

然后,计算一个最终比例。用这个,来代表测试结果

[白盒测试和持续集成]

上面这张图 给大家把 这一个单元的任务 做出了一个规划

之前已经完成的provion_instance job , 现在 我们需要 一个测试的JOB 调用PYTHON3 去检测之前 是否成功

如上这段脚本 请先注意 最后 红色的这一句, 获取环境变量 RUN_SERVER_TO_QA(很重要 Python如何在Jenkins中获取 环境变量)

这个RUN_SERVER_TO_QA 其实就是取自上游任务PROVISION_INSTANCE的参数设置, 安装的是哪个机器,就把这个机器名当参数 传给这个PYTHON_QATest JOB

这个任务 先检查远程机器在provision安装后 几个服务进程端口 有没有起来

然后 再进一步检查 PHPINFO 是否可以正常工作
最后检查 部署的开源站点 是否工作正常

另外 脚本的最后 还有一个函数 remote_check_curl_100
这个的作用 循环从本地发起 向目标主机100词 curl请求, 如果返回100次请求中的200返回码百分比 低于98% 则测试返回失败

上游的provision 添加如下的配置 在BUILD中 再增加一项 选择 如下


这个添加的触发下游任务, 跟以前有点不一样了, 首先是在BUILD中添加 不再是POSTBUILD

另外, 注意 上面的配置内容, 勾选 BLOCK UNTIL ....., 意思是说, 当前的provision任务 运行了脚本安装后, 并不立刻结束, 需要等待下游的QA_TEST任务运行完 且没有问题的情况下, 才结束

如果下游的Python_QA_TEST没有通过, 则这个任务 也失败

这种设置 下游的方法 在企业中很实用, 作为一种 利用下游任务 检查上游的方法

然后 Python_QATest JOB 也需要接受这个参数


到这里, 我们的Provision_JOB + Python_QA 已经完善了 一个新LNMP实例的任务

光有LNMP还不行, 我们还得把开源站点的部署加入持续集成 , 这里也是模拟 企业发布上线的流程

接下来 我们再新建三个Jenkins JOBs , 分别叫做,GIT_CODING_TRIGGER, Deploy_stage 和 deploy_prod

从名字 我们也可以看得出来, 一个任务是用作发布测试环境, 一个任务是发布生产(也就是真实上线了)

咱们之前 在GIT的那个单元的时候, 跟大家介绍过,企业中的持续集成发布 是个什么样子

如下图所示 我们再来回顾一下哦

这个持续集成的流程,在真实企业中是非常复杂 且工作量巨大(图中的任何一个部分 都隐含着庞大的细节末枝)
咱们教学中 只能简单的模拟一下 这个流程,让大家有一个基本的概念,之后在工作中 就可以提前有一个很好的认知了