I have a large set of Android Instrumentation (Espresso, Robotium, UI Automator) test cases spread over many different test classes.
After every test case in every test class has finished, I want to execute some piece of code.
Has anybody every tried this? Tipps are greatly appreciated!
Related
I want to write an Androidx test that starts an Application, waits for it to crash, and then starts it again.
As I understand it, by default, AndroidX tests run on a instrumentation, and when one test crashes, the entire instrumentation is brought down with it.To prevent one test from crashing the whole test suite, AndroidX includes an AndroidTestOrchestrator. This allows each test to run in its own instrumentation, so one test crashing only brings down the instrumentation it is in.
Given what I am trying to do, it looks like I will need to create my own AndroidTestOrchestrator to run a test with two instrumentations, one to run the Application crash, and then another to see that it is recovered from correctly.
How feasible is this?
Every time I want to do a quick test of some code, android studio takes 20-40 minutes loading an emulator which then either crashes my laptop or makes it run very slow. Is there any way to just use the system log without loading the whole app, similar to the System.out.Prinln() feature in net beans?
I understand that the question is about running your app for quick testing and not about automated tests. But you can learn a lot by trying to adapt writing tests, and they can help you to solve your problem.
1) For code without android dependencies you can write JUnit tests and run those just on JVM to test the code. Bonus: you'll start with creating your testsuite!
2) For code with android dependencies: a) Try to be better in separating platform specific code and internal logic so you will be able to cover more code with unit tests. b) You can use roboelectric and test everything without emulator/device for the rest.
In my project, one robolectric(v3.1.2) test is taking 30 seconds to run when executed from Android Studio. When profiled, much of the time is spent on :app:compile*JavaWithJavac task. This task is executed even when no change is made to the code. Is this the expected behaviour? Because roblectric test should be fast, and in our case its not serving the purpose.
So i recently started using Robotium for the first time and noticed after some time that they are Executed in an alphabetical order. This made some test not work, because i needed the "introduction" of my app to be finished and than start other tests.
Since i have never used Automated tests before, im not sure how to write the tests right now. Should all the test cases ALWAYS be independent from each other?
This would mean in my case, that the flag for the introduction should be set false for some tests and true for other tests programmatically.
Or is it also right to assume that one test case has been Executed before another one?
This is correct. You should always build tests so they can run independently. Also take note to ensure you have a rollback process after running your tests. Otherwise the next time they might not run.
There is a lot to consider when writing automated tests.
I would say yes. All tests should always be independent from each others. That way your sure that another test is not the reason for the failing test case.
I have a following problem with robotium. I have test package with few unittests for my app, this package also includes Robotium tests, the structure is simple as following:
\tests
\data
\datatests
\robotium
When I start test for only robotium package everything works fine, but when I start All tests in my test app robotium tests are failing as the wont initialize activity at all (not sure but no view is layouted, and I'm sure screen is active all the time), and log I get is only that View robotium was searching is not found.
I have no clue what causes it, so I would appreciate any help.
This can happen if there are unfinished activities from your tests. In all robotium tests your tearDown() method should call solo.finishOpenedActivities().