我目前的项目中有以下目录结构:
Project/
project/
__init__.py
classifier.py
util.py
lib/
__init__.py
scraper.py
tests/
test_classifier.py
test_util.py
我试图在tests/
目录中的Project/
目录中运行测试,但目前无法执行此操作。原因是我的每个测试Python文件的第一行如下:
from project import Event, EventClassifier
因此我无法使用以下内容调用测试文件:
python project/tests/test_util.py
有人有解决方案吗?我认为这是一个非常常见的问题,因为Python约定是将测试目录包含在主包中。
答案 0 :(得分:0)
我为我的项目使用基于setuptools的setup.py,感谢python setup.py develop
我可以"安装"例如在没有源代码副本的virtualenv中,但是我的项目的一个egg-link。因此,导入工作,并在开发过程中立即生效。
虽然测试是在你的主程序包中,但我会挑战你的断言。我将它放在project
级别的外面。这样可以实现更简单的打包,因为我部署的软件包不应包含测试。
以下setup.py说明了这个概念:
import os
import sys
from setuptools import setup, find_packages
test_requirements = ["nose", "coverage"]
# THIS IS JUST FOR ILLUSTRATING THE IDEA
base = os.path.dirname(__file__)
project = os.path.join(base, "project")
tests = os.path.join(base, "tests")
if not os.path.exists(project):
os.mkdir(project)
with open(os.path.join(project, "__init__.py"), "wb") as outf:
outf.write("""
def magic():
print "It's magic!"
""")
os.mkdir(tests)
with open(os.path.join(tests, "project_tests.py"), "wb") as outf:
outf.write("""
import unittest
import project
class ProjectTests(unittest.TestCase):
def test_magic(self):
project.magic()
""")
# END: THIS IS JUST FOR ILLUSTRATING THE IDEA
setup(
name="test.project",
version="1.0",
description="Simple test-project",
author="Diez B. Roggisch",
author_email="my@email.com",
license="MIT",
install_requires=[
"requests",
],
extras_require=dict(
test=test_requirements,
),
packages=find_packages(exclude=['ez_setup', 'tests']),
zip_safe=True,
entry_points={
"console_scripts" : [
"test-commandline = project:magic",
],
},
)
创建virtualenv并激活它,然后在项目内运行python setup.py develop
。这应该设置一个小样本项目(显然你需要删除该部分),创建一个控制台脚本和一个可以使用nosetestes tests -s
运行的测试用例。