使用 Firebase 进行单元测试
Unit Testing with Firebase
我正在构建一个 android 应用程序,它使用 Firebase 作为后端和模型、视图、演示器架构。然而,Firebase 是一项云服务这一事实使我的 android 应用程序中的自动化测试变得复杂。到目前为止,我已经构建了大部分身份验证系统,但无法了解如何在我的应用程序中为 Firebase 代码实施单元测试。在端到端测试方面我也卡住了。
由于测试是任何 android 应用程序的基础,没有它,应用程序开发人员无法确定他们实现的功能是否按预期运行,如果没有自动化测试,我就无法取得进一步的进展。
总之,我的问题是:
Generally, how do you implement Firebase automated testing in an android app?
编辑:
例如,有人可以对以下方法进行单元测试吗?
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();
}
}
});
}
2020 年更新:
“今年(2020 年)到目前为止,这个问题似乎已经使用(测试版,在发表评论之日)Firebase 模拟器解决了:使用 Facebook 模拟器构建单元测试和使用 Firebase 模拟器套件进行单元测试安全规则,在 YouTube这是在开发人员的计算机上本地完成的。– carloswm85"
我找到了这个 https://www.firebase.com/blog/2015-04-24-end-to-end-testing-firebase-server.html 但这篇文章已有一年多了。我只是扫了一眼,待会儿再细读一下。
无论哪种方式,我们确实需要相当于本地 Google AppEngine 后端,您可以在 Intellij (Android Studio) 中 运行。在 2016 年,测试不能是事后的想法。真的希望其中一位很棒的 Firebase 开发人员注意到这个线程和评论。测试应该是他们官方指南的一部分。
这是我的解决方案 - 希望对您有所帮助:
[更新]
我已经删除了我的prev。赞成这个的样本。更简单,更显主旨
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);
}
}
我正在构建一个 android 应用程序,它使用 Firebase 作为后端和模型、视图、演示器架构。然而,Firebase 是一项云服务这一事实使我的 android 应用程序中的自动化测试变得复杂。到目前为止,我已经构建了大部分身份验证系统,但无法了解如何在我的应用程序中为 Firebase 代码实施单元测试。在端到端测试方面我也卡住了。
由于测试是任何 android 应用程序的基础,没有它,应用程序开发人员无法确定他们实现的功能是否按预期运行,如果没有自动化测试,我就无法取得进一步的进展。
总之,我的问题是:
Generally, how do you implement Firebase automated testing in an android app?
编辑:
例如,有人可以对以下方法进行单元测试吗?
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();
}
}
});
}
2020 年更新: “今年(2020 年)到目前为止,这个问题似乎已经使用(测试版,在发表评论之日)Firebase 模拟器解决了:使用 Facebook 模拟器构建单元测试和使用 Firebase 模拟器套件进行单元测试安全规则,在 YouTube这是在开发人员的计算机上本地完成的。– carloswm85"
我找到了这个 https://www.firebase.com/blog/2015-04-24-end-to-end-testing-firebase-server.html 但这篇文章已有一年多了。我只是扫了一眼,待会儿再细读一下。
无论哪种方式,我们确实需要相当于本地 Google AppEngine 后端,您可以在 Intellij (Android Studio) 中 运行。在 2016 年,测试不能是事后的想法。真的希望其中一位很棒的 Firebase 开发人员注意到这个线程和评论。测试应该是他们官方指南的一部分。
这是我的解决方案 - 希望对您有所帮助:
[更新] 我已经删除了我的prev。赞成这个的样本。更简单,更显主旨
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);
}
}