UIautomator Test Case Android

Namrata picture Namrata · Jul 10, 2014 · Viewed 8.1k times · Source

I'm working with UiAutomator, but I unable to extend my class with UIAutomatorTestCase, Also I had added the jar files ie UIAutomator jar files and JUnit3 lib. I'm getting error in this class And also i want to knw how to build the testcases for that application plus How can I run the test cases from my application programmatically? if no then how i can run these test cases.

  package com.example.test;

import junit.framework.TestCase;

public class UiAutomatorTestCase extends TestCase {

    private static final String DISABLE_IME = "disable_ime";
    private static final String DUMMY_IME_PACKAGE = "com.android.testing.dummyime";
    private UiDevice mUiDevice;
    private Bundle mParams;
    private IAutomationSupport mAutomationSupport;
    private boolean mShouldDisableIme = false;

    @Override
    protected void setUp() throws Exception {
        super.setUp();
        mShouldDisableIme = "true".equals(mParams.getString(DISABLE_IME));
        if (mShouldDisableIme) {
            setDummyIme();
        }
    }

    @Override
    protected void tearDown() throws Exception {
        if (mShouldDisableIme) {
            restoreActiveIme();
        }
        super.tearDown();
    }

    /**
     * Get current instance of {@link UiDevice}. Works similar to calling the static {@link UiDevice#getInstance()} from anywhere in the test classes.
     */
    public UiDevice getUiDevice() {
        return mUiDevice;
    }

    /**
     * Get command line parameters. On the command line when passing <code>-e key value</code> pairs, the {@link Bundle} will have the key value pairs conveniently available to the
     * tests.
     */
    public Bundle getParams() {
        return mParams;
    }

    /**
     * Provides support for running tests to report interim status
     * 
     * @return
     */
    public IAutomationSupport getAutomationSupport() {
        return mAutomationSupport;
    }

    /**
     * package private
     * 
     * @param uiDevice
     */
    void setUiDevice(UiDevice uiDevice) {
        mUiDevice = uiDevice;
    }

    /**
     * package private
     * 
     * @param params
     */
    void setParams(Bundle params) {
        mParams = params;
    }

    void setAutomationSupport(IAutomationSupport automationSupport) {
        mAutomationSupport = automationSupport;
    }

    /**
     * Calls {@link SystemClock#sleep(long)} to sleep
     * 
     * @param ms
     *            is in milliseconds.
     */
    public void sleep(long ms) {
        SystemClock.sleep(ms);
    }

    protected void setDummyIme() throws RemoteException {
        IInputMethodManager im = IInputMethodManager.Stub.asInterface(ServiceManager.getService(Context.INPUT_METHOD_SERVICE));
        List<InputMethodInfo> infos = im.getInputMethodList();
        String id = null;
        for (InputMethodInfo info : infos) {
            if (DUMMY_IME_PACKAGE.equals(info.getComponent().getPackageName())) {
                id = info.getId();
            }
        }
        if (id == null) {
            throw new RuntimeException(String.format("Required testing fixture missing: IME package (%s)", DUMMY_IME_PACKAGE));
        }
        im.setInputMethod(null, id);
    }

    protected void restoreActiveIme() throws RemoteException {
        // TODO: figure out a way to restore active IME
        // Currently retrieving active IME requires querying secure settings provider, which is hard
        // to do without a Context; so the caveat here is that to make the post test device usable,
        // the active IME needs to be manually switched.
    }
}

Following class is to test the calculator. But I dont knw how to use it.. Here's the link

package com.example.test;

import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;

public class DemoCalTest extends UiAutomatorTestCase {
    public void testingCalculator() throws UiObjectNotFoundException {

        // First we testing the press of the HOME button.

        getUiDevice().pressHome();

        // using the uiautomatorviewer tool we found that the button for the "applications" has

        //the value “Apps” (screen9)

        // so we use this property to create a UiSelector to find the button. 

        UiObject Applications = new UiObject(new UiSelector().description("Apps"));

        // testing the click to bring up the All Apps screen.

        Applications.clickAndWaitForNewWindow();

        // In the All Apps screen, the "Calculator" application is located in 

        // the Apps tab. So, we create a UiSelector to find a tab with the text 

        // label “Apps”.

        UiObject apps = new UiObject(new UiSelector().text("Apps"));

        // and then testing the click to this tab in order to enter the Apps tab.

        apps.click();

        // All the applications are in a scrollable list 

        // so first we need to get a reference to that list

        UiScrollable ListOfapplications = new UiScrollable(new UiSelector().scrollable(true));

        // and then trying to find the application    

        // with the name Calculator

        UiObject Calculator = ListOfapplications.getChildByText(new UiSelector().className(android.widget.TextView.class.getName()), "Calculator");

        Calculator.clickAndWaitForNewWindow();

        // now the Calculator app is open

        // so we can test the press of button "7" using the ID "com.android.calculator2:id/digit7"

        //we found by using uiautomatorviewer

        UiObject seven = new UiObject(new UiSelector().resourceId("com.android.calculator2:id/digit7"));

        seven.click();

        // now we test the press of button "+"

        UiObject plus = new UiObject(new UiSelector().resourceId("com.android.calculator2:id/plus"));

        plus.click();

        // and then the press of button "1"

        UiObject one = new UiObject(new UiSelector().resourceId("com.android.calculator2:id/digit1"));

        one.click();

        // we test the press of button "="

        UiObject result = new UiObject(new UiSelector().resourceId("com.android.calculator2:id/equal"));

        result.click();

        //and finally we test the press of "Back" button

        getUiDevice().pressBack();

    }
}

I googled alot but could find any explanation about it. Can any one help me out. I am new to it Thanks

Answer

Anvesh Yalamarthy picture Anvesh Yalamarthy · Jul 10, 2014

This is how you should be extending your class:

public class <yourClassName> extends UiAutomatorTestCase {

We also need to import uiautomator.jar which usually resides in ~/sdk/platforms/android-xx/

You can kick start from Link1 and Link2