Android Studio单元测试:读取数据(输入)文件

Fra*_*ank 90 android unit-testing android-studio

在单元测试中,如何在我的(桌面)文件系统上读取json文件中的数据,而无需对路径进行硬编码?

我想从文件中读取测试输入(对于我的解析方法),而不是创建静态字符串.

该文件与我的单元测试代码位于同一位置,但如果需要,我也可以将其放在项目的其他位置.我正在使用Android Studio.

kli*_*mat 136

取决于android-gradle-plugin版本:

1. 1.5及更高版本:

只需将json文件放入src/test/resources/test.json并引用即可

classLoader.getResource("test.json"). 
Run Code Online (Sandbox Code Playgroud)

不需要进行gradle修改.

2.版本低于1.5 :(或由于某些原因上面的解决方案不起作用)

  1. 确保您至少使用Android Gradle Plugin 1.1版.点击链接正确设置Android Studio.

  2. 创建test目录.将单元测试类放在java目录中,并将资源文件放在res目录中.Android Studio应标记如下:

    在此输入图像描述

  3. 创建gradle任务以将资源复制到类目录中,使其可见classloader:

    android{
       ...
    }
    
    task copyResDirectoryToClasses(type: Copy){
        from "${projectDir}/src/test/res"
        into "${buildDir}/intermediates/classes/test/debug/res"
    }
    
    assembleDebug.dependsOn(copyResDirectoryToClasses)
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在您可以使用此方法获取File文件资源的引用:

    private static File getFileFromPath(Object obj, String fileName) {
        ClassLoader classLoader = obj.getClass().getClassLoader();
        URL resource = classLoader.getResource(fileName);
        return new File(resource.getPath());
    }
    
    @Test
    public void fileObjectShouldNotBeNull() throws Exception {
        File file = getFileFromPath(this, "res/test.json");
        assertThat(file, notNullValue());
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 在全班或特定测试方法上通过Ctrl+ Shift+ 运行单元测试F10.

  • 使用带有android插件1.5.0的AndroidStudio 1.5,将你的json文件放在`src/test/resources/test.json`中,并将其引用为`classLoader.getResource("test.json")`.不需要进行gradle修改.`resources`里面的嵌套文件夹也在工作. (18认同)
  • 答案不完整.什么是`classLoader`?在哪里放置这行代码?你能用退货结果做什么?请提供更完整的代码.-1 (5认同)
  • 这是一个很好的解决方案,但它始终不起作用.如果执行运行clean任务,然后运行testDebug则失败.基本上开发人员需要知道他必须在testDebug之前运行assembleDebug任务.你们有什么建议来改善这个吗? (4认同)
  • 要在Kotlin中读取`。/ src / test / resources / file.txt`:`TestClassName :: class.java.getResource(“ / file.txt”)!!。readText()` (3认同)

use*_*045 69

对于本地单元测试(与测试测试相比),您可以将文件放在其下src/test/resources并使用classLoader读取它们.例如,以下代码myFile.txt在资源目录中打开文件.

InputStream in = this.getClass().getClassLoader().getResourceAsStream("myFile.txt");
Run Code Online (Sandbox Code Playgroud)

它合作

  • Android Studio 1.5.1
  • gradle插件1.3.1

  • 当我从"src/test/res"更改为"src/test/resources"时,这对我有用.使用Android Studio 2.0 RC 3,gradle:2.0.0-rc3 (5认同)
  • kotlin:`val myFile = ClassLoader.getSystemResource(“ myFile.txt”)。readText()` (2认同)

ar-*_*r-g 12

就我而言,解决方案是添加到gradle文件中

sourceSets {
    test.resources.srcDirs += 'src/unitTests/resources'
  } 
Run Code Online (Sandbox Code Playgroud)

之后,AS 2.3.1发现了一切

javaClass.classLoader.getResourceAsStream("countries.txt")
Run Code Online (Sandbox Code Playgroud)

  • 我做了一些非常相似的事情(Kotlin):1. 在以下位置创建文件夹和文件:`root/app/src/test/resources/test.json` 2. 读取这样的数据:`val jsonFile = ClassLoader.getSystemResource("test. json").readText()` (4认同)

Rap*_*res 10

我想我应该在这里添加我的发现。我知道这有点旧,但是对于较新版本的 Gradle,其中没有 src/test/resources 目录,但整个项目只有一个资源目录,您必须将此行添加到您的 Gradle 文件中。

android {
   testOptions {
      unitTests {
         includeAndroidResources = true
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这样做,您可以通过以下方式访问您的资源:

 this.getClass().getClassLoader().getResourceAsStream(fileName);
Run Code Online (Sandbox Code Playgroud)

我一直在寻找这个并找不到答案,所以我决定在这里帮助其他人。


Lov*_*ove 8

我在Android Studio中遇到了很多测试资源问题,所以为了清晰起见,我设置了一些测试.在我的 mobile(Android应用程序)项目中,我添加了以下文件:

mobile/src/test/java/test/ResourceTest.java
mobile/src/test/resources/test.txt
mobile/src/test/resources/test/samePackage.txt
Run Code Online (Sandbox Code Playgroud)

测试类(所有测试通过):

assertTrue(getClass().getResource("test.txt") == null);
assertTrue(getClass().getResource("/test.txt").getPath().endsWith("test.txt"));
assertTrue(getClass().getResource("samePackage.txt").getPath().endsWith("test/samePackage.txt"));
assertTrue(getClass().getResource("/test/samePackage.txt").getPath().endsWith("test/samePackage.txt"));
assertTrue(getClass().getClassLoader().getResource("test.txt").getPath().endsWith("test.txt"));
assertTrue(getClass().getClassLoader().getResource("test/samePackage.txt").getPath().endsWith("test/samePackage.txt"));
Run Code Online (Sandbox Code Playgroud)

在同一个根项目中,我有一个名为Java(不是Android)的项目data.如果我将相同的文件添加到数据项目:

data/src/test/java/test/ResourceTest.java
data/src/test/resources/test.txt
data/src/test/resources/test/samePackage.txt
Run Code Online (Sandbox Code Playgroud)

如果我从Android Studio执行它们,那么上面的所有测试都将失败,但是它们会通过命令行传递./gradlew data:test.为了解决这个问题,我使用了这个hack(在Groovy中)

def resource(String path) {
    getClass().getResource(path) ?:
            // Hack to load test resources when executing tests from Android Studio
            new File(getClass().getClassLoader().getResource('.').path
                    .replace('/build/classes/test/', "/build/resources/test$path"))
}
Run Code Online (Sandbox Code Playgroud)

用法: resource('/test.txt')

Android Studio 2.3,Gradle 3.3


Nic*_*zzi 8

就我而言,我只需要在文件夹resources中创建文件夹test并将我的资源文件放入该文件夹中。然后,在测试中只需将文件加载为资源流:

val inputStream =
        this.javaClass.classLoader?.getResourceAsStream("gallery.xml")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

媒体参考:https://medium.com/mobile-app-development-publication/android-reading-a-text-file-during-test-2815671e8b3b


Mic*_*ele 7

实际上,这就是对我有用的仪器测试(运行 Android Studio 版本3.5.3、Android Gradle 插件版本3.5.3、Gradle 版本6.0.1):

  1. 将您的文件放入src/androidTest/assets文件夹中
  2. 在您的测试文件中:

InputStream is = InstrumentationRegistry.getInstrumentation().getContext().getAssets().open("filename.txt");

  • 这对于仪器测试来说效果很好。这在单元测试中对您有用吗(无仪器测试)? (2认同)

Tas*_*orf 6

如果您转到运行 - >编辑配置 - > JUnit,然后选择单元测试的运行配置,则会有一个"工作目录"设置.这应该指向你的json文件.请记住,这可能会破坏其他测试.