安卓测试数据应该放在哪里?

5

我希望在自己的测试中使用大文件(包括2 GB以上的zip归档文件和视频文件),以测试从SD卡/内存中加载文件的功能。

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

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

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

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

你想读取每个文件吗?测试时是否有要求将此存档文件存储在SD卡上。 - Jitesh Mohite
为了更好地理解情况,您想在设备的内部存储中拥有大型文件,您的应用程序具有READ_STORAGE权限,并且您想测试应用程序加载这些大文件的能力。这准确无误吗? - ahasbini
我的测试设备是空白的 - 在每次测试运行之前将它们清除以获得定义状态。由于我有几个设备,我不想手动准备它们,必须自动化。但是,实际使用应用程序意味着从内部或外部存储读取大文件,因此应用程序具有“READ_STORAGE”权限。 - PhilLab
除了打开一个大的原始资源会抛出一些疯狂的异常之外,在 git 存储库中放置这样一个大文件真的很不方便。你想要在 CI 服务器上运行它吗? - M. Reza Nasirloo
2个回答

9
作为开始,这里有一个脚本可以添加到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
    }
}

@phillab,这个答案对您有帮助吗? - ahasbini

1

您可以将这些大文件作为测试资源包含 - 只需在您的测试结构中创建一个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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接