python - setup.py 中的 2 到 3 没有涵盖测试?

标签 python unit-testing python-3.x setup.py python-2to3

我有一个需要同时支持 Python 2 和 3 的 setup.py。

代码目前可以工作并且可以安装在 Python 2.x 中

如果我将 use_2to3 = True 子句添加到我的 setup.py,则该模块可以安装在 Python 3 中,但是,执行以下操作:

python setup.py test

导致失败,因为其中一个测试使用了 StringIO 类,Python 3 中的导入行错误(目前是 from StringIO import StringIO,而在 Python3 中它应该是 from io导入 StringIO

我认为,一旦您添加 use_2to3 关键字,所有测试(包括单元测试)在测试之前都会由 2to3 处理。

我错过了什么?如果有帮助,我的大部分 setup.py 如下所示:

from setuptools import setup

setup(
    name='myproject',
    version='1.0',
    description='My Cool project',
    classifiers = [
        'Programming Language :: Python',
        'Programming Language :: Python :: 3',
    ],

    py_modules=['mymodule'],
    test_suite='test_mymodule',
    zip_safe=False,
    use_2to3 = True,
)

编辑:我觉得 2to3 没有在 python setup.py 测试 上运行的原因是它爆炸了,堆栈跟踪的底部显示:

File "/home/aparkin/temp/mymodule/test_mymodule.py", line 18, in <module>
    from StringIO import StringIO

但是如果我在 test_mymodule.py 上运行 2to3,那么该导入行应该被修改为:

from io import StringIO

并且(在最坏的情况下)测试应该单独失败。

最佳答案

为了分发通过 2to3 获取您的模块并运行,它必须列在 py_modules 中。所以将其更改为:

py_modules=['mymodule', 'test_mymodule'],

不幸的是,这有一个副作用,即在您安装项目时安装 test_mymodule,这可能是您不想要的。对于这种情况,我通常会将项目转换为带有 mymodule.tests 子包的包。这样,测试就可以“可安装”,而不会增加额外的困惑。

关于python - setup.py 中的 2 到 3 没有涵盖测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10853688/

相关文章:

php - 从 PHP 到 Python 发送/接收字符串

unit-testing - FakeItEasy DbSet/IQueryable<T> - Entity Framework 6

javascript - 单元测试注入(inject)依赖关系,如 angularJS 中的服务 Controller

python-3.x - Raspberry Pi3中无法导入python3中的opencv?

python - 使用次要术语(决胜局)在 python 中排序计数器集合

python - 对 numpy 数组切片进行采样的最快方法是什么?

python - 如何有条件地从 Pandas 系列中选择项目

python - 实现 tcp 的 accept() 函数

swift - 如何使用 spy 对 textView 进行单元测试

python - 如何使用 pyautogui 增加每秒的点击次数?