如何使用Travis-CI运行Tox

时间:2016-05-04 00:50:20

标签: python unit-testing travis-ci python-unittest tox

如何在Tox内使用Travis-CI测试不同的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分钟。

我尝试从yaml文件中删除python列表,因此Travis只会运行一个Python实例,但这会导致我的Python3.5测试失败,因为无法找到3.5解释器。显然,除非你在配置中指定了确切的版本,否则Travis-CI不会安装Python3.5,但是它并没有为其他版本做到这一点... {3}}

我有办法解决这个问题吗?

4 个答案:

答案 0 :(得分: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

这将运行相应的testenvs,默认情况下,这是任何声明的env,其中py27或py34作为名称的因子。如果没有环境匹配给定因子,Py27或py34将用作后备。

Further Reading

答案 1 :(得分:17)

为了获得更多控制和灵活性,您可以手动定义矩阵,以便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设置。但是,如果这是你想要的(覆盖/替换全局设置),只需在矩阵条目中重新定义它。毫无疑问,也可以为矩阵内的各个环境定义各种其他设置。

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

答案 2 :(得分:7)

Travis为每个测试提供TRAVIS_PYTHON_VERSION的python版本,但格式为'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 .)

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

这也适用于pypy:

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

来源:flask-mongoengine' s https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice

答案 3 :(得分:3)

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

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

[tox]
skip_missing_interpreters=true