tox其核心作用是支持创建隔离的 Python 环境,在里面可以安装不同版本的 Python 解释器与各种依赖库,以此方便开发者做自动化测试、打包、持续集成等事情。
简单来说,tox 是一个管理测试虚拟环境的命令行工具。
我介绍一种应用场景,我们现在有个工程,现在需要确保其在python3.8~python3.11版本下都能正常运行,那么使用tox进行测试,就会显得非常方便。
感兴趣的可以参考几个帖子:
百度安全验证
Python Tox介绍和使用_solinger的博客-CSDN博客
【Python】tox - 自动化和标准化测试_tox测试_dovsnier的博客-CSDN博客
ok,这里我介绍下,我们的一些具体使用。
其实,tox的主要内容,就是在于其tox.ini文件。
那么先看一个tox.ini文件:
[tox]
env_list = py38,py39,py310,py311
skip_missing_interpreters = true
[testenv]
deps =
p4python
python-dateutil
python-ldap
pytz
setenv =
PYTHONPATH = {env:PYTHONPATH}
commands =
python3 tests/run_tests.py {posargs}
这里解释一下:
env_list:就是指,要管理的python解释器,都有哪些,这里采用的是模糊匹配的原则,基本上它的识别度还是跟高的。
skip_missing_interpreters:是说,如果本地没有匹配到相应的python解释器,那就跳过。
deps:指做测试的时候,需要依赖的第三方包。
setenv:指往往在linux中,会有个环境变量PYTHONPATH,我们可以给其赋值,在代码执行过程中,往往导包的时候,在其它地方无法导入的情况下,也会在PYTHONPATH提供的路径下去找包,那么按照上面的写法,就相当于将PYTHONPATH添加到了os.env中。
commands:就是要执行的测试命令,这个参数本身没什么要注意的,主要是在其末尾有个{posargs}参数,这个参数需要注意,这个参数的意思是,在执行tox命令的时候可以传参,而传入的参数,会如数传递到{posargs}。
ok,再看看,tox的具体命令:
tox -e py38 -r
其中 -e 参数:是指选择要运行的测试环境。
-r 参数:就是 run 么,这个参数可给可不给,最好给着。
另外就是需要注意,安装tox的时候,我们使用的命令是 pip install tox 但是,安装完成后,会发现,tox是有个可执行文件的,我们需要将可执行文件添加到环境路径里去,否则,在执行tox命令的过程中,会出现找不到tox的报错。这里windows的添加环境路径和mac,linux略有不同。
首先需要明确,tox是不挑对象的,就是说,不管是python3.8对应的tox版本,还是python3.10对应的对象,都可以直接用,都可以去管理其他python版本的虚拟环境的。
然后,看下,我是在windows下下载的python3.8的tox,那么就应该这样添加环境路径:
先找到tox的可执行文件。
在将tox可执行文件添加到环境路径中就可以了。
linux和mac的添加方法一致:
再看一下tox:
这就是个可执行文件,我们执行tox命令,就是在执行这里的这个tox可执行文件。
所以,它确实不分python版本。
然后,需要将这个目录添加到PATH里:export PATH=$PATH:/home/your_name/.local/bin
然后就可以正常使用tox了。
当然,在执行tox的时候,注意一下,就是当前目录下得有tox.ini文件,这个,没有的话会报错,就是说,没找到tox.ini文件,然后,重新换个有tox.ini文件的地方去执行tox命令就可以了啊。
上面介绍了一个没有tox传参式的命令,另外,再看个有传参的tox用法。
tox -e py310 -r -- --ssh-hostname 10.12.15.181 --ssh-password 123456 --ssh-username my_name
基本上大同小异。但是有个地方,需要注意,就是在 -r 后面,有个 -- 这个东西,这个东西算是一个标识符,其标志在其之后的内容,为参数内容,是要传给tox.ini文件中的{posargs}的。
再看个例子:
这是 tox.ini 文件:
[tox]
env_list = py38,
py39,
py310,
py311
skip_missing_interpreters = True
[testenv]
deps = pyVim
pyVmomi
pytest
pytz
requests
PyYAML
progressbar2
python-dateutil
mock
setenv = PYTHONPATH = {env: PYTHONPATH}
commands = pytest tests/
这是执行命令:tox -e py38 -r
这是执行结果: