1,tox 简介 tox 是通用的虚拟环境管理和测试命令行工具. tox 能够让我们在同一个 Host 上自定义出多套相互独立且隔离的 python 环境, 每套虚拟环境中可能使用了不同的 Python 拦截器 / 环境变量设置 / 第三方依赖包. 所以 tox 最典型的应用就是用于测试 Python 程序的兼容性了. tox 是 openstack 社区最基本的测试工具, 比如 python 程序的兼容性, UT 等. 它的目标是提供最先进的自动化打包, 测试和发布功能. 1) 作为持续集成服务器的前端, 大大减少测试工作所需时间; 2) 检查软件包能否在不同的 python 版本或解释器下正常安装; 3) 在不同的环境中运行测试代码. 一般 openstack 项目中的 tox 的功能包含了: 打源码包 (sdist), 单元测试 (UT), 测试覆盖率 (coverage), 代码格式检查 (pep8,flake) 等功能. 关键字解释: 打源码包 (sdist), 单元测试 (UT), 测试覆盖率 (coverage), 代码格式检查 (pep8,flake)
2, 使用 pip 方式安装 tox 1) 安装 pip 安装 epel 扩展源: yum -y install epel-release 更新完成之后, 就可安装 pip: yum -y install python-pip 安装完成之后清除 cache: yum clean all
2) 安装 tox $ pip install tox
备注: 安装过程中需要提前安装的一些依赖包 yum install python-devel yum install libffi-devel yum install openssl-devel yum install gcc yum install gcc-c++
3,tox 的运行命令 tox -e pep8 #对代码进行检查 tox -e py27 #构建测试环境 当我们执行 tox -e py27 时就是开始项目的单元测试, tox 首先会读取项目根目录下的 tox.ini 文件, 然后根据该文件来构建出相应的虚拟环境, 并将该虚拟环境保存在 .tox/ 目录下的相应文件中 (以环境的名称来命名) 实例如下: /opt/stack/keystone/.tox$ ls log pep8 py27 除了 log 之外的 py27/pep8 都是 virtualenv 环境
4,tox.ini 常用参数详解 tox.ini 样例: [tox] #tox 的全局配置, 列出了需要执行的虚拟环境列表, 在命令行中直接执行 tox, 就会依次执行 py26,py27,pep8 envlist = py27,pep8,py26 skipsdist = True indexserver = default = https://pypi.doubanio.com/simple
- [testenv] install_command = pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com deps = -r/requirements.txt -r/test-requirements.txt commands = ostestr setenv = PYTHONPATH = /py27 usedevelop = True
- [testenv:dev] #自定义虚拟环境 deps = pytest commands =
- [testenv:py34] setenv = {[testenv]setenv} commands = python -m testtools.run whitelist_externals = # 白名单, 列出的命令可在 virtualenv 中使用
- bash
- find
- jenkins-jobs
- mkdir
- rm
这个 section 是为 py34 环境定制某些配置的, 没有定制的配置, 将会从 [testenv] 读取
[testenv:pep8] basepython = python2.7 deps = hacking commands = flake8 ./egis egis/common
Check that .po and .pot files are valid:
bash -c "find egis -type f -regex'.*.pot?'-print0|xargs -0 -n 1 msgfmt --check-format -o /dev/null" /tools/config/check_uptodate.sh /tools/check_exec.py /egis
执行 tox -e pep8 进行代码检查, 实际上是执行了上述指令来进行代码的语法规范检查
[tox:jenkins] downloadcache = ~/cache/pip
定义了 CI server jenkins 的集成配置
指定了 pip 的下载 cache 目录, 提高构建虚拟环境的速度
[testenv:cover]
Also do not run test_coverage_ext tests while gathering coverage as those
tests conflict with coverage.
- commands = python setup.py testr --coverage
- --testr-args='^(?!.*test.coverage).$' python tools/patch_tox_venv.py
- nosetests
定义一个 cover 虚拟环境, 使单元测试的时候, 自动应用 coverage
python tools/patch_tox_venv.py 就是安装 redhat-eventlet.patch 补丁; nosetests 就是执行 nose, 进行单元测试, 参数就是可以将 tox 的参数传递给 nosetests, 例如: tox -- --with-coverage 执行的时候就是 nosetests --with-coverage
对样例中部分参数详解: envlist 表示 tox 中配置的环境都有哪些 skipsdist = True tox 默认会使用 sdist 构建包, 对于测试来说没有必要, 而且构建还会要求存在 README,setup.py 等文件, 并且保证 setup.py 的格式符合要求等, 所以跳过此步 [testenv] 默认配置, 如果某个环境自身的 section 中没有定义这些配置, 那么就从这个 section 中读取
[testenv:dev], 非默认的集成方案, 需要使用 tox -e dev 才能 invoke(求助于, 援引, 引用) deps 指定构建环境时需要安装的第三方依赖包, 每个虚拟环境创建的时候, 会通过 pip install -r requirements.txt 和 pip install -r test-requirements.txt 安装依赖包到虚拟环境 一般的项目会直接安装 requirements 和 test-requirements 两个文件中的所有依赖包
commands 表示构建好 virtualenv 之后要执行的命令, 这里调用了 ostestr 指令来调用 testrepository 执行单元测试用例, 参数就是可以将 tox 指令的参数传递给 ostestr
setenv 列出了虚拟机环境中生效的环境变量, 一些配色方案和单元测试标志 usedevelop 表示安装 virtualenv 时, 项目自身是采用开发模式安装的, 所以不会拷贝代码到 virtualenv 目录中, 只是做个链接 install_command 表示构建环境的时候要执行的命令, 一般是使用 pip 安装 :tox.ini 文件目录 indexserver 更换 pypi 依赖的下载地址或者使用 tox -i http://pypi.my-alternative-index.org/ basepython 指定构建 virtualenv 的编译器 distshare 变量实现多个 tox 工程的文件共享
小知识点: 执行单元测试的时候, 顺便生成单元测试报告, 并检查测试覆盖率, 并生成覆盖率报告. 直接执行 tox 是不行的, 只能进行单元测试, 需要给 tox 增加扩展参数, 如下: tox --cover-erase --with-coverage --cover-html
对前辈们, tox 内容的一个汇总, 方便自己以后查找
****
来源: http://www.bubuko.com/infodetail-2619021.html