Python自动化测试工具tox学习

1 定义/解释

关于virtualenv

虚拟环境virtualenv,是可以在一个主机上,自定义出多套的Python环境。多套环境中使用不同的Python解析器、环境变量设置、第三方依赖包,执行不同的测试命令,最重要的是各个环境之间互不影响,相互隔离。

  • 最典型的应用场景就是测试在不同Python版本下代码的兼容性。我们可以为py2.4,py2.5,py2.6,py2.7,py3.4等不同Python版本创建不同的虚拟环境,通过tox进行统一管理。也可以自定义虚拟环境(tox.ini进行配置)

  • 例如:

    • testenv:pep8,代码格式检查;

    • testenv:cover,测试覆盖率。

关于tox

tox是一个基于命令行驱动的Python任务自动化测试工具(通用的虚拟环境管理和测试命令行工具)。目的是为了Python测试标准化,自动化。

功能包括:

  • 可以实现自定义多套相互独立的Python环境,用不同的Python版本和解释器检查软件包是否正确安装;

  • 可以在不同的virtualenv中进行测试,配置选定的测试工具;

  • …(待学习)

关于tox.ini

  • 配置文件:关于项目的基本信息以及该项目待运行的环境;

  • 这个文件需要跟项目的setup.py文件放置同一路径下,路径名{toxinidir}(tox.ini所在的目录)。(Reason: 工作方式是通过setup.py文件为待测程序创建源码安装包,他会查看tox.ini中的所有环境设置,并针对每个环境设置执行相应操作)

    在该路径下,执行tox-quickstart按照指示可生成示例tox.ini文件,我们可以根据需要手动修改配置信息。
    在该路径下,执行tox,会发生什么?

    • 打包项目

    • 构建虚拟机测试环境

    • 测试项目代码


2 使用方法

使用场景示例官方文档

安装

使用pip install tox安装

  • 在需要运行的Python项目目录中建立tox.ini文件,在tox.ini文件中配置项目的基本信息和想要的测试环境;

  • 可以通过运行tox-quickstart来自动生成一个tox.ini文件。

运行

  • 命令tox运行全部测试环境;

    如果在其他目录下运行,则需要tox -c ./dir/tox.ini -c是指定配置文件的意思

  • 命令tox -e envname运行指定的环境;

  • 命令tox -h查看命令参数帮助。

行为控制

tox 的行为由其配置文件控制,当前它支持 3 种配置文件:

  • pyproject.toml

  • tox.ini

  • setup.cfg

3 配置@官方文档

tox.ini文件常用配置实例&解释

[tox]
envlist = test_api,py34,pep8
skipsdist = True
toxworkdir = {toxinidir}/../var/.tox
indexserver =
default = https://pypi.doubanio.com/simple
[testenv]
changedir = {toxinidir}/..
#安装依赖
deps = -r{toxinidir}/requirements.txt
# 表示构建环境的时候要执行的命令,一般是使用 pip 安装
install_command = pip install {opts} {packages}
setenv =
# 不生成_pycache_文件
PYTHONDONTWRITEBYTECODE = 1
[testenv:test_api]
# 运行pytest并生成报告
commands = pytest \
-vs {posargs:case/} --html=./var/report.html
[testenv:py34]
# 这个 section 是为 py34 环境定制某些配置的,没有定制的配置,将会从 [testenv] 读取
commands =
python -m testtools.run
[testenv:pep8]
commands =
flake8 {posargs} ./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"
{toxinidir}/tools/config/check_uptodate.sh
{toxinidir}/tools/check_exec.py {toxinidir}/egis
# 执行 tox -e pep8 进行代码检查, 实际上是执行了上述指令来进行代码的语法规范检查

3.1 说明

每个[xxx]及其下方内容组成一个章节(section),每个章节间使用空行作间隔。

[tox]下面是全局性的配置项,envlist 字段定义了tox操作的环境;
[xxx]下面是 xxx 虚拟环境的配置项,[xxx:yyy]继承xxx的配置,同时其自身配置项的优先级更高;

3.2 [tox]下的配置参数说明

testenv 是默认配置,如果某个环境自身的 section 中没有定义这些配置, 那么就从这个 section 中读取

envlist 表示 tox 中配置的环境都有哪些,网上有很多比如py2, py3

toxworkdir 创建virtual虚拟环境的路径

skipsdist = True 跳过本地软件包安装到virtualenv中步骤

tox默认会使用sdist构建包,对于测试来说没有必要,而且构建还会要求存在README、setup.py等文件,并且保证setup.py的格式符合要求等,所以本条命令的意思是:跳过此步

changedir 执行命令时更改,以该目录当前目录

3.3 虚拟环境[xxx]下的配置参数说明

对于每个虚拟环境,可用的配置项很多:

常用的有:

  • description(描述信息)

  • basepython(Python解释器版本)

  • deps(环境依赖项) - requirement.txt

    deps =
    -r{toxinidir}/requirements.txt
    -r{toxinidir}/test-requirements.txt
    deps 指定构建环境时需要安装的第三方依赖包
    每个虚拟环境创建的时候, 会通过 pip install -r requirements.txt 和 pip install -r test-requirements.txt 安装依赖包到虚拟环境
    一般的项目会直接安装 requirements.txt 和 test-requirements.txt 两个文件中的所有依赖包

  • setenv 导入变量,跟exprot一样

  • commands(命令语句)表示构建好 virtualenv 之后要执行的命令

    posargs 参数变量 如果输入tox ,默认执行case目录,如果输入tox /test 则执行/test目录下的文件,而不执行case目录下文件
    e.g. commands = ostestr {posargs}

    • 这里调用了 ostestr 指令来调用 testrepository 执行单元测试用例

    • {posargs} 参数就是可以将 tox 指令的参数传递给 ostestr

文件示例:requirement.txt

1.requests
2.pytest
3.pytest-html

3.4 测试

所有的命都是在{toxinidir}(tox.ini所在的目录)作为当前命令执行的工作目录

tox-quickstart
or
tox [-e py34] [subpath]
# subpath以Python模块形式用"."一级一级连接

4 工作流程

Alt text

  • 配置(configuration):加载配置文件(如 tox.ini),解析命令行参数,读取系统环境变量等

  • 打包(packaging):(虚线框表示可选的)对于带有 setup.py 文件的项目,可以在这步去生成它的源发行版

  • 创建虚拟环境:默认使用 virtualenv 来创建虚拟环境,并根据配置项中的“deps”安装所需的依赖项,然后执行配置好的命令(commands)

  • 报告(report):汇总所有虚拟环境的运行结果并罗列出来


参考资料

  1. openstack中tox的使用

  2. Python任务自动化工具tox使用教程

  3. tox工具

  4. pytest tox.ini使用

目录