./gradlew test connectedAndroidTest 擦除我的 getFilesDir() 文件夹
./gradlew test connectedAndroidTest erases my getFilesDir() folder
我正在将 Room 数据库写入我的 getFilesDir() 文件夹。 (将数据库写入可移动 SD 卡显然需要一些主要研究!)
当我手动运行我的应用程序时,我想写一些记录并将它们留在数据库中,这样我就不需要再写了。当我 运行 我的测试时,我将数据库名称从“*.dat”切换为“_test.dat”(想想 Rails 上的 Ruby 或 Django 的 "environments" 系统)。测试免费删除记录。
当我在 Android Studio 中手动将每个测试用镊子夹到 运行 时,这个系统就可以工作了。但是当我 运行 批量处理所有内容时,在 gradlew
中,某些东西会删除数据库的“*.dat”版本。这意味着我必须不断地手动重新填充数据库,每次我手动测试时。
gradlew
中的什么正在擦除我的 getFilesDir() 文件夹的内容?以及如何(在不知道如何使用 "external" 存储)的情况下击败它?
代码示例可应要求提供,但它们都是通用的东西。切换到 getExternalFilesDir() 并不能解决问题。 Whosebug 说尝试 ./gradlew test connectedAndroidTest -x uninstallAndroidTest
,但没有 uninstallAndroidTest
任务。
顶层build.gradle
:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
tasks.withType(Test) {
testLogging {
exceptionFormat "full"
events "started", "skipped", "passed", "failed"
showStandardStreams true
}
}
app/build.gradle
:
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.allflat.planarinfinity"
minSdkVersion 26
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
// packagingOptions {
// exclude 'META-INF/DEPENDENCIES'
// exclude 'META-INF/LICENSE'
// exclude 'META-INF/LICENSE.txt'
// exclude 'META-INF/license.txt'
// exclude 'META-INF/NOTICE'
// exclude 'META-INF/NOTICE.txt'
// exclude 'META-INF/notice.txt'
// exclude 'META-INF/ASL2.0'
// exclude 'META-INF/INDEX.LIST'
// }
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.android.material:material:1.0.0'
testImplementation 'junit:junit:4.12'
// testImplementation 'org.mockito:mockito-core:2.19.0'
testImplementation 'androidx.arch.core:core-testing:2.1.0'
androidTestImplementation 'org.powermock:powermock-core:2.0.2'
androidTestImplementation 'org.powermock:powermock-module-junit4:2.0.2'
androidTestImplementation 'org.powermock:powermock-api-easymock:2.0.2'
androidTestImplementation 'androidx.test:core:1.2.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.2-alpha02'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0-alpha02'
androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:3.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0'
// androidTestImplementation 'androidx.test.platform.app:'
implementation 'androidx.room:room-runtime:2.2.0'
annotationProcessor 'androidx.room:room-compiler:2.2.0'
testImplementation 'androidx.test:core:1.2.0'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'
androidTestImplementation 'org.easymock:easymock:4.0.2'
// androidTestImplementation 'org.mockito:mockito-core:2.19.0'
}
这里是 'uninstall':
有人能把它拿出来吗?烦死大家了
根据此处的获奖作品...
...答案是写一个 Rakefile
包含:
task default: [ :unit_test_and_install, :espresso_test ]
task :unit_test_and_install do
sh './gradlew --console=verbose test installDebug installDebugAndroidTest'
end
devices = `adb devices`
serial_numbers = devices.split("\n")[1..-1].map{|q| q.split("\t")[0] }
task :espresso_test do
threads = serial_numbers.map do |sn|
Thread.new do
sh "adb -s #{sn} shell am instrument -w -r -e package com.mycorp.myapp -e disableAnalytics true " +
"com.mycorp.myapp.test/androidx.test.runner.AndroidJUnitRunner | tee #{sn}.txt"
end
end
threads.each &:join
serial_numbers.each do |sn|
grop = `grep "^OK .*tests" #{sn}.txt`
if grop == ''
sh "cat #{sn}.txt"
abort 'FAILURES on ' + sn
end
end
end
然后输入$ rake
即可。所有测试运行,而我的手动测试数据和配置都在。
我们需要 Ruby Rakefile
,而不是 Makefile
,因为我们需要处理输出并查找错误以成功 return 0 或 1 到环境。但是 adb etc
不符合规则 "test faults are syntax errors," 并且在错误时没有传播正确的退出值。我希望我的命令行异常终止而不是提交损坏的代码,所以我们将测试输出存储到 SERIALNUMBER.txt 文件中,然后是 grep
它们。
而且我们需要线程,所以很多设备可以同时测试而不用互相等待。
正确的检测错误,可以整合成一行,$ rake && git commit -am 'the same comment every time' && git push
。如果有任何错误,它们会显示在控制台上,并且 git commit
不会发生。
并且我们需要Makefile
式处理,因为如果任何命令失败我们需要停止处理,遵循规则"test faults are syntax errors."
(一个新错误出现在 Espresso 测试故障时,我们不再收到消息说 HTML 输出文件在哪里,但因为错误本身就在喷涌中,所以这不是什么大问题。)
另一个错误:如果我通过 USB 调试连接了两台平板电脑,我会得到 error: more than one device/emulator
,这完全是假的,因为 ./gradlew test connectedAndroidTest
在所有设备上自然都能正常工作...这就是为什么 Rakefile
必须找到所有设备,然后将 adb shell -s
分配给每个设备。
请在此处写下关于使用低级 Rakefile
调用 gradlew
的所有投诉:[__]。
我正在将 Room 数据库写入我的 getFilesDir() 文件夹。 (将数据库写入可移动 SD 卡显然需要一些主要研究!)
当我手动运行我的应用程序时,我想写一些记录并将它们留在数据库中,这样我就不需要再写了。当我 运行 我的测试时,我将数据库名称从“*.dat”切换为“_test.dat”(想想 Rails 上的 Ruby 或 Django 的 "environments" 系统)。测试免费删除记录。
当我在 Android Studio 中手动将每个测试用镊子夹到 运行 时,这个系统就可以工作了。但是当我 运行 批量处理所有内容时,在 gradlew
中,某些东西会删除数据库的“*.dat”版本。这意味着我必须不断地手动重新填充数据库,每次我手动测试时。
gradlew
中的什么正在擦除我的 getFilesDir() 文件夹的内容?以及如何(在不知道如何使用 "external" 存储)的情况下击败它?
代码示例可应要求提供,但它们都是通用的东西。切换到 getExternalFilesDir() 并不能解决问题。 Whosebug 说尝试 ./gradlew test connectedAndroidTest -x uninstallAndroidTest
,但没有 uninstallAndroidTest
任务。
顶层build.gradle
:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
tasks.withType(Test) {
testLogging {
exceptionFormat "full"
events "started", "skipped", "passed", "failed"
showStandardStreams true
}
}
app/build.gradle
:
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.allflat.planarinfinity"
minSdkVersion 26
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
// packagingOptions {
// exclude 'META-INF/DEPENDENCIES'
// exclude 'META-INF/LICENSE'
// exclude 'META-INF/LICENSE.txt'
// exclude 'META-INF/license.txt'
// exclude 'META-INF/NOTICE'
// exclude 'META-INF/NOTICE.txt'
// exclude 'META-INF/notice.txt'
// exclude 'META-INF/ASL2.0'
// exclude 'META-INF/INDEX.LIST'
// }
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.android.material:material:1.0.0'
testImplementation 'junit:junit:4.12'
// testImplementation 'org.mockito:mockito-core:2.19.0'
testImplementation 'androidx.arch.core:core-testing:2.1.0'
androidTestImplementation 'org.powermock:powermock-core:2.0.2'
androidTestImplementation 'org.powermock:powermock-module-junit4:2.0.2'
androidTestImplementation 'org.powermock:powermock-api-easymock:2.0.2'
androidTestImplementation 'androidx.test:core:1.2.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.2-alpha02'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0-alpha02'
androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:3.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0'
// androidTestImplementation 'androidx.test.platform.app:'
implementation 'androidx.room:room-runtime:2.2.0'
annotationProcessor 'androidx.room:room-compiler:2.2.0'
testImplementation 'androidx.test:core:1.2.0'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test:rules:1.0.2'
androidTestImplementation 'org.easymock:easymock:4.0.2'
// androidTestImplementation 'org.mockito:mockito-core:2.19.0'
}
这里是 'uninstall':
有人能把它拿出来吗?烦死大家了
根据此处的获奖作品...
...答案是写一个 Rakefile
包含:
task default: [ :unit_test_and_install, :espresso_test ]
task :unit_test_and_install do
sh './gradlew --console=verbose test installDebug installDebugAndroidTest'
end
devices = `adb devices`
serial_numbers = devices.split("\n")[1..-1].map{|q| q.split("\t")[0] }
task :espresso_test do
threads = serial_numbers.map do |sn|
Thread.new do
sh "adb -s #{sn} shell am instrument -w -r -e package com.mycorp.myapp -e disableAnalytics true " +
"com.mycorp.myapp.test/androidx.test.runner.AndroidJUnitRunner | tee #{sn}.txt"
end
end
threads.each &:join
serial_numbers.each do |sn|
grop = `grep "^OK .*tests" #{sn}.txt`
if grop == ''
sh "cat #{sn}.txt"
abort 'FAILURES on ' + sn
end
end
end
然后输入$ rake
即可。所有测试运行,而我的手动测试数据和配置都在。
我们需要 Ruby Rakefile
,而不是 Makefile
,因为我们需要处理输出并查找错误以成功 return 0 或 1 到环境。但是 adb etc
不符合规则 "test faults are syntax errors," 并且在错误时没有传播正确的退出值。我希望我的命令行异常终止而不是提交损坏的代码,所以我们将测试输出存储到 SERIALNUMBER.txt 文件中,然后是 grep
它们。
而且我们需要线程,所以很多设备可以同时测试而不用互相等待。
正确的检测错误,可以整合成一行,$ rake && git commit -am 'the same comment every time' && git push
。如果有任何错误,它们会显示在控制台上,并且 git commit
不会发生。
并且我们需要Makefile
式处理,因为如果任何命令失败我们需要停止处理,遵循规则"test faults are syntax errors."
(一个新错误出现在 Espresso 测试故障时,我们不再收到消息说 HTML 输出文件在哪里,但因为错误本身就在喷涌中,所以这不是什么大问题。)
另一个错误:如果我通过 USB 调试连接了两台平板电脑,我会得到 error: more than one device/emulator
,这完全是假的,因为 ./gradlew test connectedAndroidTest
在所有设备上自然都能正常工作...这就是为什么 Rakefile
必须找到所有设备,然后将 adb shell -s
分配给每个设备。
请在此处写下关于使用低级 Rakefile
调用 gradlew
的所有投诉:[__]。