16

我建立它使用火力地堡作爲後端和模型,視圖,演示架構的Android應用程序。但是,Firebase是雲服務的事實使我的android應用程序中的自動測試變得複雜。到目前爲止,我已經構建了大部分身份驗證系統,但無法看到如何在我的應用中爲Firebase代碼實現單元測試。就端到端測試而言,我也陷入困境。單元測試與火力地堡

由於測試是根本,以任何Android應用程序,沒有它的應用開發者不能確定他們所實行的是按預期,我真的不能取得進一步進展的任何沒有自動測試。

總之,我的問題是:

一般情況下,你如何在Android應用實施火力地堡自動化測試?

編輯:

作爲一個例子可能有人單元測試以下方法?

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

我真的不明白爲什麼你需要與Firebase集成來運行單元測試。我可以輕鬆地嘲笑認證和獲取的數據集。 –

+0

你能舉個例子嗎?我將在該問題中添加一個方法,供您編寫單元測試。 –

+0

這是一個很好的問題:具體而言,我正在從純粹的谷歌應用程序引擎解決方案移動應用程序。谷歌後端(及其數據存儲)具有專門用於單元測試的「本地」版本。 Firebase的等同物是什麼? – Creos

回答

7

我發現這個https://www.firebase.com/blog/2015-04-24-end-to-end-testing-firebase-server.html,但文章已超過一年。我只掃描它,我會稍微詳細地閱讀它。

不管怎樣,我們真正需要的地方谷歌的AppEngine後端,你可以在的IntelliJ(Android Studio中)運行的等價物。測試不能是2016年的事後考慮。真的希望真棒Firebase開發者之一注意到這個線程和評論。測試應該是其官方指南的一部分。

6

這裏是我的解決辦法 - 希望這有助於:

[更新] 我已經打消了我的上一個。樣本贊成這一個。這更簡單,並顯示主要本質

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

但這會寫入您的生產實例,不是嗎?你打算連接哪個instnace?不好的想法,即使您使用虛假用戶登錄,也需要針對實時產品實例進行單元測試.....我們需要一個「本地」Firebase服務器,因爲這只是Google應用引擎爲單元測試提供本地版本的方式 – Creos

+0

@Creos你不應該首先將你的開發代碼連接到一個實際的產品實例;你應該創建一個帶appID後綴的獨立應用程序(如.debug)。這樣,您可以安全地連接到它而不會損壞您的prod數據庫。 –

+0

感謝您的讚揚@AbdalrahmanShatou,但這沒有任何意義。只是將我的開發代碼「標記」爲具有不同ID的應用程序,這使得連接到活動的產品數據庫並不安全。正確的方法是創建prod副本(可能對數據進行範圍化)。如果我誤解了你的道歉 – Creos