python tox

tox

1tox是什么?

tox是通用的虚拟环境管理和测试命令行工具。tox能够让我们在同一个Host上自定义出多套相互独立且隔离的python环境(toxopenstack社区最基本的测试工具,比如python程序的兼容性、UT等)。

1) 检查软件包能否在不同的python版本或解释器下正常安装;

2) 在不同的环境中运行测试代码;

3) 作为持续集成服务器的前端,大大减少测试工作所需时间。

tox的源码工程位于:https://github.com/tox-dev/tox 


2、openstack社区tox使用:

比如openstack社区的openstack-infra/project-config工程,其gerrit配置的门禁,其门禁具体执行中使用了tox执行基本语法检测。

S1clone该工程:

git clone https://github.com/openstack-infra/project-config.git

S2、查看project-config的工程门禁配置(project-config/zuul/layout.yaml截取一部分):

 - name: openstack-infra/project-config            
    template:                                       
      - name: bindep-fallback                       
      - name: merge-check                           
    check:                                          
      - gate-project-config-gerrit                  
      - gate-project-config-grafyaml                
      - gate-project-config-layout	# check阶段的门禁                  
      - gate-project-config-linters-ubuntu-xenial   
      - gate-project-config-irc-access              
      - gate-project-config-jenkins-project         
      - gate-project-config-nodepool                
      - gate-infra-docs-index                       
      - gate-generate-specs-site                    
      - gate-project-config-dib      

S3、查看gate-project-config-layout的工程配置:

(位于project-config/jenkins/jobs/infra.yaml中)

- job:                                    
    name: gate-project-config-layout      
    node: ubuntu-trusty                   
                                          
    builders:                             
      - net-info # 显示环境信息,如构建时间、ip、网络状况等                         
      - zuul-git-prep   	# zuul-clone工程                  
      - install-distro-packages   # 安装相应依赖        
      - revoke-sudo   	# 取消sudo权限                    
      - run-tox:      	# 调用tox的相关脚本              
          envlist: 'zuul'                 
                                          
    publishers:                           
      - test-results                      
      - console-log                  

S4、重点是查看builderrun-tox的配置,位于project-config/jenkins/jobs/macros.yaml

- builder:                                                             
    name: run-tox                                                      
    builders:                                                          
      - shell: "/usr/local/jenkins/slave_scripts/run-tox.sh {envlist}"

实际上最后执行的脚本就是:/usr/local/jenkins/slave_scripts/run-tox.sh zuul

run-tox.sh的脚本位于:project-config/jenkins/scripts/run-tox.sh

S5run-tox.sh中脚本,最重要的就是:

tox -vv -e$venv (其中venv=$1,也就是zuul

其中执行的脚本就是zuul -vv zuul,执行对应的测试

具体的参见openstackgerrit

https://review.openstack.org/#/q/status:merged+project-config


3、tox -vv zuul的具体执行任务:

clone下来project-config的工程后,里面有tox.ini文件(截取相关的部分)

[testenv:zuul]                                                                             
basepython = python2.7                                                                     
deps =                      # 安装对应的依赖                                                               
     jenkins-job-builder==1.6.1                                                            
     zuul                                                                                  
whitelist_externals =    	# 白名单,列出的命令可在virtualenv中使用                                                                  
  bash                                                                                     
  find                                                                                     
  jenkins-jobs                                                                             
  mkdir                                                                                    
  rm                                                                                       
commands =          	# 具体的执行命令的过程脚本                                                                       
  rm -rf {envdir}/tmp                                                                      
  mkdir -p {envdir}/tmp/jobs                                                               
  pip install -U jenkins/modules/jjb_afs                                                   
  jenkins-jobs -l debug test -o {envdir}/tmp/jobs jenkins/jobs                             
  bash -c 'find {envdir}/tmp/jobs -printf "%f\n" > {envdir}/tmp/job-list.txt'              
  zuul-server -c tools/zuul.conf-sample -l zuul/layout.yaml -t {envdir}/tmp/job-list.txt   
  {toxinidir}/tools/layout-checks.py {envdir}/tmp/job-list.txt                            

可以看到,这个tox.ini文件中有很多配置,这里只是截取了该任务对应的配置。、

{envdir}tox.ini文件目录


4、查看tox的详细配置:

toxhttps://tox.readthedocs.io/en/latest/examples.html

常见配置如下:

1tox -i http://pypi.my-alternative-index.org:更换pypi依赖的下载地址

(或者在tox.ini中指定indexserver地址)

(2)通常tox只能传递系统变量PATH,如果需要传递其他变量,需要赋值指定;

(3)指定基础环境,有几种方式:

使用tox -e ENV1[,ENV2...]

(4)使用distshare变量实现多个tox工程的文件共享

(5)使用basepython指定构建virtualenv的编译器

(6)usedevelop:使用开发模式安装

(7)skipsdist:不在virtualenv中安装本次软件,使用时需谨慎


5、tox集成pytestunitestnose等:

比如一个简单的例子如下,在工程的tox.ini中写入:

[tox]
envlist = py26,py31
[testenv]
deps=pytest       # PYPI package providing pytestcommands=
  pytest \
        {posargs} # substitute with tox' positional arguments

tox.ini目录中执行tox命令的时候,会构建py26py31两个环境,并且安装pytest,并执行对应的pytest测试


6、使用tox类:

可以在python脚本中使用tox的类调用对应的tox方法。

import tox
os.chdir(os.getenv('WORKSPACE'))
tox.cmdline()	# 执行对应的tox命令,可根据情况入参,具体参见tox类的函数


7、构建一个开发的virtual环境:

我们可以使用tox构建一个简单的virtualenv环境辅助我们进行开发

详情参见:https://tox.readthedocs.io/en/latest/example/devenv.html 

然后用virtualenv + 路径切入进行测试开发

 

猜你喜欢

转载自blog.csdn.net/zhaole524/article/details/77844902