16

Ich baue eine Android-App, die Firebase als Back-End und eine Modell-, Ansichts-, Presenter-Architektur verwendet. Die Tatsache, dass Firebase ein Cloud-Service ist, erschwert jedoch das automatisierte Testen in meiner Android-App. Bisher habe ich den Großteil des Authentifizierungssystems erstellt, kann aber nicht sehen, wie Einheitentests für den Firebase-Code in meiner App implementiert werden. In Bezug auf End-to-End-Tests bin ich auch festgefahren.Unit Testing mit Firebase

Da Tests für jede Android-App grundlegend sind und ohne sie die Anwendungsentwickler nicht sicher sein können, was sie implementiert haben funktioniert wie erwartet, kann ich ohne automatisierte Tests nicht weiterkommen.

Abschließend meine Frage ist:

Allgemeinen wie implementieren Sie Firebase automatisierte Tests in einem Android-App?

EDIT:

Als Beispiel könnte jemand Einheit die folgende Methode testen?

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(); 
       } 
      } 
     }); 
    } 
+0

Ich habe nicht wirklich verstanden, warum Sie mit Firebase integrieren müssen, um Komponententests zu führen. Sie können die Authentifizierung und das abgerufene Dataset leicht verspotten, denke ich. –

+0

Können Sie mir ein Beispiel geben. Ich füge eine Methode zu der Frage hinzu, für die Sie einen Komponententest schreiben möchten. –

+0

das ist eine gute Frage: ich verschiebe eine App aus einer reinen Google App Engine Lösung. Das Google Backend (und sein Datenspeicher) haben eine "lokale" Version speziell für Unit-Tests. Was ist das Äquivalent für Firebase? – Creos

Antwort

7

fand ich dieses https://www.firebase.com/blog/2015-04-24-end-to-end-testing-firebase-server.html aber der Artikel ist über ein Jahr alt. Ich habe es nur gescannt, ich werde es etwas gründlicher lesen.

So oder so, wir brauchen wirklich das Äquivalent zum lokalen Google AppEngine Backend, das Sie in Intellij (Android Studio) ausführen können. Testen kann kein Nachtrag im Jahr 2016 sein. Ich hoffe wirklich, dass einer der fantastischen Firebase-Entwickler diesen Thread und Kommentare bemerkt. Tests sollten Teil ihrer offiziellen Anleitungen sein.

6

Hier ist meine Lösung - hoffe, das hilft:

[aktualisieren] ich meine i.Vj. entfernt haben. Probe zugunsten dieser. Es ist einfacher und zeigt die Hauptessenz

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

aber das wird in Ihrer Produktionsinstanz schreiben, nein? Mit welchem ​​Gerät verbinden Sie sich? schlechte, schlechte Idee, Unit-Test gegen eine Live-Prod-Instanz, auch wenn Sie einen falschen Benutzer verwenden, um sich anzumelden ..... wir brauchen einen "lokalen" Firebase-Server für die Google Analytics Engine bietet eine lokale Version für Unit-Tests – Creos

+0

@Creos Sie sollten Ihren Entwicklungskode nicht in erster Linie mit einer Live-Prod-Instanz verbinden. Sie sollten eine separate App mit dem Zusatz appID (wie .debug) erstellen. Auf diese Weise können Sie eine sichere Verbindung herstellen, ohne Ihre Produktdatenbank zu beschädigen. –

+0

danke für Ihre Empfehlung @AbdalrahmanShatou, aber das macht keinen Sinn. Wenn ich meinen Entwickler-Code als App mit einer anderen ID "etikettiere", ist es nicht sicherer, sich mit einer Live-Prod-Datenbank zu verbinden. Der richtige Weg besteht darin, eine Replik von prod zu erstellen (die Daten möglicherweise zu scopen). Entschuldigung, wenn ich dich falsch verstanden habe – Creos