我正在构建一个Android应用程序,它使用Firebase作为后端和模型,视图,演示者架构.但是,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();
}
}
});
}
Run Code Online (Sandbox Code Playgroud) android integration-testing automated-tests unit-testing firebase
我有一个片段,这里是onCreateView方法:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
mView = inflater.inflate(R.layout.fragment_added_to_cart_anim, container, false);
ButterKnife.bind(this, mView);
mAddedToCartAnimation.setAnimation("checked_done_.json");
mAddedToCartAnimation.loop(false);
mAddedToCartAnimation.playAnimation();
// Remove fragment when animation is finished.
return mView;
}
Run Code Online (Sandbox Code Playgroud)
我需要getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit();在lottie动画结束时删除片段.如果我理解正确,当isAnimating()lottie方法返回false时动画已经结束,因为在我的配置中动画不循环,这是我应该删除当前片段.但我不能只使用if语句,因为当它被执行时,动画可能仍在继续.
当lottie动画结束时,我需要一种方法来删除片段,我该怎么做?
我正在开发一个使用firebase进行用户管理和身份验证的Android应用程序.我想知道auth状态监听器何时被调用以及它是如何工作的,就像在我的应用程序中我有一个与此相关的错误.
这是我的Android应用程序中的一个示例:
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// Sign in logic here.
}
}
};
Run Code Online (Sandbox Code Playgroud)
AuthStateListener工作如何以及何时被调用?
我正在使用AWS后端设置我的Android应用程序并且正在编译com.amazonaws:aws-android-sdk-auth-ui:2.6.+@aar库需要minSdkVersion在应用程序级别gradle文件中为23,但是我希望使用19作为minSdkVersion.这是我的gradle文件.
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.jwb.juicewithbenefits"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
implementation 'com.android.support:design:26.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
// Mobile Client for initializing the SDK
compile ('com.amazonaws:aws-android-sdk-mobile-client:2.6.7@aar') { transitive = true; }
// Cognito UserPools for SignIn
compile ('com.amazonaws:aws-android-sdk-auth-userpools:2.6.+@aar') { transitive = …Run Code Online (Sandbox Code Playgroud) 我正在尝试对我的应用引擎端点api进行单元测试.我是关注udacity的例子.他们似乎正在使用a LocalServiceTestHelper但我很难理解为什么,因为它以后在代码中没有使用.
这是我的后端gradle文件:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.google.appengine:gradle-appengine-plugin:1.9.28'
}
}
repositories {
jcenter();
}
apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'appengine'
sourceCompatibility = JavaVersion.VERSION_1_7
targetCompatibility = JavaVersion.VERSION_1_7
dependencies {
appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.28'
compile 'com.google.appengine:appengine-endpoints:1.9.28'
compile 'com.google.appengine:appengine-endpoints-deps:1.9.28'
compile 'javax.servlet:servlet-api:2.5'
compile 'com.googlecode.objectify:objectify:5.0.3'
compile 'javax.jdo:jdo-api:3.0.1'
compile 'junit:junit:4.12'
compile 'com.google.appengine:appengine-testing:1.9.24'
}
appengine {
downloadSdk = true
appcfg {
oauth2 = true
}
endpoints {
getClientLibsOnBuild = true
getDiscoveryDocsOnBuild = true
}
}
Run Code Online (Sandbox Code Playgroud)
这是Endpoint测试类(为简明起见,省略了import语句和其他简单的细节):
private …Run Code Online (Sandbox Code Playgroud) 在我的 android 应用程序中,我想要一个 MainActivity,其中有一个占据整个屏幕的谷歌地图。
我的问题是谷歌地图不显示地图,只有左下角的谷歌标志:
以下是应显示地图的主要活动的相关部分:
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback,
NavigationView.OnNavigationItemSelectedListener {
private GoogleMap mMap;
private FragmentManager mFragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
setupLayout();
mFragmentManager = getSupportFragmentManager();
}
/**
* Manipulates the map once available.
* This callback is triggered when the map is ready to be used.
* This is where we can add markers or lines, add listeners or move the camera. In this case, …Run Code Online (Sandbox Code Playgroud) 我想要一个用于我的主要活动的菜单和一个用于主要活动中包含的片段的菜单。当片段可见时,应删除主活动菜单并放大片段菜单。我试图实现这一目标,但结果是这样的:
主要活动菜单片段本身:
显示片段时的主活动菜单片段:
显然,尽管已经创建并扩充了片段菜单,但我并没有替换主要活动中的菜单,而是添加了菜单。
以下是活动中负责此操作的代码:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
// Depending on which fragment is used display different actions.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
Run Code Online (Sandbox Code Playgroud)
以下是片段中负责此操作的代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.friend_menu, menu);
}
Run Code Online (Sandbox Code Playgroud)
这是friend_menu.xml:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:icon="@drawable/ic_person_add_black_24dp"
android:id="@+id/nav_person_add"
android:title="Add people"
app:showAsAction="ifRoom" />
</menu>
Run Code Online (Sandbox Code Playgroud)
如何获得我想要的菜单(不使用搜索操作而使用 add_friend 操作)?我意识到从活动中管理它可能更简单,并且仅在显示片段时才膨胀特定的片段菜单,如活动中的注释所示: …
我有一个带有注册数据库缓存的 Django 应用程序:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'exchange_rate_cache',
}
}
Run Code Online (Sandbox Code Playgroud)
我希望缓存中的条目在一周后过期并被删除。要从缓存中删除条目,只需执行以下操作:
from django.core.cache import cache
cache.delete(key)
Run Code Online (Sandbox Code Playgroud)
但是,只有当条目在缓存中存储超过 1 周时,我才必须执行此操作。
如何才能做到这一点?谢谢你。
当用户在我的android应用中使用firebase进行注册时,会生成一个FirebaseUser对象,然后我从中检索用户令牌,以将其保存为Google Cloud端点后端中每个用户的唯一标识符。
我使用一个auth状态监听器,当用户注册时会被调用:
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
mUserId = user.getToken(true).toString();
SignUpAboutFragment signUpAboutFragment = new SignUpAboutFragment();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.sign_up_fragment_container, signUpAboutFragment, SIGN_UP_ABOUT_FRAGMENT_TAG);
ft.addToBackStack(null);
ft.commit();
}
}
};
Run Code Online (Sandbox Code Playgroud)
然后,将mUserId字段用于将配置文件保存到google数据存储区中:
mPresenter.saveUserData(firstName, lastName, birthday, mUserId, this, MainActivity.class);
Run Code Online (Sandbox Code Playgroud)
在另一个活动中,我还希望使用当前用户令牌来调用我的端点api:
//Different activity to the above.
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
// Using getToken as recommended in the firebase docs.
mUserId = user.getToken(true).toString();
}
Run Code Online (Sandbox Code Playgroud)
当我在2个活动中同时记录两个mUserId字段时,我发现它们是不同的。 …
我正在创建一个自定义用户模型。
我运行命令python manage.py makemigrations accounts然后运行python manage.py migrate accounts它输出以下错误:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line
utility.execute()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/__init__.py", line 359, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/base.py", line 294, in run_from_argv
self.execute(*args, **cmd_options)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/base.py", line 345, in execute
output = self.handle(*args, **options)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 86, in handle
executor.loader.check_consistent_history(connection)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/db/migrations/loader.py", line 292, in check_consistent_history
connection.alias,
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency accounts.0001_initial on …Run Code Online (Sandbox Code Playgroud) android ×8
firebase ×3
java ×3
django ×2
gradle ×2
python ×2
unit-testing ×2
android-menu ×1
aws-sdk ×1
django-cache ×1
django-users ×1
xml ×1