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