从 XML 文件读取的 Gradle 测试

Posted

技术标签:

【中文标题】从 XML 文件读取的 Gradle 测试【英文标题】:Gradle tests read from XML files 【发布时间】:2015-05-28 15:15:36 【问题描述】:

我的 junit4 测试用例从位于“src/myTest/java/data”目录下的主测试源文件夹下的 XML 文件中读取。

当我执行我的测试时,我得到了 file not found 异常,因为它不知道这个数据文件夹。包含这些 XML 文件的最佳方式是什么,以便在我执行测试时,gradle 能够获取这些数据文件的位置。

谢谢

更新

我将数据文件移动到资源目录,现在我可以在我的测试执行中指定我的资源目录。

task myTests(type: Test) 
    testClassesDir = sourceSets.myTests.output.classesDir
    classpath = sourceSets.myTests.runtimeClasspath + sourceSets.myTests.resources

但是当我编译我的测试时,它似乎没有将资源输出到“build/resources/myTests”中,我觉得这就是为什么我需要在类路径中指定资源文件夹以包含“sourceSets.myTests”。资源”,否则它会从构建路径中获取它。

sourceSets 
    myTests 
        java 
            compileClasspath += main.output + test.output
            runtimeClasspath += main.output + test.output
        
        resources 
            include "*.xml"
            output.resourcesDir 'build/resources/myTests'
        
    


task myTest(type: Test) 
    testClassesDir = sourceSets.myTests.output.classesDir
    classpath = sourceSets.myTests.runtimeClasspath + sourceSets.myTests.resources

【问题讨论】:

【参考方案1】:

你也可以试试这个

sourceSets 
    main 
        output.resourcesDir = ['src/test/resources', 'src/smokeTest/java/data']
    

【讨论】:

【参考方案2】:

Gradle 默认需要src/test/resources/ 的测试资源。如果你有像src/test/resources/data/pluto.xml这样的文件

ClassLoader classLoader = CommonResourceUtil.class.getClassLoader();
InputStream stream = classLoader.getResourceAsStream( "data/pluto.xml" );

可能有一种更简单的方法来获取ResourceAsStream。重点是 src/test/resources/ 位于测试的类路径中,因此您可以从那里使用相对路径。

我确信有更长的方法来配置 gradle 测试任务以将您自己的目录放在类路径中,但这会让每个人以后都想知道为什么它在那里,而不仅仅是在默认位置。我建议您将测试文件移至src/test/resources/ 并从那里解决。

【讨论】:

【参考方案3】:

默认情况下,gradle 假定您使用Apache Standard Directory Layout 组织了您的项目。此布局包含一个文件夹src/test/resources,当您执行测试时,其内容为put on the classpath。

因此,在测试中包含这些 xml 文件的最简单方法是遵循该布局并将它们放置在 src/test/resources 中。根据您配置构建的方式,src/smokeTest/resources 也可能有效。

然后您可以按照this 教程中的说明访问资源。基本上,访问此类文件的最简单方法如下(从教程中复制):

public InputStream getResourceAsStream(String name) 
  name = resolveName(name);
  ClassLoader cl = getClassLoader();
  if (cl==null) 
    return ClassLoader.getSystemResourceAsStream(name); // A system class.
  
  return cl.getResourceAsStream(name);


public java.net.URL getResource(String name) 
  name = resolveName(name);
  ClassLoader cl = getClassLoader();
  if (cl==null) 
    return ClassLoader.getSystemResource(name);  // A system class.
  
  return cl.getResource(name);

【讨论】:

以上是关于从 XML 文件读取的 Gradle 测试的主要内容,如果未能解决你的问题,请参考以下文章

java从xml读取数据更快还是从数据库里读取数据更快?

gradle 读取本地json文件

gradle 读取本地json文件

如何使用 Qt 从磁盘读取 XML 文件?

单元测试02

从服务器读取 XML 文件