繁体   English   中英

如何使用Travis-CI运行Tox

[英]How to run Tox with Travis-CI

如何在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分钟。

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

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

为此,我会考虑使用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将用作后备。

进一步阅读

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

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

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 .)

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

这也适用于pypy:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM