web-dev-qa-db-fra.com

Tests unitaires avec Firebase

Je crée une application Android qui utilise Firebase comme back-end et une architecture de modèle, de vue et de présentateur. Cependant, le fait que Firebase soit un service cloud complique les tests automatisés dans mon application Android. Jusqu'à présent, j'ai construit la plupart du système d'authentification, mais je ne peux pas voir comment implémenter des tests unitaires pour le code Firebase dans mon application. En termes de tests de bout en bout, je suis également bloqué.

Étant donné que les tests sont fondamentaux pour toute application Android et que sans elle, les développeurs d'applications ne peuvent pas être sûrs que ce qu'ils ont implémenté fonctionne comme prévu, je ne peux pas vraiment progresser davantage sans tests automatisés.

En conclusion, ma question est:

En général, comment implémentez-vous les tests automatisés Firebase dans une application Android?

MODIFIER:

Par exemple, quelqu'un pourrait-il tester la méthode suivante?

public void addUser(final String name, final String birthday,
                        final String email, final String password) {
        Firebase mUsersNode = Constants.mRef.child("users");
        final Firebase mSingleUser = mUsersNode.child(name);
        mSingleUser.runTransaction(new Transaction.Handler() {
            @Override
            public Transaction.Result doTransaction(MutableData mutableData) {

                mSingleUser.child("birthday").setValue(birthday);
                mSingleUser.child("email").setValue(email);
                mSingleUser.child("password").setValue(password);
                return Transaction.success(mutableData);
            }

            @Override
            public void onComplete(FirebaseError firebaseError, boolean b, DataSnapshot dataSnapshot) {
                if(firebaseError != null) {
                        mSignUpPresenter.addUserFail(firebaseError);
                    } else {
                        mSignUpPresenter.addUserComplete();
                }
            }
        });
    }
25
Tom Finet

J'ai trouvé cela https://www.firebase.com/blog/2015-04-24-end-to-end-testing-firebase-server.html mais l'article a plus d'un an. Je l'ai seulement scanné, je vais lui donner une lecture plus approfondie dans un instant.

Quoi qu'il en soit, nous avons vraiment besoin de l'équivalent du backend Google AppEngine local que vous pouvez exécuter dans Intellij (Android Studio). Les tests ne peuvent pas être une réflexion après coup en 2016. En espérant vraiment que l'un des impressionnants développeurs de Firebase remarque ce fil et ses commentaires. Les tests devraient faire partie de leurs guides officiels.

9
Creos

Voici ma solution - j'espère que cela vous aidera:

[Mise à jour] J'ai supprimé ma précédente. échantillon en faveur de celui-ci. C'est plus simple et montre l'essence principale

    public class TestFirebase extends AndroidTestCase {
        private static Logger logger = LoggerFactory.getLogger(TestFirebase.class);

        private CountDownLatch authSignal = null;
        private FirebaseAuth auth;

        @Override
        public void setUp() throws InterruptedException {
            authSignal = new CountDownLatch(1);
            Firebase.setAndroidContext(mContext); //initializeFireBase(context);

            auth = FirebaseAuth.getInstance();
            if(auth.getCurrentUser() == null) {
                auth.signInWithEmailAndPassword("[email protected]", "12345678").addOnCompleteListener(
                        new OnCompleteListener<AuthResult>() {

                            @Override
                            public void onComplete(@NonNull final Task<AuthResult> task) {

                                final AuthResult result = task.getResult();
                                final FirebaseUser user = result.getUser();
                                authSignal.countDown();
                            }
                        });
            } else {
                authSignal.countDown();
            }
            authSignal.await(10, TimeUnit.SECONDS);
        }

        @Override
        public void tearDown() throws Exception {
            super.tearDown();
            if(auth != null) {
                auth.signOut();
                auth = null;
            }
        }

        @Test
        public void testWrite() throws InterruptedException {
            final CountDownLatch writeSignal = new CountDownLatch(1);

            FirebaseDatabase database = FirebaseDatabase.getInstance();
            DatabaseReference myRef = database.getReference("message");

            myRef.setValue("Do you have data? You'll love Firebase. - 3")
                    .addOnCompleteListener(new OnCompleteListener<Void>() {

                        @Override
                        public void onComplete(@NonNull final Task<Void> task) {
                            writeSignal.countDown();
                        }
                    });

            writeSignal.await(10, TimeUnit.SECONDS);
        }
    }
7
Mike Mitterer