单元测试时断言的自引用

Self reference for assertions while unittesting

首先,假设标题为 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.txtactual_output.txt

最后,假设我想通过 python2 setup.py test.运行 unittest 模块。

如何在 a_function_test.py 中指定 actual_output.txtexpected_output.txt 的位置而不对它们的绝对文件路径进行硬编码(并因此阻止我的包的任何可转移性)?

考虑:

理论上我可以将 within-package 路径硬编码到两个输入文件中的每一个。但是,如果 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)

a_script.py 您可以像这样到达主要 mypackage

mypackage_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

或:

mypackage_dir = os.path.dirname(os.path.abspath(__package__))

那么,其他的路径就可以构建了,因为你知道分包的名字:

misc_dir = os.path.join(mypackage_dir, 'misc')
tests_dir = os.path.join(mypackage_dir, 'tests')