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

时间:2018-04-05 16:38:21

标签: java python testing resources classpath

首先让我把你放在上下文中。我的主要背景是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是否有其他方法来管理资源,具体取决于执行路径?

3 个答案:

答案 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ş撰写的优秀博客文章。

     

https://docs.pytest.org/en/latest/goodpractices.html

答案 2 :(得分:0)

不,Python没有像Java那样可部署(WAR,JAR等......)。您将直接从源代码运行代码,因此只需read the file

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

如果要在当前文件夹中找到该文件,请查看this question