我有一个Android应用程序,其中应用程序的主要部分是APIcalls.java类,我在其中发出http请求以从服务器获取数据并显示应用程序中的数据.
我想为这个Java类创建单元测试,因为它是应用程序的大部分内容.以下是从服务器获取数据的方法:
StringBuilder sb = new StringBuilder();
try {
httpclient = new DefaultHttpClient();
Httpget httpget = new HttpGet(url);
HttpEntity entity = null;
try {
HttpResponse response = httpclient.execute(httpget);
entity = response.getEntity();
} catch (Exception e) {
Log.d("Exception", e);
}
if (entity != null) {
InputStream is = null;
is = entity.getContent();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
reader.close();
} catch (IOException e) {
throw e;
} catch …Run Code Online (Sandbox Code Playgroud) 我正在研究一个大型企业Android应用程序,我们想知道其他公司如何测试他们的应用程序.我们有大约10种设备,我们建议客户使用,因为不可能有各种设备和测试应用程序.
我听说Eset和Sygic也有一些主要支持的设备,他们的应用程序已经过测试,如果出现一些设备特定的错误,他们就会得到那个设备.
我做了一些研究,发现了一些自动化测试工具(如TestDroid).有没有人对TestDroid等自动化测试工具有实际经验?
如果有一个大公司工作的人可以分享测试程序,工具,提示或建议如何测试企业Android应用程序,当存在如此多的具有各种操作系统版本,分辨率和系统扩展的设备(如HTC Sense,三星)时,这将是非常棒的的TouchWiz).
非常感谢你们.
有没有什么好方法可以在Android Espresso测试中测试结果代码和数据?我正在使用Espresso 2.0.
假设我有一个Activity被叫BarActivity.class,在执行一些动作时,调用setResult(int resultCode, Intent data)适当的有效负载.
我想写一个测试用例来验证resultCode和data.但是,因为setResult()是一种final方法,我无法覆盖它.
我想到的一些选项是:
setActivityResult(),只是使用它,以便它可以被拦截,等等......startActivityForResult()上BarActivity,并检查结果TestActivity.onActivityResult()试着想一下这两个邪恶中的哪一个更少,或者是否有关于如何测试这个的任何其他建议.有什么建议?谢谢!
所以我在这里根据参考指南设置了power mock .这一切似乎都可以通过单个测试类完美运行.但是当执行多个JUnit测试时,我在第二个测试类上遇到以下错误.
正如您从下面的堆栈跟踪中看到的,我正在尝试模拟一个otto Bus实例.它似乎在第一个测试类上正确模拟,但在第二个类上我得到了这个类转换异常.
在堆栈跟踪上我得到了禁用Objenisis缓存的建议,但我不知道如何实现这一点,如果这实际上是根本原因,因为我正在使用classloading-xstream:1.6.2根据上面附带的Robolectric Wiki链接.
如果我运行一个JUnit测试类,那么我的设置很有效,但是一旦我尝试在一个包中运行所有测试,只有第一个测试可以工作,后续测试将获得类强制转换异常.
org.mockito.exceptions.base.MockitoException:
ClassCastException occurred while creating the mockito proxy :
class to mock : 'com.squareup.otto.Bus', loaded by classloader : 'org.robolectric.internal.bytecode.InstrumentingClassLoader@1593948d'
created class : 'com.squareup.otto.Bus$$EnhancerByMockitoWithCGLIB$$82a3b196', loaded by classloader : 'org.robolectric.internal.bytecode.InstrumentingClassLoader@1593948d'
proxy instance class : 'com.squareup.otto.Bus$$EnhancerByMockitoWithCGLIB$$82a3b196', loaded by classloader : 'org.mockito.internal.creation.util.SearchingClassLoader@618ff5c2'
instance creation by : ObjenesisInstantiator
You might experience classloading issues, disabling the Objenesis cache *might* help (see MockitoConfiguration)
at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:61)
at org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:49)
at org.powermock.api.mockito.repackaged.CglibMockMaker.createMock(CglibMockMaker.java:24)
at org.powermock.api.mockito.internal.mockmaker.PowerMockMaker.createMock(PowerMockMaker.java:45)
at com.acme.android.myapp.services.gcm.handlers.RequestLogoutHandlerTest.setup(RequestLogoutHandlerTest.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at …Run Code Online (Sandbox Code Playgroud) unit-testing powermock robolectric android-testing powermockito
当我添加自定义转换时,OnBackPressed()测试会抛出NPE .没有自定义过渡就没问题.为什么?
这个NPE只能在单元测试中发生,而不是应用程序.
class MyActivity {
@Override
public void onBackPressed() {
.......
super.onBackPressed();
}
private void putFragment(Fragment fragment) {
String tag = fragment.getClass().getName();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// TEST FAILED IF I ADD THE FOLLOWING LINE
transaction.setCustomAnimations(
R.anim.slide_in_left_fade_in,
R.anim.fade_out_short_anim_time,
R.anim.fade_in_short_anim_time,
R.anim.slide_out_right_fade_out);
transaction.replace(R.id.ub__add_profiles_content, fragment, tag);
transaction.addToBackStack(tag);
transaction.commit();
}
}
class MyActivityTest extends RiderRobolectricBase {
@Test
public void onBackPressed() {
putFragment(someFragment);
mMyActivity.onBackPressed();
}
}
Run Code Online (Sandbox Code Playgroud)
例外:
java.lang.NullPointerException
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1304)
at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:909)
at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1625)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:561)
at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:166)
at MyActivity.onBackPressed(MyActivity.java:28)
Run Code Online (Sandbox Code Playgroud) android unit-testing nullpointerexception android-fragments android-testing
我想运行一个参数化的Instrumentation Test,它具有不同的语言环境,可以使用所有支持的语言运行相同的测试.
观察到的行为是,对于每个后续运行,活动都将具有第一次测试运行的本地化标题.因此,无论我的手机使用哪种语言,标题都将针对第一个参数化测试运行进行正确本地化,并且对于每个后续版本仍然相同.
虽然覆盖区域设置本身适用于任何资源,它会工作只有一次的活动标题,如果设置由AndroidManifest.xml.
活动似乎得到了他们的标题设置attach,无论调用附件似乎是缓存应用程序首次启动的区域设置中的标题.
final void attach(Context context, ActivityThread aThread,
Instrumentation instr, IBinder token, int ident,
Application application, Intent intent, ActivityInfo info,
---> CharSequence title, Activity parent, String id,
NonConfigurationInstances lastNonConfigurationInstances,
Configuration config, String referrer, IVoiceInteractor voiceInteractor) {
attachBaseContext(context);
Run Code Online (Sandbox Code Playgroud)
由于资源总是被正确地本地化,因此解决方法是调用setTitle(R.string.title)或只是getActionBar().setTitle(R.string.setTitle),但我不想仅为了测试目的而更改活动.
问题:如何在第一次测试运行后更改活动的标题?如上所述,这似乎被缓存并且没有正确更新,并且杀死应用程序以重新启动它将无法进行检测测试.
整个测试项目可以在GitHub上找到(Localization.java包含当前失败的单元测试和此处描述的问题)并且正在使用参数化单元测试UIAutomator.
我们的目标是在不了解应用程序本身(UIAutomator)的情况下拍摄一批截图,并且不需要为测试修改应用程序.
我在每次测试之前都成功地更改了语言环境,并通过执行以下操作正确显示了我的文本,同时我还有多个断言确保资源实际上是正确的语言环境.
public LocalizationTest(Locale locale) …Run Code Online (Sandbox Code Playgroud) android android-activity android-testing android-instrumentation android-uiautomator
我有同样的问题,在这篇文章中没有检测到AndroidTest Manifest权限
并且这个帖子中的androidManifest在androidTest目录中被忽略了
- >如果我把测试清单中androidTest,debugAndroidTest,androidTestDebug,它从来没有被拾起和合并.
关于将AndroidManifest.xml放入debug文件夹的答案是正确的; 这似乎确实有效.(将测试清单放入src/debug
我想知道的是为什么你不能把它放在androidTest目录中?我试图弄清楚这一点时所阅读的所有文档都让你听起来像是应该的,如果你不能那么我就会认为这听起来像清单合并中的一些错误.
对于它的价值,我正在使用Android Studio
我正在Android应用程序上运行Espresso测试.测试是片状的.它可以可靠地声明数据模型已更新.我的问题是ViewMatchers无法匹配View中的相同值,因为ViewDataBinding尚未更新Views.(至少大部分时间都是测试运行.)
当ViewDataBinding在视图上没有挂起的更改时,是否会出现IdlingResource这样的事情?
我的解决方法是调用executePendingBindings()和一个小的Thread.sleep(...)的组合.
android android-testing android-espresso android-databinding
当我尝试通过执行以下命令来运行Android测试时:
./gradlew connectedDebugAndroidTest
Run Code Online (Sandbox Code Playgroud)
发生以下错误:
com.android.builder.testing.ConnectedDevice > No tests found.[devicename] FAILED
No tests found. This usually means that your test classes are not in the form that your test runner expects (e.g. don't inherit from TestCase or lack @Test annotations).
:connectedDebugAndroidTest FAILED
FAILURE: Build failed with an exception.
Run Code Online (Sandbox Code Playgroud)
我还没有做出任何更改到build.gradle或gradle-wrapper.properties文件.
通过将所有内容更新到最新版本(gradle,android插件,构建工具等)无法解决问题
所有测试以前都是成功的.什么可能导致这种神秘回归?谢谢.
我正在尝试将我的项目更新到最近发布的Android测试支持库版本1.0.0.但是如果我添加assertj-core依赖关系,Gradle检测的测试任务会因"找不到测试"消息而开始失败.我可以成功地从IDE运行个别测试.
很容易重现这个问题:
assertj-core依赖项../gradlew connectedDebugAndroidTest.Gradle脚本.
android {
defaultConfig {
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
dependencies {
implementation 'com.android.support:appcompat-v7:26.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.0'
androidTestImplementation group: "org.assertj", name: "assertj-core", version: "2.8.0"
}
Run Code Online (Sandbox Code Playgroud)
控制台输出.
com.android.builder.testing.ConnectedDevice > No tests found.
[Nexus_4_API_25(AVD) - 7.1.1] FAILED
No tests found. This usually means that your test classes are not in the form that your test runner expects (e.g. don't inherit from TestCase or lack …Run Code Online (Sandbox Code Playgroud) android-testing ×10
android ×9
robolectric ×2
unit-testing ×2
android-ui ×1
assertj ×1
build.gradle ×1
powermock ×1
powermockito ×1
testing ×1