web-dev-qa-db-fra.com

Android: Écrire des cas de test pour Fragments

Dans mes projets précédents, j'ai effectué la plupart du travail via Activités et utilisé ActivityInstrumentationTestCase2 conformément au document:
http://developer.Android.com/tools/testing/activity_testing.html
J'ai une idée de la façon de travailler avec des cas de test d'activité; mais quand il s'agit de Fragment, je n'ai pas beaucoup d'idée ni trouvé beaucoup de documents liés à cela . Alors, comment écrire des cas de test quand j'ai plusieurs fragments avec une ou deux activités? Un exemple de code ou un exemple serait plus utile.

29
AnswerDroid

Voici un guide approximatif utilisant ActivityInstrumentationTestCase2:

Étape 1. Créez une activité vide pour contenir vos fragments

  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);
    }
  }

Étape 2: Dans votre test, instanciez votre fragment et ajoutez-le à l'activité vide

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

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

Étape 3 Testez votre fragment instancié

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

Si vous utilisez robolectric, utilisez plutôt la classe FragmentUtilTest :

@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

Voici ma solution de travail: 

  1. Créez une classe de test d’unités d’instrumentation dans le répertoire androidTest, c’est-à-dire:

    public class FragmentTest extends 
    ActivityInstrumentationTestCase2<MainActivity> {
         private MainActivity testingActivity;
         private TestFragment testFragment;
         //... 
    }
    
  2. appelez ce constructeur dans cette nouvelle classe:

    public FragmentTest() {
    
        super(MainActivity.class);
    }
    
  3. écrasez la méthode setUp () (assurez-vous que R.id.fragmentContainer est présent dans votre classe d’activité) et appelez-le à la fin waitForIdleSync () :

    @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. Ecrire une méthode de test, par exemple quelque chose comme:

    public void testGameFragmentsTextViews() {
    
       String empty = "";
       TextView textView = (TextView)testFragment.getView().findViewById(R.id.myTextView);
       assertTrue("Empty stuff",(textView.getText().equals(empty)));   
    }
    
  5. Exécutez le test.

3

Utilisez votre activité principale comme activité de test que vous envoyez à ActivityInstrumentationTestCase2. Vous pouvez ensuite utiliser les fragments via le gestionnaire de fragments de votre activité principale qui les lance. C'est encore mieux qu'une activité de test, car elle utilise la logique que vous écrivez dans votre activité principale pour tester des scénarios, ce qui donne un test plus complet et plus complet.

Exemple: 

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

}
2
melkoth

À l'heure actuelle, ActivityInstrumentationTestCase2 est obsolète. Vous pouvez maintenant utiliser des règles pour utiliser des activités dans vos tests: http://wiebe-elsinga.com/blog/whats-new-in-Android-testing/

Pour que ceux-ci fonctionnent, vous devez ajouter les dépendances à votre build.gradle:

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

(Voir Pourquoi ne puis-je pas importer AndroidJUnit4 et ActivityTestRule dans ma classe de test unitaire? )

0
saitho