使用doctests导入Python项目

我有一个具有以下目录结构的
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导入

点赞