web-dev-qa-db-ja.com

Firebaseを使用した単体テスト

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

私はこれを見つけました https://www.firebase.com/blog/2015-04-24-end-to-end-testing-firebase-server.html しかし、記事は1年以上前のものです。私はそれをスキャンしただけで、もう少し徹底的に読みます。

いずれにしても、Intellij(Android Studio)で実行できるローカルのGoogle AppEngineバックエンドに相当するものが本当に必要です。 2016年、テストは後から考えることはできません。素晴らしいFirebase開発者の1人がこのスレッドとコメントに気付いたことを本当に期待しています。テストは公式ガイドの一部である必要があります。

9
Creos

これが私の解決策です-これが役立つことを願っています:

[更新]前を削除しました。これを支持するサンプル。よりシンプルで、主な本質を示しています

    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