让Travis CI为特定的PyPI包运行单元测试

时间:2017-04-25 02:46:58

标签: unit-testing pip travis-ci

我写了一个C扩展,旨在提高Python库的性能。该扩展程序使用pip作为额外安装:

# Install the library by itself:
pip install pyota

# Install the Python library w/ C extension:
pip install pyota[ccurl]

如果存在,Python库更喜欢C扩展,但它将依赖于纯Python实现:

# iota/crypto/__init__.py
try:
  from ccurl import *
except ImportError:
  from .pycurl import *

测试C扩展的一种简单方法是安装扩展,然后运行Python库的单元测试。有足够的覆盖范围,这样如果单元测试通过安装了C扩展,我可以确信C扩展的行为与纯Python实现完全相同。

然而,事实证明,自动化非常棘手。

我试图让Travis CI做这样的事情:

  1. pip install -e .(即将pyota[ccurl]安装到venv中)。
  2. pyota source dist安装到cwd(source dist包括单元测试)。
  3. nosetests pyota/tests(从本地源dist运行单元测试)。
  4. 但是,我很想知道如何完成第2步。

    如何指示Travis CI通过pip下载源代码分发以便它可以运行单元测试?

1 个答案:

答案 0 :(得分:0)

这感觉有点像蛮力解决方案(好吧,让我们在这里诚实;感觉就像我试图解决错误的问题),但这种配置让Travis下载Python库并运行单元测试:

# .travis.yml
...
script:
  - pip install nose mock
  - 'pip download --no-deps --no-binary :all: --dest pyota --pre pyota'
  - tar -zxf pyota/PyOTA-*.tar.gz -C pyota --strip-components=1
  - nosetests pyota/test

我无法弄清楚如何在pip download完成后预测归档的名称,所以我选择了glob。