我有一个具有以下目录结构的
Python项目:
/(some files) /model/(python files) /tools/(more python files) ...
所以,我在几个子目录中有Python文件,还有一些
目录之间的依赖关系:工具由模型等使用.现在
我的问题是我想为模型和工具制作doctests,
我希望能够从命令行运行测试,如:./ model / car.py.
我可以使这个工作,但只有凌乱的样板代码.我想要
知道什么是正确的方法,或者有什么?
问题:我应该如何写我的进口产品?
感谢名单.这是一个例子……
tools / tool.py的内容:
#!/usr/bin/env python
"""
>>> is_four(21)
False
>>> is_four(4)
True
"""
def is_four(val):
return val == 4
if __name__ == '__main__':
import doctest
doctest.testmod()
…和model / car.py:
#!/usr/bin/env python
"""
>>> car = Car()
>>> car.ok()
True
"""
from tools.tool import *
class Car(object):
def __init__(self):
self.tire_count = 4
def ok(self):
return is_four(self.tire_count)
if __name__ == '__main__':
import doctest
doctest.testmod()
通过在car.py的开头添加以下行,它可以工作,但看起来不太好. 🙁
if __name__ == '__main__':
import sys
import os
sys.path.append(os.path.abspath(os.path.dirname('..')))
最佳答案 你要做的是相对导入.它在Python中运行良好,但在模块级别,而不是在文件系统级别.我知道,这很令人困惑.
这意味着如果在子目录中运行脚本,则它不会看到上层目录,因为对于正在运行的脚本,模块的根目录是当前目录:没有上层模块.
那么相对进口是什么?
那么,只要它们是从上层导入的,就可以在上层的子车中导入模块中的模块.
在您的情况下,这意味着您必须从“/”运行脚本,以便它成为模块的根,并允许子模块使用相对导入.
解决问题的可能方法是删除if __name__ ==“__ main__”块并创建/tests.py:
import doctest
from model import car
from tools import tool
doctest.testmod(car)
doctest.testmod(tool)
然后运行也启动所有测试.
最终,您需要自动化该过程,一个简单的解决方案是使用unittest,这样您就可以创建测试套件并只添加您要测试的模块名称:
import unittest
import doctest
modules = ("model.car",
"tools.tool")
suite = unittest.TestSuite()
for mod in modules:
suite.addTest(doctest.DocTestSuite(mod))
runner = unittest.TextTestRunner()
runner.run(suite)
另一种解决方案(推荐)是使用诸如nose之类的工具为您自动执行此操作.
easy_install nose
nosetests --with-doctest # done :-)
顺便说一句,避免从x import *.这适用于快速脚本,但是当程序增长时,您确实需要明确命名导入的内容.导入x或从x import y导入