Android 仪器测试数据放在哪里

Where to put Android Instumentation test data

我想在我的仪器测试中使用大文件(> 2 GB 的 zip 存档和视频文件)来测试从 SD 卡/内部存储加载文件。

如何编写这些仪器测试并为它们配备所需的文件?对于其他测试,我只需要非常小的文件,所以我将它们放在应用程序的原始资源中

InputStream rStream = context.getResources().openRawResource(R.raw.smalltestvideo);

但现在我需要专门测试大文件,这不再是一个选项。我是 运行

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

这里有一个脚本,可以添加到 build.gradle 文件并执行从特定文件夹复制文件并将它们放入设备中的工作。

我确实想指出 @m-reza-nasirloo 关于将这些文件存储在回购协议中有一点,因此在设计适当的测试时必须考虑到这一点,同时拥有一个可维护的小型回购协议CI 服务器或队友可以轻松下载克隆。通过下面的脚本,可以将测试文件放在项目根目录之外,实现这几点。

还有一点是这个脚本假定测试文件的目录 (这里是 testFiles)只包含文件而不是 sub-directories。要处理 sub-directories 需要更多调整。

此外,脚本将推送到所有连接的设备。因此,如果您 运行 从 Android Studio 中进行测试,您没有 select 到 运行 的设备也会获取文件。

最后,此脚本将在构建 android 测试时执行,特别是当 gradle 正在执行 assembleDebugAndroidTest 或类似任务时。要更改它,只需根据需要修改 if 条件。

import com.android.ddmlib.AndroidDebugBridge

task pushFilesToDevices {
    def location = "${project.rootDir}/../testFiles/"
    def files = new File(location).listFiles()
    AndroidDebugBridge.initIfNeeded(false)
    def bridge = AndroidDebugBridge.createBridge(android.adbExecutable.path, false)
    doLast {
        bridge.devices.each { device ->
            println "pushing files to ${device.name}"
            files.each { file ->
                device.pushFile(file.absolutePath, "/sdcard/${file.name}")
            }
            println "finished pushing"
        }
    }
}

tasks.whenTaskAdded { taskItem ->
    if (taskItem.name.contains("assemble") && taskItem.name.endsWith("AndroidTest")) {
        taskItem.dependsOn pushFilesToDevices
    }
}

您可以将这些大文件包含为测试资产 - 只需在您的仪器测试结构中创建一个资产目录。编译您的应用时,这些将被排除(测试除外)。

只需创建正确的结构:src/androidTest/assets

可能还需要在您的模块中注册它gradle:

androidTest {
    assets.srcDirs = ['src/main/assets', 'src/androidTest/assets/']
    java.srcDirs = ['src/main/java', 'src/androidTest/java'] //you probably already have this
}