it-swarm.com.de

Android: Testfälle für Fragmente schreiben

In meinen vorherigen Projekten habe ich die meiste Arbeit über Activities durchgeführt und ActivityInstrumentationTestCase2 wie in diesem Dokument verwendet:
http://developer.Android.com/tools/testing/activity_testing.html
Ich habe eine Idee, wie ich mit Aktivitäts-Testfällen arbeiten soll. Aber wenn es um Fragment geht, habe ich nicht viel Ahnung und habe auch nicht viele Dokumente gefunden, die damit in Zusammenhang stehen ... Wie schreibe ich Testfälle, wenn ich mehrere Fragmente mit einer oder zwei Aktivitäten habe? wäre hilfreicher.

29
AnswerDroid

Hier ist eine grobe Anleitung mit ActivityInstrumentationTestCase2:

Schritt 1. Erstellen Sie eine leere Aktivität, um Ihre Fragmente aufzunehmen.

  private static class FragmentUtilActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      LinearLayout view = new LinearLayout(this);
      view.setId(1);

      setContentView(view);
    }
  }

Schritt 2: Instanzieren Sie Ihr Fragment innerhalb Ihres Tests und fügen Sie es der leeren Aktivität hinzu

public class MyFragmentTest extends ActivityInstrumentationTestCase2<FragmentUtilActivity> { 
    private MyFragment fragment;

    @Before
    public void setup() {
        fragment = new MyFragment();
        getActivity().getFragmentManager().beginTransaction().add(1, fragment, null).commit();
    }
}

Schritt 3 Testen Sie Ihr instanziiertes Fragment

@Test
public void aTest() {
    fragment.getView().findViewById(...);
}

Wenn Sie robolectric verwenden, ist dies mit der FragmentUtilTest -Klasse ziemlich einfach:

@Test
public void aTest() {
    // instantiate your fragment
    MyFragment fragment = new MyFragment();

    // Add it to a blank activity
    FragmentTestUtil.startVisibleFragment(fragment);

    // ... call getView().findViewById() on your fragment
}
25
Nachi

Hier ist meine Arbeitslösung: 

  1. Erstellen Sie eine Testklasse für Geräteeinheiten für dieses Verzeichnis im androidTest-Verzeichnis, d. H .:

    public class FragmentTest extends 
    ActivityInstrumentationTestCase2<MainActivity> {
         private MainActivity testingActivity;
         private TestFragment testFragment;
         //... 
    }
    
  2. nenne diesen Konstruktor in dieser neuen Klasse:

    public FragmentTest() {
    
        super(MainActivity.class);
    }
    
  3. Überschreiben Sie die setUp () -Methode (stellen Sie sicher, dass sich in Ihrer Activity-Klasse R.id.fragmentContainer befindet), in der Sie am Ende waitForIdleSync () aufrufen:

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    
        // Starts the activity under test using
        // the default Intent with:
        // action = {@link Intent#ACTION_MAIN}
        // flags = {@link Intent#FLAG_ACTIVITY_NEW_TASK}
        // All other fields are null or empty.
        testingActivity = getActivity();
    
        testFragment = new TestFragment();
        testingActivity.getFragmentManager().beginTransaction().add(R.id.fragmentContainer,testFragment,null).commit();
        /**
         * Synchronously wait for the application to be idle.  Can not be called
         * from the main application thread -- use {@link #start} to execute
         * instrumentation in its own thread.
         *
         * Without waitForIdleSync(); our test would have nulls in fragment references.
         */
        getInstrumentation().waitForIdleSync();
    }
    
  4. Schreiben Sie eine Testmethode, zum Beispiel:

    public void testGameFragmentsTextViews() {
    
       String empty = "";
       TextView textView = (TextView)testFragment.getView().findViewById(R.id.myTextView);
       assertTrue("Empty stuff",(textView.getText().equals(empty)));   
    }
    
  5. Führen Sie den Test aus.

Verwenden Sie Ihre Hauptaktivität als Testaktivität, die Sie an ActivityInstrumentationTestCase2 senden. Anschließend können Sie mit den Fragmenten über den Fragmentmanager Ihrer Hauptaktivität, mit der die Fragmente gestartet werden, arbeiten. Dies ist sogar noch besser als eine Testaktivität, da die Logik, die Sie in Ihrer Hauptaktivität schreiben, zum Testen von Szenarien verwendet wird, was einen umfassenderen und vollständigeren Test ergibt.

Beispiel: 

public class YourFragmentTest extends ActivityInstrumentationTestCase2<MainActivity> {  
    public YourFragmentTest(){
            super(MainActivity.class);
        }

}
2
melkoth

Im Moment ist ActivityInstrumentationTestCase2 veraltet. Jetzt können Sie Regeln verwenden, um Aktivitäten in Ihren Tests zu verwenden: http://wiebe-elsinga.com/blog/whats-new-in-Android-testing/

Damit diese funktionieren, müssen Sie die Abhängigkeiten zu build.gradle hinzufügen:

testCompile 'com.Android.support.test:rules:0.5'
testCompile 'com.Android.support.test:runner:0.5'

(Siehe Warum kann ich AndroidJUnit4 und ActivityTestRule nicht in meine Komponententestklasse importieren? )

0
saitho