单元测试时断言的自引用
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.txt
和 actual_output.txt
最后,假设我想通过 python2 setup.py test
.运行 unittest 模块。
如何在 a_function_test.py
中指定 actual_output.txt
和 expected_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')
首先,假设标题为 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
的位置而不对它们的绝对文件路径进行硬编码(并因此阻止我的包的任何可转移性)?
考虑:
理论上我可以将 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')