标签: android-testing

使用Robolectric进行Android http测试

我有一个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 robolectric android-testing

11
推荐指数
2
解决办法
6916
查看次数

如何在各种设备上测试android企业应用程序

我正在研究一个大型企业Android应用程序,我们想知道其他公司如何测试他们的应用程序.我们有大约10种设备,我们建议客户使用,因为不可能有各种设备和测试应用程序.

我听说Eset和Sygic也有一些主要支持的设备,他们的应用程序已经过测试,如果出现一些设备特定的错误,他们就会得到那个设备.

我做了一些研究,发现了一些自动化测试工具(如TestDroid).有没有人对TestDroid等自动化测试工具有实际经验?

如果有一个大公司工作的人可以分享测试程序,工具,提示或建议如何测试企业Android应用程序,当存在如此多的具有各种操作系统版本,分辨率和系统扩展的设备(如HTC Sense,三星)时,这将是非常棒的的TouchWiz).

非常感谢你们.

testing android android-ui android-testing

11
推荐指数
1
解决办法
1274
查看次数

如何在Android Espresso测试中测试setResult()?

有没有什么好方法可以在Android Espresso测试中测试结果代码和数据?我正在使用Espresso 2.0.

假设我有一个Activity被叫BarActivity.class,在执行一些动作时,调用setResult(int resultCode, Intent data)适当的有效负载.

我想写一个测试用例来验证resultCodedata.但是,因为setResult()是一种final方法,我无法覆盖它.

我想到的一些选项是:

  • 定义一个新的方法setActivityResult(),只是使用它,以便它可以被拦截,等等......
  • 写一个唯一的测试,测试活动将调用startActivityForResult()BarActivity,并检查结果TestActivity.onActivityResult()

试着想一下这两个邪恶中的哪一个更少,或者是否有关于如何测试这个的任何其他建议.有什么建议?谢谢!

android android-testing android-espresso

11
推荐指数
2
解决办法
3902
查看次数

在多个文件上使用Power Mock运行Robolectric测试时出现ClassCastException异常

所以我在这里根据参考指南设置了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

11
推荐指数
2
解决办法
4262
查看次数

当我添加片段自定义转换时,单元测试NPE

当我添加自定义转换时,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

11
推荐指数
1
解决办法
156
查看次数

如何在attach()中更改活动标题

我想运行一个参数化的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

11
推荐指数
1
解决办法
339
查看次数

androidTest AndroidManifest.xml被忽略了

我有同样的问题,在这篇文章中没有检测到AndroidTest Manifest权限

并且这个帖子中的androidManifest在androidTest目录中被忽略了

- >如果我把测试清单中androidTest,debugAndroidTest,androidTestDebug,它从来没有被拾起和合并.

关于将AndroidManifest.xml放入debug文件夹的答案是正确的; 这似乎确实有效.(将测试清单放入src/debug

我想知道的是为什么你不能把它放在androidTest目录中?我试图弄清楚这一点时所阅读的所有文档都让你听起来像是应该的,如果你不能那么我就会认为这听起来像清单合并中的一些错误.

对于它的价值,我正在使用Android Studio

android android-manifest android-testing

11
推荐指数
1
解决办法
1101
查看次数

如何使Espresso等到Data Binding使用数据模型更新View?

我正在Android应用程序上运行Espresso测试.测试是片状的.它可以可靠地声明数据模型已更新.我的问题是ViewMatchers无法匹配View中的相同值,因为ViewDataBinding尚未更新Views.(至少大部分时间都是测试运行.)

当ViewDataBinding在视图上没有挂起的更改时,是否会出现IdlingResource这样的事情?

我的解决方法是调用executePendingBindings()和一个小的Thread.sleep(...)的组合.

android android-testing android-espresso android-databinding

11
推荐指数
2
解决办法
2113
查看次数

Gradle:没有找到测试

当我尝试通过执行以下命令来运行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.gradlegradle-wrapper.properties文件.

通过将所有内容更新到最新版本(gradle,android插件,构建工具等)无法解决问题

所有测试以前都是成功的.什么可能导致这种神秘回归?谢谢.

android android-testing build.gradle android-gradle-plugin

11
推荐指数
2
解决办法
6104
查看次数

使用AndroidJUnitRunner 1.0.0和AssertJ检测测试失败

我正在尝试将我的项目更新到最近发布的Android测试支持库版本1.0.0.但是如果我添加assertj-core依赖关系,Gradle检测的测试任务会因"找不到测试"消息而开始失败.我可以成功地从IDE运行个别测试.

很容易重现这个问题:

  1. 使用空活动从Android Studio 3创建新项目.
  2. 添加assertj-core依赖项.
  3. 从命令行运行检测测试./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 android-testing android-support-library assertj

11
推荐指数
1
解决办法
446
查看次数