【问题标题】:How to run Tox with Travis-CI如何使用 Travis-CI 运行 Tox
【发布时间】:2016-08-29 05:45:17
【问题描述】:

如何在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 解释器。显然,这是一个 known limitation,因为 Travis-CI 不会安装 Python3.5,除非您在配置中指定该确切版本……但它不会为其他版本执行此操作。

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

【问题讨论】:

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


    【解决方案1】:

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

    Further Reading

    【讨论】:

    • 如果你在.travis.ymtox.ini设置不同的python版本会发生什么?
    【解决方案2】:

    Travis 以TRAVIS_PYTHON_VERSION 为每个测试提供python 版本,但格式为'3.4',而tox 需要'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

    【讨论】:

    • TPV=$TRAVIS_PYTHON_VERSION ; tox -e "py${TPV:0:1}${TPV:2:1}"
    • @cclauss:不要那样做。 Python 3.10 is slated to follow Python 3.9。天真地假设 ${TPV:2:1} 正确解析所有可能的次要版本的构建脚本将在 Python >= 3.10 下透明地失败。
    【解决方案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
    

    【讨论】:

      【解决方案4】:

      为了获得更多控制和灵活性,您可以手动定义矩阵,以便 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 CI 中,关键字 jobs: 现在优于 matrix:
      猜你喜欢
      • 1970-01-01
      • 2022-06-24
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2018-03-14
      • 2015-09-17
      • 1970-01-01
      • 2015-12-08
      相关资源
      最近更新 更多