我想在我的测试测试中使用大文件(> 2 GB zip档案以及视频文件)来测试SD卡/内部存储的文件加载。
如何编写这些仪器测试并为其配备所需的文件?对于其他测试,我只需要非常小的文件,因此我将它们放在应用程序的原始资源中
InputStream rStream = context.getResources().openRawResource(R.raw.smalltestvideo);
但是现在我需要专门测试不再是这个选项的大型文件。我正在运行
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
答案 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
}