Java 在Python中测试时加载不同的资源

Java 在Python中测试时加载不同的资源,java,python,testing,resources,classpath,Java,Python,Testing,Resources,Classpath,首先让我把你们放在上下文中。我的主要背景是Java,两个月前我就开始使用Python。我不知道这种方法是错误的,因为我的Java背景和Python有不同的解决方案,还是只是技术上的无知问题 在Java中,通常有如下打包结构: project |___src |___main | |___java/MyClass.java | |___resources/properties.file | |_

首先让我把你们放在上下文中。我的主要背景是Java,两个月前我就开始使用Python。我不知道这种方法是错误的,因为我的Java背景和Python有不同的解决方案,还是只是技术上的无知问题

在Java中,通常有如下打包结构:

project
   |___src
        |___main
        |     |___java/MyClass.java
        |     |___resources/properties.file 
        |
        |___test 
              |___java/MyClassTest.java
              |___resources/properties.file 
因此,当您从测试(使用Maven或IDE)执行此操作时:

Maven或IDE在类路径中加载测试路径,使测试资源可用,而不是主包中的资源。 相反,当前一行作为main执行时,只有主路径中的资源被加载到类路径


我的问题是:Python中是否有任何机制来模拟此功能?根据执行路径,Python是否有其他方法来管理资源

不,Python不像Java那样具有可部署性(WAR、JAR等)。您将直接从源代码运行代码,因此,只需

在Java上下文中,部署时没有代码。因此,每个资源都应该打包在一个文件(或)中


如果您想在当前文件夹中查找该文件,请查看。

我对Python不太了解,但您问自己这个问题是对的 因为分离测试和应用程序代码是良好实践的一部分,以实现健壮/可靠的应用程序和测试

pytest
(一个已知的Python测试框架)文档以两种方式(从应用程序中分离测试代码和不分离测试代码)进行解释。
以下是引用隔离布局的零件:

选择测试布局/导入规则

pytest支持两种常见的测试布局:

在应用程序代码之外测试

将测试放在实际应用程序之外的额外目录中 如果您有许多功能测试或其他应用程序,那么代码可能很有用 希望将测试与实际应用程序代码分开的原因 (通常是个好主意):setup.py mypkg/ init.py app.py view.py 测验/ 测试应用程序py test_view.py ...

这样,您的测试可以轻松地针对已安装版本的运行 mypkg

请注意,使用此方案时,测试文件必须具有唯一的名称, 因为pytest将它们作为顶级模块导入,因为 没有要从中派生完整包名的包。换句话说 上述示例中的测试文件将作为test_应用程序和 test\通过向sys.path添加tests/来查看顶级模块

如果需要使用相同名称的测试模块,可以添加 init.py文件保存到测试文件夹和子文件夹中,并将其更改为packages:setup.py setup.py mypkg/ ... tests/ init.py foo/ init.py test_view.py bar/ init.py test_view.py mypkg/ ... 测验/ init.py 福/ init.py test_view.py 酒吧/ init.py test_view.py

现在pytest将以tests.foo.test_视图和 tests.bar.test_视图,允许使用相同名称的模块。 但是现在这引入了一个微妙的问题:为了加载测试 从tests目录中,pytest在 将repository添加到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 setup.py src/ mypkg/ init.py app.py view.py 测验/ init.py 福/ init.py test_view.py 酒吧/ init.py test_view.py此布局可防止许多常见陷阱,并具有许多好处,本文对此进行了更好的解释 Ionel Cristian Mărieș的优秀博客文章

我想这可能就是你要找的。它允许“模拟”外部功能,以严格限制测试对象

这可能意味着改变一些关于它的哲学。例如,如果要测试函数是否正确读取文件,文件名将作为参数传递给方法。在函数的单元测试中,从测试文件夹传入不同的文件名


在另一个测试
mock
中,执行对操作系统的
open
调用,以检查当文件不存在或无法打开时,或当您想要测试的任何其他错误行为时,方法是否按预期响应

我认为问题在于如何将应用程序源/资源与测试源/资源分开。打包与没有任何关系。很抱歉,但我实际上想知道是否有任何机制可以动态修改类路径(或者在Python中是等效的),这取决于代码是由测试运行还是作为“main”运行。您可以根据您的环境读取文件夹。我相信Python上不存在os类路径这个概念。@davidxxx,Java项目的文件夹结构反映了Java的打包方法。问题是Java和Java的区别Python@Victor不仅是包装。它更普遍地反映了构建,并且构建不仅仅是应用程序的打包。它可能是筛选资源、生成文档、执行测试等等。因此,您希望该类在测试时的行为与在没有测试框架的情况下运行时的行为有所不同吗?不完全是,我想要相同的行为。我只想从不同的文件夹加载文件,这取决于它是由测试运行还是作为“主”运行。我们已经考虑过这种解决方法,但是,由于其复杂性增加,我们认为可能存在另一种更简单的方法 setup.py mypkg/ ... tests/ init.py foo/ init.py test_view.py bar/ init.py test_view.py 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