Ik ben een student aan de Hogeschool in Arnhem en ik studeer informatica. Ik loop nu stage bij Luminis Software Development. Ik heb o.a. de opdracht gekregen om te onderzoeken hoe een Android applicatie getest kan worden. De Android developers website geeft al een aantal voorbeelden voor het UI testen van een applicatie. Het schrijven van een UI test zoals de Android developers website beschrijft is redelijk complex en zorgt ook voor veel code.

Na wat onderzoek ben ik tegen het test framework Robotium aangelopen. De website geeft aan dat het framework gebruikt kan worden voor functie, systeem en acceptatie testen. Een onderdeel van een systeem test is een (G)UI test.

Waarover?

In dit artikel bespreek ik door middel van een voorbeeld het verschil tussen een UI test met Android JUnit en een UI test met Robotium.

UI Test met Android JUnit

Op de Android developers pagina is een kleine handleiding te vinden hoe je een Android UI test schrijft voor een Spinner applicatie.

De UI test ziet er dan als volgt uit:

SpinnerActivityTest.java
public void testSpinnerUI() {
		mActivity.runOnUiThread(new Runnable() {
			public void run() {
				mSpinner.requestFocus();
				mSpinner.setSelection(INITIAL_POSITION);
			}
		});
		this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
		for (int i = 1; i <= TEST_POSITION; i++) {
			this.sendKeys(KeyEvent.KEYCODE_DPAD_DOWN);
		}
		this.sendKeys(KeyEvent.KEYCODE_DPAD_CENTER);
		mPos = mSpinner.getSelectedItemPosition();
		mSelection = (String) mSpinner.getItemAtPosition(mPos);
		TextView resultView = (TextView) mActivity
				.findViewById(com.android.example.spinner.R.id.SpinnerResult);
		String resultText = (String) resultView.getText();
		assertEquals(resultText, mSelection);
	}

UI Test met Robotium

Op de website van Robotium is meer te vinden over Robotium en hoe je er mee aan de slag kan.

Wanneer een vergelijkbare UI test met Robotium wordt geschreven ziet het er als volgt uit:

SpinnerActivityTest.java
public void testSpinnerUI() throws Exception {
		ArrayList<Spinner> spinners = solo.getCurrentSpinners();
		int itemCount = solo.getCurrentSpinners().get(0).getCount();
		solo.pressSpinnerItem(0, -itemCount);
		solo.pressSpinnerItem(0, TEST_POSITION);
		String currentItem = spinners.get(0).getSelectedItem().toString();
		assertEquals(RESULT_SELECTION, currentItem);
	}

Het verschil?

  1. Het is meteen duidelijk dat de hoeveelheid code meteen wordt gehalveerd.
  2. Voor Robotium is er weinig kennis van de code nodig, sterker nog wanneer je de APK hebt hoef je de source code niet eens te hebben.
  3. Robotium doet heel veel dingen die je anders zelf moet doen, zie bijvoorbeeld de mSpinner.requestFocus() functie die zoals de naam als doet vermoeden voor de focus zorgt, dit is bij Robotium niet nodig…

Conclusie

Ik kan geen groot nadeel bedenken bij het gebruik van Robotium ten overstaande van Android JUnit testen. Het lijkt erop dat Robotium alleen iets trager is in deze test.

Er wordt nog steeds hard gewerkt aan Robotium, dus we kunnen hopelijk binnenkort weer nieuwe functionaliteiten verwachten zoals een screenshot bij een gefaalde test.