Hello World

Einleitung

In diesem Tutorial geht es um die Erstellung eines typischen "Hello World"-Programms für die Android-Plattform. Dabei wird auf die Erstellung eines einfachen Projektgrundgerüstes und eines zugehörigen Testprojekts eingegangen. Die Anforderungen an das Beispielprojekt bestehen darin, dass der auf dem Bildschirm anzuzeigende Text aus einer externen Datei geladen wird. Das Testprojekt muss sicherstellen, dass der entsprechende Text in der Ressourcendatei vorhanden ist und korrekt angezeigt wird.

Erstellung eines neuen Projekts

Der erste Schritt besteht in der Erstellung eines neuen Projekts. Dazu wird in Eclipse über das File-Menu der Punkt New und anschließend Other ausgewählt. Im daraufhin erscheinenden Fenster findet wählt man Android => Android Project. Mit einem Klick auf Next gelangt man zur nächsten Seite. Hier muss ein Projektname angegeben werden.

Im nächsten Schritt muss die Zielplattform angegeben werden. Es werden nur installierte SDK Versionen angezeigt. Es ist darauf zu achten, dass sie die für das Endgerät benötigte Version auswählen.

Der letzte Schritt besteht aus der Angabe einiger Informationen zum Projekt. Es muss der Name der Anwendung und das Java-Package angegeben werden. Die Einstellung Create Activity wird ausgewählt. Außerdem wird ein Haken bei Create a Test Project gesetzt. Nach einem Klick auf Finish wird das Projekt erzeugt.

Wichtig: In den folgenden Tutorials wird häufig nur beschrieben, dass ein neues Projekt angelegt werden soll. Dies geschieht genauso wie eben beschrieben. Lediglich der Name der Anwendung sowie der zu erstellenden Activity müssen geändert werden.

Das Projekt kann nun mit Run => Run As => Android Application gestartet werden. Wenn das Endgerät zu diesem Zeitpunkt angeschlossen ist, so wird die Anwendung direkt auf das Gerät kopiert und gestartet. Sollte keine Gerät angeschlossen sein, so wird folgende Meldung gezeigt:

Klicken Sie auf No und stellen Sie sicher, dass ihr Endgerät angeschlossen ist. Wahlweise kann auch nach einem Klick auf Yes ein virtuelles Gerät erstellt werden, welches einen Emulator startet.

Auslagerung von Zeichenketten

Der Eclipse Project Wizard erstellt automatisch die Datei res/values/strings.xml. In dieser befinden sich bereits die auszulagernden Zeichenketten. In der Datei res/layout/main.xml kann der Zugriff auf die Zeichenketten innerhalb der Anwendung betrachtet werden. Will man auf einen nichtvorhandenen String zugreifen, so wird bereits durch die IDE ein Fehler angezeigt:

Auch der programmatische Zugriff auf nichtvorhandene Ressourcen führt zu einem Fehler.

Testen

Der Test, welcher im folgenden Abschnitt erstellt wird, soll zwei Dinge sicherstellen. Zum Ersten wird getestet, ob die Anwendung korrekt gestartet wird und zum Zweiten, dass der auf dem Bildschirm angezeigte Text der selbe ist, wie in der Ressourcendatei angegeben.

Vorbereitung

Um auf ein Element der Benutzeroberfläche zugreifen zu können, muss dieses eine eindeutige ID besitzen. In der Datei res/layout/main.xml wird diese dem TextView -Element mit einem Attribut zugeordnet: android:id="@+id/textview" . In dem Attribut bedeutet @+id , dass der Teil nach dem / vom XML-Parser verarbeitet werden soll und das es sich um eine ID handelt. Zusätzlich wird die ID als neu behandelt (durch das + gekennzeichnet) und in die Liste der Ressourcen eingetragen. Der Quelltext der Datei res/layout/main.xml sollte nun etwa wie folgt aussehen:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />

</LinearLayout>

Erstellung der Testklasse

Um eine neue Testklasse zu erstellen, wird per Rechtsklick auf das Testpackage das Menu New => Class aufgerufen. Als Name geben wir "HelloWorldTest" ein. Als Superklasse wird ActivityInstrumentationTestCase2<HelloWorldActivity> angegeben. Eine import -Anweisung für die zu testenden Activity wird hierbei nicht automatisch erstellt und muss somit per Hand eingegeben werden. Auch ein Konstruktor muss explizit definiert werden. Der gesamte Quelltext der Testklasse sollte nun wie folgt aussehen:

package de.hszigr.mobileapps.helloworld.test;

import de.hszigr.mobileapps.helloworld.HelloWorldActivity;
import android.test.ActivityInstrumentationTestCase2;

public class HelloWorldTest extends ActivityInstrumentationTestCase2<HelloWorldActivity> {

    public HelloWorldTest() {
        super(HelloWorldActivity.class);
    }
    
}

Die setUp()-Methode

Der nächste Schritt besteht in der Implementation der von JUnit bekannten Methode setUp(). In dieser wird die Activity gestartet und das TextView -Element gespeichert, welches den auszugebenden Text enthält. Außerdem speichern wir den erwarteten Text aus der Ressourcendatei in einem Feld ab. Um eine Referenz auf das TextView -Element zu erhalten, wird die Methode findViewById() der Activity-Klasse aufgerufen. Der Rückgabewert muss dann aber noch in ein Objekt vom Typ TextView gecastet werden.

@Override
protected void setUp() throws Exception {
    super.setUp();

    activity = getActivity();
    textView = (TextView) activity.findViewById(de.hszigr.mobileapps.R.id.textview);
    expectedString = activity.getString(de.hszigr.mobileapps.R.string.hello);
}

Vorbedingungen testen

Als nächstes wird eine Testmethode erstellt, welche überprüft, dass die Benutzeroverfläche auch das entsprechende TextView -Element enthält. Dieser Test besteht einfach darin zu testen, ob die Referenz ungleich null ist.

public void testPreconditions() {
    assertNotNull(textView);
}

Test der angezeigten Zeichenkette

Für diesen Test nutzen wir den in dem Feld expectedString gespeichert Wert aus der Ressourcendatei und den Wert des TextView -Objekts.

public void testText() {
    assertEquals(expectedString, (String)textView.getText());
}

Die fertige Testklasse sollte wie folgt aussehen:

package de.hszigr.mobileapps.helloworld.test;

import android.test.ActivityInstrumentationTestCase2;
import android.widget.TextView;
import de.hszigr.mobileapps.helloworld.HelloWorldActivity;

public class HelloWorldTest extends
        ActivityInstrumentationTestCase2 {
    
    private HelloWorldActivity activity;
    private TextView textView;
    private String expectedString;

    public HelloWorldTest() {
        super(HelloWorldActivity.class);
    }
    
    @Override
    protected void setUp() throws Exception {
        super.setUp();
        
        activity = getActivity();
        textView = (TextView) activity.findViewById(de.hszigr.mobileapps.helloworld.R.id.textview);
        expectedString = activity.getString(de.hszigr.mobileapps.helloworld.R.string.hello);
    }
    
    public void testPreconditions() {
        assertNotNull(textView);
    }
    
    public void testText() {
        assertEquals(expectedString, (String)textView.getText());
    }
}
		
		

Ausführung der Tests

Zum Starten des Tests wird mit einem Rechtklick auf die Testklasse das Menu Run As => Android JUnit Test aufgerufen. Die Ergebnisse des Tests werden so präsentiert, wie es von normalen JUnit-Tests her bekannt ist.