在travis中安装和测试python项目

2024-05-23 18:51:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样的文件结构:

./
    project_name/
        __init__.py
    setup.py
    tests/
    .travis.yml

所以我跑了py.试验在我的生活中。特拉维斯·伊梅尔. 取决于我如何安装软件包,它要么工作要么遇到错误。你知道吗

如果我用pip install -e .安装这个包,一切都很好,但是这有一个缺点,那就是不是一个实际的安装场景。你知道吗

如果我安装带有pip install .的包,那么它将以非开发模式安装在另一台机器上。但是,出现了一个问题:当我运行pytest时,我的测试使用import project_name。然后,python从目录本地导入,而不是使用安装的包,从而导致ImportMismatchError。你知道吗

最好的办法是什么?你知道吗


Tags: installpip文件namepyprojecttravisinit
2条回答

如果要在已安装的代码上运行测试,则需要一个包含所有将要安装的源代码的中间目录(而不是包);该目录的通用名称就是src。布局示例:

project_root
├── src
│   ├── spam
│   │   ├── __init__.py
│   │   └── eggs.py
│   └── ...
├── tests
│   ├── test_spam.py
│   └── ...
└── setup.py

调整设置脚本以符合src目录:

# setup.py

from setuptools import setup, find_packages

setup(
    name='spam',
    ...
    packages=find_packages('src'),
    package_dir={'': 'src'},
    ...
)

在这个布局中,尽管当前目录(project_root)仍然被添加到sys.path,但是所有的包都被隐藏起来,无法导入。这样,您就被迫安装包来调用测试,并且总是测试已安装的代码。通常,您在编写代码时通过本地计算机上的pip install editable .以开发模式安装包,然后通过CI服务器上的pip install .安装包,测试将在实际的包安装上执行。另一个优点是,这种布局不允许您在安装脚本中导入包的源代码,安装时不会遇到问题(要安装代码,必须已经安装了代码)。你知道吗

如果您有松散的模块,我更喜欢使用pathlib进行全局绑定:

py_modules=[p.name for p in pathlib.Path('src').glob('*.py')]

如果您仍然需要Python 2兼容性,解决方案可能如下所示:

py_modules=[os.path.splitext(os.path.basename(p))[0] for p in glob.glob("src/*.py")]

一种解决方案可能是在顶层创建一个名为tox.ini的文件,以便与tox一起使用。这是一个负责构建环境的工具—它类似于make,但更具体地说是python的东西。如果你做了一个tox.ini

[tox]
envlist = py

[testenv]
commands = pytest tests
deps =
    pytest

然后用pip3 install tox安装tox,然后只使用命令行中的命令tox,它将负责在隔离的虚拟环境中安装包和运行测试。你知道吗

然后,您可以在travis.yml中执行此操作:

language: python
python:
  - 3.6
install:
  - pip install tox
script:
  - tox

Travis将使用tox以一种更具重现性的方式运行测试。你知道吗

相关问题 更多 >