29

如何在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

它在几个 Python 版本中运行我的 Python 单元测试并且运行良好。

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

language: python
python:
-   "2.7"
-   "3.3"
-   "3.4"
-   "3.5"
install:
-   pip install tox
script:
-   tox

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

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

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

4

4 回答 4

31

为此,我会考虑使用 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

这将运行适当的测试环境,它们是任何声明的环境,默认情况下使用 py27 或 py34 作为名称的因素。如果没有环境与给定因素匹配,则 Py27 或 py34 将用作后备。

延伸阅读

于 2016-05-05T23:55:39.677 回答
25

为了获得更多控制和灵活性,您可以手动定义矩阵,以便 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

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

例如,除最后一个之外的所有条目都是两行。最后一个条目只有一行,不包含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

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

虽然其他各种答案提供了最终为您提供此结果的快捷方式,但有时手动定义矩阵很有帮助。然后,您可以为矩阵中的各个环境定义特定的东西。例如,您可以仅为单个环境定义依赖项,避免浪费时间在每个环境中安装该依赖项。

- python: 3.5
  env: TOXENV=py35
- env: TOXENV=checkspelling
  before_install: install_spellchecker.sh
- env: TOXENV=flake8

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

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

于 2017-09-07T19:45:41.037 回答
8

Travis 为每个测试提供了 python 版本TRAVIS_PYTHON_VERSION,但形式'3.4'为 whiletox期望'py34'

如果您不想依赖外部库(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 .)

在搜索引擎中搜索这个模式,你会发现很多项目都在使用它。

这也适用于 pypy:

tox -e $(echo py$TRAVIS_PYTHON_VERSION | tr -d . | sed -e 's/pypypy/pypy/')

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

于 2017-02-17T23:16:20.143 回答
4

TOXENV environment variable can be used to select subset of tests for each version of Python via specified matrix:

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

In tox config specify to skip missing versions of Python:

[tox]
skip_missing_interpreters=true
于 2017-03-20T19:20:56.173 回答