./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':

https://android.googlesource.com/platform/tools/base/+/8d969614b7beca74e4d17f2d1c5956e75053f7ce/build-system/builder/src/main/java/com/android/builder/internal/testing/SimpleTestCallable.java

有人能把它拿出来吗?烦死大家了

根据此处的获奖作品...

...答案是写一个 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 的所有投诉:[__]。