Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Gradle Running Tests on Non-Debug Builds

I have a project with three different build types: debug, beta, and release. My test package is always created for debug builds, but QA uses the beta build and we want QA to run these tests on their vast array of devices.

I'm trying to create a testing apk for QA that is signed by the same key as the beta build. Looking through the Android-Gradle documentation, I don't see anything telling me that I can't do this, but I don't see anyway to configure this. Is there anyway I can configure which keystore is used when assembling a test apk? Or is there a way to create an unsigned test apk?

like image 276
Maxwell Avatar asked May 28 '14 22:05

Maxwell


People also ask

Does Gradle build also run tests?

By default, Gradle will run all tests that it detects, which it does by inspecting the compiled test classes. This detection uses different criteria depending on the test framework used. For JUnit, Gradle scans for both JUnit 3 and 4 test classes.

How do I run a specific test in gradle?

You can do gradle -Dtest. single=ClassUnderTestTest test if you want to test single class or use regexp like gradle -Dtest. single=ClassName*Test test you can find more examples of filtering classes for tests under this link.

How do I skip a test in Gradle build?

To skip any task from the Gradle build, we can use the -x or –exclude-task option. In this case, we'll use “-x test” to skip tests from the build.

How run all test cases in Android?

Run all tests in a single class The default keyboard shortcut for this is Ctrl+Shift+F10 on Linux.


3 Answers

You can now point this to a different target, I don't know when this happened, but from the docs:

Currently only one Build Type is tested. By default it is the debug Build Type, but this can be reconfigured with:

android {
    ...
    testBuildType "staging" 
}
like image 179
JRaymond Avatar answered Sep 29 '22 17:09

JRaymond


This is an incomplete answer to your question in that it documents what you can't do, but the connectedAndroidTest task, which is what runs the androidTest tests in your project, is hardcoded to run against the debug build type, and I don't see a way to point it at a different build type.

Taking the advice from Is there a way to list task dependencies in Gradle? and examining the task dependency tree, if you run:

./gradlew tasks --all

you get this in your output:

Verification tasks
------------------
app:check - Runs all checks. [app:lint]
app:connectedAndroidTest - Installs and runs the tests for Build 'debug' on connected devices. [app:assembleDebug, app:assembleDebugTest]
app:connectedCheck - Runs all device checks on currently connected devices. [app:connectedAndroidTest]
app:deviceCheck - Runs all device checks using Device Providers and Test Servers.

The documentation for the connectedAndroidTest task claims it runs tests against debug, and the task dependencies (which you see with the -all flag) confirm that the task depends on assembleDebug.

Adding additional build types and flavors doesn't seem to affect the dependency on the built-in debug type.

It's possible that with greater Gradle-fu than mine, you could rewire the tasks to make the tests depend on a different build type, but doing this is likely to be fragile since it's bound to depend on things that aren't supported API in the Android Gradle plugin.

To answer your question most directly, though, if all you want is to run tests against a build with a different certificate, you could change the signing config on your debug build to use the beta certificate:

android {
    signingConfigs {
        beta {
            keyAlias 'key'
            keyPassword 'password'
            storeFile file('/path/to/beta_keystore.jks')
            storePassword 'password'
        }
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.beta
        }
        beta {
            signingConfig signingConfigs.beta
        }
    }
}

I tested it and I am able to run androidTest targets against debug builds that use a custom keystore in this way. However, I doubt this solves your problem, because I suspect you want to run your tests against the beta build, not a debug build with the beta certificate.

like image 39
Scott Barta Avatar answered Sep 29 '22 18:09

Scott Barta


To add a testing source set for your build variant, follow these steps:

  • In the Project window on the left, click the drop-down menu and select the Project view.
  • Within the appropriate module folder, right-click the src folder and click New > Directory.
  • For the directory name, enter "androidTestVariantName." For example, if you have a build variant called "MyFlavor" then the directory name shoulbe "androidTestMyFlavor." Then click OK.
  • Right-click on the new directory and click New > Directory. Enter "java" as the directory name, and then click OK.

Now you can add tests to this new source set by following the steps above to add a new test. When you reach the Choose Destination Directory dialog, select the new variant test source set.

The instrumented tests in src/androidTest/ source set are shared by all build variants. When building a test APK for the "MyFlavor" variant of your app, Gradle combines both the src/androidTest/ and src/androidTestMyFlavor/ source sets.

Another way is to put following line your in default config.

Currently only one Build Type is tested. By default it is the debug Build Type, but this can be reconfigured with:

android {
    ...
    testBuildType "staging"
}
like image 33
Anudeep Samaiya Avatar answered Sep 29 '22 17:09

Anudeep Samaiya