【发布时间】:2016-05-16 20:51:23
【问题描述】:
首先,假设标题为mypackage 的Python 包的目录结构如下,它遵循指南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/中。
第三,假设unittest模块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 的位置,而不用硬编码它们的绝对文件路径(因此,防止我的包的任何可转移性)?
考虑:
理论上,我可以将包内路径硬编码到两个输入文件中的每一个。但是,如果尚未安装到site-packages,Python 解释器如何知道去哪里寻找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)
【问题讨论】:
标签: python python-2.7 python-unittest self-reference