在哪里放置Android Instumentation测试数据

时间:2018-03-09 09:57:01

标签: android testing android-espresso android-instrumentation

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

作为一个开始,这是一个可以添加到build.gradle文件的脚本,可以复制某个文件夹中的文件并将它们放在设备中。

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

另外一点是这个脚本假设测试文件的目录  (在这里它是testFiles)只包含文件而不包含子目录。要处理子目录需要进行一些调整。

此外,该脚本将推送到所有连接的设备。因此,如果您在Android Studio中运行测试,那么您没有选择运行的设备也会获得这些文件。

最后,这个脚本将在构建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
    }
}

答案 1 :(得分:0)

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

只需创建正确的结构: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
}