Saturday, November 24, 2012

Android uiautomater sample test case with assert verification

I have spent a couple days testing out the new UiAutomator API and thinking that it is like a bridge between android instrumentation and monkeyrunner. By using this APIs, you can develop test case with minimum knowledge and less effort. You don’t need to do any pre-setup like package boundaries and configuring manifest file permissions. 

While designing a test case using Robotium, You must need to include some critical steps like extending from ActivityInstrumentationTestCase2 and passing in the name of the target class creating the constructor that takes no arguments.

But here you don’t need to do anything. You can just create a normal Java project with default folder structure and build the test.jar file with project dependency UIAutomater.jar file

Here as the sample UIAutomater Sample Test case.

public void testDemo() throws UiObjectNotFoundException {

// Press home button.... Don’t care about where your device status or previous test case where you opened.
        getUiDevice().pressHome();

 // open the All Apps view
        UiObject allAppsButton = new UiObject(LauncherHelper.ALL_APPS_BUTTON);
        allAppsButton.click();

// clicking the APPS tab
        UiSelector appsTabSelector =
                new UiSelector().className(android.widget.TabWidget.class.getName())
                        .childSelector(new UiSelector().text("Apps"));
        UiObject appsTab = new UiObject(appsTabSelector);
        appsTab.click();

// Clicking the Settings
        UiScrollable allAppsScreen = new UiScrollable(LauncherHelper.LAUNCHER_CONTAINER);
        allAppsScreen.setAsHorizontalList();
        UiObject clockApp =
                allAppsScreen.getChildByText(LauncherHelper.LAUNCHER_ITEM, "Clock");
        clockApp.click();

// Set an alarm to go off in about 2 minutes
        setAlarm(2);

// wait for the alarm alert dialog
        UiObject alarmAlert =
                new UiObject(new UiSelector().packageName("com.google.android.deskclock")
                        .className(TextView.class.getName()).text("Alarm"));
        assertTrue("Timeout while waiting for alarm to go off",
                alarmAlert.waitForExists(2 * 60 * 1000));
        clickByText("Dismiss");
}

private void setAlarm(int minutesFromNow) throws UiObjectNotFoundException {
        UiObject setAlarm = new UiObject(new UiSelector().textStartsWith("Alarm set"));

        if (!setAlarm.exists())
            setAlarm = new UiObject(new UiSelector().textStartsWith("Set alarm"));
        setAlarm.click();
        clickByDescription("Add alarm");
        clickByText("Time");

        UiSelector minuteAreaSelector = new UiSelector().className(
                android.widget.NumberPicker.class.getName()).instance(1);
        UiSelector minuteIncreaseButtonSelector = minuteAreaSelector.childSelector(
                new UiSelector().className(android.widget.Button.class.getName()).instance(1));

        for (int x = 0; x < minutesFromNow; x++)
            new UiObject(minuteIncreaseButtonSelector).click();

        clickByText("Done");
        UiObject doneButton = new UiObject(new UiSelector().text("Done"));
        UiObject okButton = new UiObject(new UiSelector().text("OK"));

        if (doneButton.exists()) {
            doneButton.click();
        } else {
            okButton.click(); // let it fail if neither exists
        }
        clickByText("Done");
        getUiDevice().pressHome();
}

private void clickByDescription(String text) throws UiObjectNotFoundException {
        UiObject obj = new UiObject(new UiSelector().description(text));
        obj.clickAndWaitForNewWindow();
}

private void clickByText(String text) throws UiObjectNotFoundException {
        UiObject obj = new UiObject(new UiSelector().text(text));
        obj.clickAndWaitForNewWindow();
}

Monday, November 19, 2012

Time to kick off android Instrumentation and monkeyrunner API


Recently I have updated Android SDK Tools 21.0 and came to know that they have added New UI Automation tool for App testers. This is was really cool and kick it off existing like android JUnit test case, monkeyrunner and Robotium APIs as well. This little baby code making more easy to write the test cases with less efforts. I am surely this APIs can be more matured over the next two years.

It is similar to robotium tool but having powerful APIs which it can wakup the device, crossing the package boundaries, rotating  and lock the screen orientation, taking screenshots.

As a test automation engineer, I was really interested on this. Google developers are making their OS more testable so I had high hopes with every release to see in this area. I just read the documentation and observed below good things and bad things

UI Automater

è  Good things
1.     Works across the Android OS System (NOT like package boundaries)
2.     NO connection for you app project (Does NOT require source code)
3.     JUnit based (familiar tool and test case structure)
4.     XML hierarchy dump tool in Monitor like DDMS/Hierarchy Viewer (Identifying the specific UI elements your test will need without the distractions)
5.     Useful and end up being maintained long-term (closely tied to the platform)
6.     Generates a JAR file which you can push in to the device or emulator
7.     Simple, readable, repeatable syntax and Able to crate the OR (Object repository like Q.T.P or Selenium)
8.     Updates and Bug fixes seem likely to be released infrequently

è  Bad things
1.     Still NO eclipse integration
2.     Still NO Native JUnit XML Reports
3.     Cannot be Downgraded (Only 4.1 or higher versions)
4.   WebViews still NOT supporting