Unit Testing with Firebase

Unit Testing with Firebase

21 May 2024 Stephan Petzl Leave a comment Tech-Help

Building an Android app that uses Firebase as the backend involves a unique set of challenges, especially when it comes to automated testing. This is primarily due to the cloud-based nature of Firebase, which complicates the process of creating unit tests. However, it’s crucial to have automated tests to ensure that your application functions as expected. In this article, we’ll explore effective strategies to implement Firebase automated testing in an Android app.

Challenges of Testing with Firebase

Firebase’s cloud service architecture poses several challenges for testing:

  • Dependency on network connectivity
  • Difficulty in mocking Firebase services
  • Ensuring data consistency and isolation between tests

Using Firebase Emulator for Unit Testing

One effective solution to these challenges is using the Firebase Emulator Suite. The emulator allows you to run and test your Firebase code locally, eliminating the dependency on network connectivity and the actual Firebase backend. This also helps in maintaining data consistency and isolation between tests.

Setting Up Firebase Emulator

To set up the Firebase Emulator, follow these steps:

  1. Install the Firebase CLI: npm install -g firebase-tools
  2. Initialize the emulator in your project: firebase init emulators
  3. Start the emulator: firebase emulators:start

Once the emulator is set up, you can configure your tests to interact with the local emulator instead of the live Firebase backend.

Example: Unit Testing Firebase Authentication

Below is an example of how to unit test Firebase authentication using the emulator:


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

      auth = FirebaseAuth.getInstance();
      if (auth.getCurrentUser() == null) {
        auth.signInWithEmailAndPassword("[email protected]", "12345678")
          .addOnCompleteListener(new OnCompleteListener() {
            @Override
            public void onComplete(@NonNull final Task 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() {
          @Override
          public void onComplete(@NonNull final Task task) {
            writeSignal.countDown();
          }
        });

      writeSignal.await(10, TimeUnit.SECONDS);
    }
  }
  

Conclusion

Using the Firebase Emulator Suite is a robust solution for unit testing Firebase code in Android apps. It allows for local testing, which can significantly streamline the development process by providing a controlled environment for testing.

For those looking for a no-code solution to automate testing, consider using Repeato. Repeato is a no-code test automation tool for iOS and Android that helps you create, run, and maintain automated tests for your apps quickly. It leverages computer vision and AI, making it particularly fast to edit and run tests. Repeato also supports testing within Android emulators or devices, ensuring comprehensive test coverage for your applications.

For more detailed information on automated testing and best practices, check out our blog.

Like this article? there’s more where that came from!