I'm attempting to add some test automation to my XF app, but I'm having some difficulty as I've never used Appium before so I'm hoping that someone with experience may be able to help with my issues.
When I'm setting up my tests - if I set the "automationName" to be "UiAutomator2", then I can launch my app without problems and interact with the UI fine.
I need to do some tests with specific methods inside my app, but Appium only allows interaction with the UI. Doing some searching, I found that Appium contains an Espresso driver which is supposed to allow interaction with specific methods (this sounds exactly what I'm after).
The suggestion is to change the "automationName" from "UiAutomator2" to "Espresso" - the example I was going through in the Appium documentation was a simple test that just launched the app. It suggested that just by changing this setting, that the same test would work regardless.
I have created a simple test that just launches my app - this works fine with "UiAutomator2" but as soon as I change to "Espresso", my app doesn't launch.
The Appium server mentions not being able to find the signed .apk.
According to the documentation, this should all be working fine but as it isn't I'm guessing that there's something else that I need to do so I'm hoping that someone with experience with this will be able to help me get the tests to work.
I don't know whether I need to add a reference to Espresso somewhere in my XF app or if I need to build the .apk in a special way that will make it work.
Any advice or help on this matter would be grateful.
IMHO there are better options to achieve what you want. I'd always test the methods that are not platform specific separately, e.g. with with NUnit. You can run Unit- and Integration-Tests created with NUnit with the NUnit GUI or ReSharper if you've got a license. Unless you are using very exotic functions (or relying on timings, etc.) this should work well across all platforms.
If you are not sure that your methods will behave the same across all platforms (better to be sure), I'd create a separate App that runs tests on those methods on an actual device. There is a runner for NUnit-Tests for Xamarin.Forms, you could use for this purpose. The last release is from 2017, but I'd give it a shot. This way you can make sure that your methods work as intended, but avoid having to access them via a framework that is aimed at UI-tests.
Related
Should I be using the test classes on Android Studio for my small application?
What can unit testing tell me that I can't already see in logs when I run the App? Can you give an example of something I should test by writing testing code rather than just manually testing stuff on my device?
Well, by using for instance JUnit you can test for much more cases (especially edge cases since you are able to use dummy data for the tests).
You can also test much more efficient. Let's assume you've manually tested for 30 minutes. If you change some small detail you would essentially need to test for another 30 minutes to make sure that the change didn't influence the other components.
But let's say you are using UnitTesting. Well, after changing some small detail you just run the test again and the outcome should be the same.
If you plan to release the app I would definetly make use of the test classes.
Take a look at this article for more details: https://www.seguetech.com/why-mobile-application-testing-important/
I have an Android app which I am starting to run functional tests with. I'm currently looking at using Calabash and Cucumber style tests written in Ruby. What I'm looking for is a good way to mock out the backend when running these tests, so I can control the responses, and set up tests for various scenarios (i.e set up things for the happy path as well as various error paths that might occur). It'd also be nice if this could work whether running in emulator, Genymotion, or through a device that is connected, but if it will only work on one of the first two, that'd be fine.
If I could get the setup and tear down of this solution integrated into my Gradle build scripts, that'd be fantastic.
I have seen others use Factory Girl for mocking backend. You can see the readme at http://rubydoc.info/gems/factory_girl/file/GETTING_STARTED.md
Or you could have a look at http://mock-server.com/ and see if that could help you out.
Is there any chance to take a snapshot from Android native camera from your own app, and avoid INJECT_EVENTS Security Exception.
Advise something, please.
P.S I use Robotium and failed to do that
Robotium is based on instrumentation which was designed to test just one activity, if I'm not wrong. Robotium is just a wrapper for instrumentation itself and provides a lot of useful methods. The issue is that instrumentation is bind strictly to target application and you cannot invoke anything for another context. Basically writing, if you leave your target application - press back, open another application like camera you are out of the target context and you cannot do anything. Sending any mouse events ends up with security exceptions etc.
There are other frameworks designed for cross application testing.
First of all there is monkey runner, which uses jython (everything the worst from python and java put together). The issue is that MR allows you to just click XY and it doesn't know about screen size, so those cannot be scalable. Another issue is that clicks and drags are almost everything what MR offers. More you can find here
Second one is UIAutomator. It's quite powerful and well designed, however it supports api level 16 and above. More details here.
There is also appium, which I heard allows to cross apps testing, however I don't have enough knowledge about it, so help yourself and go to appium.io
Anyway I suggest to read a bit more about android testing. Maybe this discussion is going to be helpful as well.
What I mean is automating test writing itself. Tester can perform some actions, they get recorded, and then can be used as a base for writing tests. I wasn't able to find any existing solutions, is it that hard to implement? Or did I miss something?
I mean it might be as simple as logging all touch/key events, and write tests using for example https://github.com/square/javawriter
UPD: I should've mentioned that I know of standard testing approaches:
UiAutomator
Roboelectric
Espresso (android-test-kit)
But that wasn't what I meant. Writing tests by hand is a pain, and I wander if this process can be simplified.
UPD1: If anyone stumbles apon this question, this is what I meant. It's non-free, so I'd gladly check out free/opensource analog.
You can try to use Appium (iOS/Android) which is free and has a feature that lets you record actions, and run them through. However this only works for UI functionality and any standard Unit tests will still need to be developed the standard way (manually). As a note, Appium is new (~1 year old) so there may still be bugs (such as not running in iOS devices with Xcode 5.0.1 +)
appium.io
I feel it's worthwhile to mention that appium doesn't require any modifications/additions to your android/iOS projects like a few of the other solutions I have found.
Please Calash https://github.com/calabash which is open and compatible with both iOS and Android.
I found couple of difference frameworks which can test Android apps, but all of them are limited on testing of just one app (because mainly they use Instrumentation)
My app contains a service which could be called by other apps and I want to automate testing of this too. So, I would like to be able to write some tests which automate UI in other apps.
Have you seen anything, except MonkeyRunner? I looked at it, but the API is quite poor.
Take a look at Sikuli IDE it's easy enough to use and is based on Python.
You can bascially run integration tests using it, (kind of like Selenium for desktops).
There is also Selenium Android Driver if you want to run automaton tests from the Android WebView!
You are right, a bare monkeyrunner is perhaps not enough, but if you combine it with other tools perhaps you can find your way. For example, AndroidViewClient is a library that adds the ability of:
finding Views by ID, very much like you normally do in your Android Activity (using ViewClient.findViewById())
obtaining the value for almost any of the Views properties (using for example View.isChecked() or View.mText())
sending touch events to the Views by simply invoking View.touch()
More details an a complete example can be found at http://dtmilano.blogspot.com/2012/02/monkeyrunner-interacting-with-views.html