I tried to look around about how to launch an automated test in multiple devices, but I couldn't really find what I was looking for.
I have like 5 tests per class and I want to execute just one test in all my connected devices, like a End to End test to login.
I tried to use connected device but it doesn't launch only the test I want...
I'm using Espresso, UIAutomator, Gradle and AndroidStudio.
How can I run that single test in my devices using these tools?
Use gradle connectedCheck command
You can find an example app here from google
https://github.com/googlesamples/android-testing-templates/tree/master/AndroidTestingBlueprint
There you can also read how to run the example tests on multiple devices from the command line / terminal, or from within Android Studio
You can also take a look at Spoon if you want to use an external tool plugin:
https://github.com/square/spoon
good luck
Related
On the Play Store and on Firebase Test Lab I can run automated tests without writing any scripts, they just go through the app and try stuff for a few minutes.
How can I run this kind of test either from the command line or from Android Studio? I have about 10 different phones I would like to run it on.
Thanks.
Edit: just to be clear, I'm asking about the automatic robot test, where I don't tell it anything, it just tries stuff.
There are 2 options :
You can record Robo tests through Android Studio. Crawler is part of Jetpack
https://developer.android.com/training/testing/crawler
You can run Monkey tests through command line. Monkey is part
https://developer.android.com/studio/test/monkey
I have created a cordova plugin which has an android implementation. This Java code has calls into an SDK that interfaces with specific hardware that the mobile device is connected to. I would like to write unit tests for my Java code and mock all the calls into the SDK so that I can run the tests during CI.
When looking into this, I found the cordova-plugin-test-framework, but from what I can tell, this is for tests that you would write against the javascript code, not the actual platform implementations. I'm sure I could use it and write some tests, but it would require the mobile device to be connected to the hardware, and I don't want to have actual calls into the SDK. In other words, I don't have a way of mocking the SDK calls using this.
I thought maybe I could just run JUnit from the command line with my Java code, but then I was getting errors because it couldn't find org.apache.cordova.CallbackContext. I tried faking my own object, but as I continued, I found more dependencies that my code in isolation just doesn't know about.
Next I figured it would be best to test it within the android project under /platforms in my ionic mobile app, since all the dependencies would be visible at that point. I'm able to run ./gradlew test (https://developer.android.com/studio/test/command-line.html) from here, but I can't figure out how to implement the test cases so that this call will pick them up. Is there some kind of config I can add so it knows where to look for tests? I'd be fine if there was just a certain place I had to put them.
I'm open to any options with this. I just want to be able to run JUnit test as part of our CI process.
In android I am working on JUNIT test cases which are working fine on emulator and device, but I just want to know that how I can run test case in the absence of emulator and device.
Is their any way to execute android test cases without using emulator and device?
Any reference link or point of information will be help full for me.
Thanks in advance.
If you have the newest version of Android Studio, it should allow you to run the junits without the emulator or device, so long as those junits are not dependent on having the emulator/device running.
It is important to put the junit test files in the app/src/test/java/[apk_package]/ folder, not the app/src/androidTest/java/[apk_package]/ folder! Putting it in the androidTest folder will force run the android emulator or device runner.
This is what Robolectric is designed for. In my limited use its quite good but be warned: they're in between major releases and accurate documentation is pretty sparse.
Why do you need to have an emulator or device plugged in for the testing to take place? Why can't I just generate coverage for my tests without the use of these?
It all depends on your Unit-Test.
If you're testing classes that dont use at all the Android Framework, and only the standard Java classes, then you could run the Unit test and get a code coverage (althouhg I don't have a step by step procedure to give you).
But if you're using any part of the Android Framework (that is, any class in an android.* or com.android.* package), then you'll need to run in a DalvikVM, meaning an Android emulator.
I have a Robolectric test project setup, but I'd like to also run these tests on my device to check that I don't get bit by JVM vs Dalvik implementation differences.
Unlike robolectric tests, I won't run these tests frequently. My concern is that there's little effort to maintain the test suite and that they verify actual device functionality.
What's the best way to do that?
What I've currently got:
My robolectric test project as a test case TestPackage. I created an Android Test project with a test case TestRoboOnAndroid. It creates a TestPackage and has a test for each test in TestPackage.
Right now, every time I add a test to my robolectric suite, I need to manually add it to my device suite. Is there some way to do that automatically with reflection?
Also, Robolectric uses JUnit 4 (by default) and Android uses JUnit 3. So I have to write all of my Robolectric tests using JUnit 3 style (importing from junit.framework instead of org.junit).
The whole point of Robolectric is NOT to run it on the device and the design is based on that. If you want to run something on the device look at the default instrumentation tests from the SDK or Robotium.
It is totally feasible to run your Robolectric tests on the JVM and in addition create Robotium tests that rely on device specific interaction (e.g. creating screenshots, hardware differences...) and run on devices and emulators all combined into one build.
The easiest way to do that is to use the Android Maven Plugin.
I use a tiered system, where I prefer earlier tiers where possible:
Pure unit tests. I try to make as much code as possible fully independent of Android APIs, and then use "pure" unit tests which can run on any JVM. These tests are the fastest, and it helps keep code that has no need to be Android-specific portable.
Robolectric-supported unit tests. Where my code has only small dependencies on Android APIs, that can be satisfied by Robolectric shadows, I test it with Robolectric. There is a little more setup time for Robolectric compared to pure tests, but it's still faster than starting/running on an emulator.
Android framework tests. Where Robolectric doesn't cut it - either because the shadows don't exist, or because I'm heavily using Android APIs (and therefore want to test against the Real Thing) - I write test that run on the emulator/device with the default framework.
The point of the tiers is to keep things as simple as possible, which keeps the full suite faster and helps promote cleaner code.
We use Robolectric for unit testing against the JVM and Calabash-Android for system testing against Dalvik. Both can be integrated into our Jenkins CI build and between the two tools I feel that we cover all the bases.