首先让我把你放在上下文中。我的主要背景是Java,我从2个月前开始使用Python。我不知道由于我的Java背景和Python而导致的方法是否有问题,或者它只是一个技术上的无知问题。
在Java中,您通常会有一个包装结构,如:
project
|___src
|___main
| |___java/MyClass.java
| |___resources/properties.file
|
|___test
|___java/MyClassTest.java
|___resources/properties.file
因此,当您从测试(使用Maven或IDE)执行此操作时:
this.getClass().getResourceAsStream(resourcePath);
Maven或IDE在类路径中加载测试路径,使测试资源可用而不是主程序包中的测试资源。 相反,当前一行作为main执行时,只有主路径中的资源被加载到类路径中。
我的问题是:Python中是否有任何机制来模拟此功能? Python是否有其他方法来管理资源,具体取决于执行路径?
答案 0 :(得分:2)
我认为mock可能就是你要找的东西。它允许“模拟”外部功能,将测试严格限制在被测单元。
这可能意味着改变其中一些哲学。例如,如果要测试函数是否正确读取文件,则文件名将作为参数传递给方法。在函数的单元测试中,从测试文件夹中传入不同的文件名。
在另一个测试mock
中,open
调用os来检查当文件不存在,或者无法打开时,或者您想要的任何其他错误行为时,方法会按预期响应测试。
答案 1 :(得分:1)
我不太了解Python,但你问自己这个问题是对的 分离测试和应用程序代码是良好实践的一部分,可以提供强大/可靠的应用程序和测试。
pytest
(一个已知的Python测试框架)文档在its best practice guide中解释了两种方式(分离而不是将测试代码与应用程序分开)。
以下是引用隔离布局的部分:
选择测试布局/导入规则
pytest支持两种常见的测试布局:
在应用程序代码外测试
将测试放入实际应用程序之外的额外目录中 如果您有许多功能测试或其他功能,代码可能会有用 原因是希望将测试与实际应用程序代码分开 (通常是一个好主意):
setup.py mypkg/ init.py app.py view.py tests/ test_app.py test_view.py ...
通过这种方式,您的测试可以轻松地针对已安装的版本运行 MYPKG。
请注意,使用此方案,您的测试文件必须具有唯一的名称, 因为pytest会将它们作为顶层模块导入 没有包来从中获取完整的包名。换句话说, 上面示例中的测试文件将作为test_app导入 通过将测试/添加到sys.path来测试顶级模块。
如果您需要具有相同名称的测试模块,则可以添加 init .py文件到您的测试文件夹和子文件夹,将其更改为包:
setup.py mypkg/ ... tests/ init.py foo/ init.py test_view.py bar/ init.py test_view.py
现在pytest会将模块加载为tests.foo.test_view和 tests.bar.test_view,允许您拥有相同名称的模块。 但现在这引入了一个微妙的问题:为了加载测试 来自tests目录的模块,pytest prepend的根 存储库到sys.path,它增加了现在mypkg的副作用 也是可进口的。如果您使用像tox这样的工具,则会出现问题 在虚拟环境中测试您的包,因为您想要 测试您的软件包的已安装版本,而不是本地代码 存储库。
在这种情况下,强烈建议使用src布局 应用程序根包位于根目录的子目录中:
setup.py src/ mypkg/ init.py app.py view.py tests/ init.py foo/ init.py test_view.py bar/ init.py test_view.py这种布局可以防止很多常见的陷阱,并且有许多好处,这在这里有更好的解释 由IonelCristianMărieş撰写的优秀博客文章。
答案 2 :(得分:0)
不,Python没有像Java那样可部署(WAR,JAR等......)。您将直接从源代码运行代码,因此只需read the file。
在Java上下文中,部署时没有代码。因此,每个资源都应该包含在文件(JAR或WAR)中。
如果要在当前文件夹中找到该文件,请查看this question。