将py.test与已编译的库代码一起使用

Tim*_*ann 11 python build pytest

我有一个python库,具有以下存储库结构:

repobase
 |- mylibrary
 |  |- __init__.py
 |- tests
    |- test_mylibrary.py
Run Code Online (Sandbox Code Playgroud)

到目前为止,运行测试可以通过调用py.testrepobase目录来完成.然后import mylibrarytest_mylibrary.py中使用repobase/mylibrary中的本地代码.

现在,我已经扩展了库以使用编译代码.因此,repobase/mylibrary的源代码本身不起作用.我必须做一个setup.py build.这将创建repobase/build/lib.linux-x86_64-2.7/mylibrary.

是否有合理的方法使py.test使用此目录导入mylibrary?鉴于这些限制:

  1. 我不想sys.pathtest_mylibrary.py中包含任何/ import魔法,因为这可能会破坏其他环境中的测试.

  2. 我不想放弃py.testrepobase运行的可能性.因此修改PYTHONPATH没有用,因为它.仍然是第一个sys.path.因此repobase/mylibraryrepobase/build/lib.linux-x86_64-2.7/mylibrary更受青睐.

如果没有,那么测试需要构建的python库的标准方法是什么?

Pet*_*ain 6

我认为你的问题只是py.test没有将构建的共享对象复制到存储库的根目录.

我只是尝试使用py.test测试C扩展,直接从Python wiki运行UT ,如下所示:

python setup.py build
py.test test/examp_unittest.py
Run Code Online (Sandbox Code Playgroud)

这失败了AssertionError: No module named examp.

但是,当我按照wiki到字母(并运行python setup.py test)时,我注意到它将它复制.so到根目录(注意它开始运行测试之前的最后一行):

running test
running egg_info
writing examp.egg-info/PKG-INFO
writing top-level names to examp.egg-info/top_level.txt
writing dependency_links to examp.egg-info/dependency_links.txt
reading manifest file 'examp.egg-info/SOURCES.txt'
writing manifest file 'examp.egg-info/SOURCES.txt'
running build_ext
copying build/lib.linux-x86_64-2.6/examp.so ->
runTest (test.examp_unittest.DeviceTest) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Run Code Online (Sandbox Code Playgroud)

在我的系统上运行它之后,我现在可以在相同的代码库上非常愉快地运行py.test - 如下所示.

============================= test session starts ==============================
platform linux2 -- Python 2.7.3, pytest-2.9.2, py-1.4.31, pluggy-0.3.1
rootdir: /tmp/sotest, inifile: 
collected 1 items 

test/examp_unittest.py .

=========================== 1 passed in 0.01 seconds ===========================
Run Code Online (Sandbox Code Playgroud)

因此,解决方案是将共享对象复制到存储库的根目录.

为了确保我从头开始运行整个事情,只需构建扩展,复制共享对象然后运行py.test.这一切都按预期工作.