【问题标题】:Unit Testing with Firebase使用 Firebase 进行单元测试
【发布时间】:2016-04-23 10:54:21
【问题描述】:

我正在构建一个使用 Firebase 作为后端和模型、视图、演示者架构的 Android 应用程序。但是,Firebase 是一项云服务这一事实使我的 android 应用程序中的自动化测试变得复杂。到目前为止,我已经构建了大部分身份验证系统,但无法看到如何在我的应用程序中为 Firebase 代码实施单元测试。在端到端测试方面,我也陷入了困境。

由于测试是任何 android 应用程序的基础,没有它,应用程序开发人员无法确定他们所实现的功能是否按预期运行,如果没有自动化测试,我将无法取得进一步进展。

总之,我的问题是:

一般来说,您如何在 Android 应用中实现 Firebase 自动化测试?

编辑:

例如,有人可以对以下方法进行单元测试吗?

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

【问题讨论】:

  • 我真的不明白为什么需要与 Firebase 集成来运行单元测试。我认为您可以轻松地模拟身份验证和获取的数据集。
  • 你能给我举个例子吗?我将在问题中添加一个方法,供您为其编写单元测试。
  • 这是一个很好的问题:具体来说,我正在从纯谷歌应用引擎解决方案中移动应用。谷歌后端(及其数据存储)有一个专门用于单元测试的“本地”版本。 firebase 的等价物是什么?

标签: android unit-testing firebase automated-tests integration-testing


【解决方案1】:

2020 年更新: “今年(2020 年)到目前为止,这个问题似乎已经使用(测试版,在此评论日期)Firebase 模拟器解决了:使用 Fb 模拟器构建单元测试和使用 Firebase 模拟器套件进行单元测试安全规则,在 YouTube这是在开发人员的计算机中本地完成的。– carloswm85"

我找到了这个https://www.firebase.com/blog/2015-04-24-end-to-end-testing-firebase-server.html,但这篇文章已经有一年多了。我只是扫描了它,稍后我会更深入地阅读它。

无论哪种方式,我们确实需要与您可以在 Intellij (Android Studio) 中运行的本地 Google AppEngine 后端相当的功能。测试不能在 2016 年成为事后的想法。真的希望很棒的 Firebase 开发人员之一注意到这个线程和 cmets。测试应该是他们官方指南的一部分。

【讨论】:

【解决方案2】:

这是我的解决方案 - 希望对您有所帮助:

[更新] 我已经删除了我的上一个。有利于这个的样本。它更简单,并显示了主要本质

    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("urbi@orbi.it", "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);
        }
    }

【讨论】:

  • 但这会写入您的生产实例,不是吗?您要连接到哪个实例?即使您使用假用户登录,对实时产品实例进行单元测试也是一个坏主意......我们需要一个“本地”firebase 服务器,就像谷歌应用引擎为单元测试提供本地版本一样
  • @Creos 首先,您不应该将您的开发代码连接到实时产品实例;您应该创建一个带有 appID 后缀的单独应用程序(如 .debug)。这样您就可以安全地连接到它,而不会破坏您的产品数据库。
  • 感谢您的推荐@AbdalrahmanShatou,但这没有任何意义。只需将我的开发代码“标记”为具有不同 ID 的应用程序,就无法更安全地连接到实时产品数据库。正确的方法是创建 prod 的副本(可能确定数据范围)。对不起,如果我误解了你
  • 实际上,建议的 Firebase 团队,不是我 :) 查看 Firebase 文档:firebase.google.com/docs/configure 引用:“一个常见的用例是为您的开发和生产环境支持单独的 Firebase 项目”
  • 该测试在哪个模块中?是模块应用程序内部的测试吗?
猜你喜欢
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2011-11-16
  • 2015-05-28
相关资源
最近更新 更多