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 工作流程

配置(configuration):加载配置文件(如
tox.ini),解析命令行参数,读取系统环境变量等打包(packaging):(虚线框表示可选的)对于带有
setup.py文件的项目,可以在这步去生成它的源发行版创建虚拟环境:默认使用
virtualenv来创建虚拟环境,并根据配置项中的“deps”安装所需的依赖项,然后执行配置好的命令(commands)报告(report):汇总所有虚拟环境的运行结果并罗列出来