首先,假设一个Python包标题mypackage
,它遵循导向How To Package Your Python Code的指示的目录结构如下:自参考而单元测试
mypackage/
mypackage/mypackage/
mypackage/mypackage/__init__.py
mypackage/mypackage/a_function.py
mypackage/scripts/
mypackage/scripts/a_script.py
mypackage/tests/
mypackage/tests/a_function_test.py
mypackage/misc/
mypackage/misc/input.txt
# mypackage/misc/actual_output.txt ## Not yet generated!
mypackage/misc/expected_output.txt
mypackage/setup.py
其次,假定脚本a_script.py
进口a_function.py
,读取文件input.txt
,操纵input.txt
的内容并将后者保存为actual_output.txt
到mypackage/misc/
。
第三,假设单元测试模块mypackage/misc/
包含测试功能,通过self.assertMultiLineEqual(expected, actual)
比较expected_output.txt
到actual_output.txt
。
最后,假设我想通过python2 setup.py test
运行unittest模块。
如何指定没有硬编码的绝对文件路径(和,因此,防止我的包的任何转让)的a_function_test.py
actual_output.txt
和expected_output.txt
位置?
代价:
我理论上可以硬编码内包路径每两个输入文件的。但是,如果Python解释器尚未安装到site-packages
,它如何知道在哪里寻找mypackage
?我有以下想法,但它不能作为mypackage
还不知道:
base_path = os.path.split(inspect.getfile(mypackage))[0]
within_path = mypackage/misc/
expected = open(base_path + within_path + expected_output.txt).read()
actual = open(base_path + within_path + actual_output.txt).read()
self.assertMultiLineEqual(expected, actual)
谢谢,但'os.path.abspath(__ package __)'失败,出现'AttributeError:'NoneType'对象没有属性'startswith''。 –
你的目录是python包吗?是否有包含在其中的'__init __。py'。否则,它可能不起作用 –
我只在'mypackage/mypackage /'中放置了一个'__init __。py'(参见编辑的问题)。哪些其他子包应该放置一个'__init __。py'到? –