如何使用Travis-CI运行Tox

Cer*_*rin 24 python unit-testing travis-ci tox python-unittest

如何在Travis-CI中使用Tox测试不同的Python版本?

我有一个tox.ini:

[tox]
envlist = py{27,33,34,35}
recreate = True

[testenv]
basepython =
    py27: python2.7
    py33: python3.3
    py34: python3.4
    py35: python3.5
deps =
    -r{toxinidir}/pip-requirements.txt
    -r{toxinidir}/pip-requirements-test.txt
commands = py.test
Run Code Online (Sandbox Code Playgroud)

它运行我的Python单元测试在几个Python版本,并完美地工作.

我想在Travis-CI中设置一个构建,当我将更改推送到Github时自动运行它,所以我有一个.travis.yml:

language: python
python:
-   "2.7"
-   "3.3"
-   "3.4"
-   "3.5"
install:
-   pip install tox
script:
-   tox
Run Code Online (Sandbox Code Playgroud)

这在技术上似乎有效,但它在每个Python版本中冗余地运行我的所有测试......来自每个版本的Python.因此,需要5分钟的构建需要45分钟.

我尝试python从我的yaml文件中删除列表,因此Travis只运行一个Python实例,但这导致我的Python3.5测试失败,因为找不到3.5解释器.显然,这是一个已知的限制,因为Travis-CI不会安装Python3.5,除非您在配置中指定了确切的版本......但它不会为其他版本执行此操作.

有没有办法解决这个问题?

小智 27

为此,我会考虑使用tox-travis.这是一个插件,允许使用Travis CI的多个python版本和Tox的完全可配置性.为此,您将配置.travis.yml文件以使用Python进行测试:

sudo: false
language: python
python:
    - "2.7"
    - "3.4"
install: pip install tox-travis
script: tox
Run Code Online (Sandbox Code Playgroud)

这将运行适当的testenvs,默认情况下,任何声明的env都使用py27或py34作为名称的因子.如果没有环境匹配给定因子,Py27或py34将用作后备.

进一步阅读

  • 如果你在 `.travis.ym` 和 `tox.ini` 设置不同的 python 版本会发生什么? (2认同)

Way*_*lan 20

为了获得更多控制和灵活性,您可以手动定义矩阵,以便Python版本和tox环境匹配:

language: python
matrix:
  include:
    - python: 2.7
      env: TOXENV=py27
    - python: 3.3
      env: TOXENV=py33
    - python: 3.4
      env: TOXENV=py34
    - python: 3.5
      env: TOXENV=py35
    - python: pypy
      env: TOXENV=pypy
    - env: TOXENV=flake8
install:
  - pip install tox
script:
  - tox
Run Code Online (Sandbox Code Playgroud)

如果不明显,矩阵中的每个条目都以一个以连字符(-)开头的行开始.该行后面的任何项目都是缩进的,是该单个项目的附加行.

例如,除了最后一个条目之外的所有条目都是两行.最后一个条目只有一行,不包含python设置; 因此,它只使用默认的Python版本(根据Travis文档的Python 2.7).当然,特定的Python版本对于该测试并不重要.如果你想对Python 2和3(每次一次)运行这样的测试,那么建议默认使用Travis安装的版本(2.7和3.4),这样测试就可以更快地完成,因为它们不需要首先安装非标准的Python版本.例如:

- python: 2.7
  env: TOXENV=flake8
- python: 3.4
  env: TOXENV=flake8
Run Code Online (Sandbox Code Playgroud)

除了Python版本2.5-3.6之外,它同样适用于pypy(矩阵的倒数第二个条目)和pypy3(未显示).

虽然各种其他答案提供了最终为您提供此结果的快捷方式,但有时它有助于手动定义矩阵.然后,您可以为矩阵中的各个环境定义特定的内容.例如,您可以仅为单个环境定义依赖关系,并避免在每个环境中安装该依赖关系所浪费的时间.

- python: 3.5
  env: TOXENV=py35
- env: TOXENV=checkspelling
  before_install: install_spellchecker.sh
- env: TOXENV=flake8
Run Code Online (Sandbox Code Playgroud)

在上面的矩阵中,install_spellchecker.sh脚本仅针对相关环境运行,而不针对其他环境运行.使用该before_install设置(而不是install),因为使用该install设置将覆盖全局install设置.但是,如果这是你想要的(覆盖/替换全局设置),只需在矩阵条目中重新定义它.毫无疑问,也可以为矩阵内的各个环境定义各种其他设置.

手动定义矩阵可以提供很大的灵活性.但是,如果您不需要增加灵活性,其他答案中的各种快捷方式之一将使您的配置文件更简单,以后更容易阅读和编辑.


Jér*_*ôme 7

Travis为每个测试提供python版本TRAVIS_PYTHON_VERSION,但是在表单中'3.4',同时tox期望'py34'.

如果您不想依赖外部lib(tox-travis)进行翻译,可以手动执行:

language: python
python:
-   "2.7"
-   "3.3"
-   "3.4"
-   "3.5"
install:
-   pip install tox
script:
-   tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d .)
Run Code Online (Sandbox Code Playgroud)

在搜索引擎中搜索此模式,您将找到许多使用它的项目.

这也适用于pypy:

tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d . | sed -e 's/pypypy/pypy/')
Run Code Online (Sandbox Code Playgroud)

资料来源:flask-mongoengine的.travis.yml.

  • @cclauss:**不要这样做。** [Python 3.10 预计将遵循 Python 3.9](https://www.python.org/dev/peps/pep-0596/#lifespan)。天真地假设 `${TPV:2:1}` 正确解析所有可能的次要版本的构建脚本在 Python >= 3.10 下将明显失败。 (2认同)

Dmi*_*sov 5

TOXENV环境变量可用于通过指定的矩阵为每个版本的 Python 选择测试子集:

language: python
python:
  - "2.7"
  - "3.4"
  - "3.5"
env:
  matrix:
    - TOXENV=py27-django-19
    - TOXENV=py27-django-110
    - TOXENV=py27-django-111
    - TOXENV=py34-django-19
    - TOXENV=py34-django-110
    - TOXENV=py34-django-111
    - TOXENV=py35-django-19
    - TOXENV=py35-django-110
    - TOXENV=py35-django-111
install:
  - pip install tox
script:
  - tox -e $TOXENV
Run Code Online (Sandbox Code Playgroud)

在 tox 配置中指定跳过缺少的 Python 版本:

[tox]
skip_missing_interpreters=true
Run Code Online (Sandbox Code Playgroud)