【问题标题】:Self reference for assertions while unittesting单元测试时断言的自我参考
【发布时间】: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.txtactual_output.txt

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

如何在a_function_test.py 中指定actual_output.txtexpected_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


    【解决方案1】:

    您可以从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')
    

    【讨论】:

    • 谢谢,但是os.path.abspath(__package__) 失败并显示AttributeError: 'NoneType' object has no attribute 'startswith'
    • 你的目录是python包吗?其中是否包含__init__.py。否则,它可能不起作用
    • 我只在mypackage/mypackage/ 中放置了一个__init__.py(参见编辑后的问题)。我应该将__init__.py 放入其他哪些子包中?
    • 要将所有包含.py 文件的目录转换为包和子包,您应该添加__init__.py。所以主要的mypackage 也应该有一个__init__.py 文件。
    • 好的,我将一个空的__init__.py 文件放入/mypackage/。但是,我仍然收到如下所示的错误消息 [注意:如果我在 package 前后加上两个下划线,markdown 会将单词呈现为粗体,因此拼写很奇怪]:base_path = os.path.abspath(_ _package_ _)File "/usr/lib/python2.7/posixpath.py", line 360, in abspath if not isabs(path): File "/usr/lib/python2.7/posixpath.py", line 54, in isabs return s.startswith('/') AttributeError: 'NoneType' object has no attribute 'startswith'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多