使用 cython 运行 pytest - 如何在 pytest 中编译 cython 模块?

Kat*_*tie 3 python testing cython pytest

我有一个项目组织如下:

project
??? project
?   ??? module1
?   ?   ??? api.py
?   ?   ??? _cpython_foo.py
?   ?   ??? _cython_foo.pyx
?   ??? module2
??? setup.py
??? tests
    ??? module1
        ??? test_cython_foo.py
        ??? test_cpython_foo.py
Run Code Online (Sandbox Code Playgroud)

其中api.py进口cythonized扩展:

 """api.py""""
 from _cython_foo import cython_fun
Run Code Online (Sandbox Code Playgroud)

我的安装脚本.pyx正确地构建了源代码,我可以cython_fun在已安装的包中使用:

import project.module1.api as module1
module1.cython_fun()    # OK
Run Code Online (Sandbox Code Playgroud)

但是,pytest抱怨它无法导入 cython 模块,因为在我调用 setup.js 之前编译的二进制文件没有到位。

project/module1/api.py:2: in <module>
    from _cython_foo import cython_fun
E   ImportError: No module named _cython_foo
Run Code Online (Sandbox Code Playgroud)

在 pytest 所依赖的项目目录中留下一堆预编译的二进制文件似乎是一种糟糕的风格,那么是否有一种传统的方法可以让 pytest 临时构建 cython 模块,仅用于我的单元测试?

hoe*_*ing 5

我知道两种pytest与 cythonized 扩展结合的方法:

  1. 不要通过pytest直接调用测试;相反,使用带有安装脚本的就地测试命令。为此,请安装pytest-runner添加pytest命令的插件:

    $ pip install pytest-runner
    
    Run Code Online (Sandbox Code Playgroud)

    现在您应该能够pytest通过发出来调用测试

    $ python setup.py pytest
    
    Run Code Online (Sandbox Code Playgroud)

    但是,这种方法需要对命令行参数的传递方式进行一些更改:命令的挂件

    $ pytest --arg1 --arg2
    
    Run Code Online (Sandbox Code Playgroud)

    将会

    $ python setup.py pytest --addopts "--arg1 --arg2"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您想继续使用pytest命令:在开发模式下安装项目(理想情况下,在)。

    (myenv) $ pip install --editable dir/
    
    Run Code Online (Sandbox Code Playgroud)

    dir/包含setup.py脚本的目录在哪里。现在扩展将被预先构建并且pytest能够解决它们。