Articles of unit testing

断言ImageView加载了特定的可绘制资源ID

我正在编写一个Robolectricunit testing,我需要断言ImageView上有一个带有特定资源ID的setImageResource(int) 。 我使用fest-android进行断言,但它似乎不包含这个断言。 我还尝试从ImageView获取Robolectric的ShadowImageView ,因为我知道它曾经让你访问它,但它现在已经消失了。 最后,我尝试在我的代码中调用setImageDrawable而不是setImageResource,然后在我的测试断言中这样: assertThat(imageView).hasDrawable(resources.getDrawable(R.drawable.some_drawable)); 但这也失败了,即使失败消息清楚地表明它正在加载相同的Drawable。

连续的Android Junit测试不会反映底层数据库中的实际数据

附加信息: 为了澄清,被测试的应用程序使用ContentProvider来访问数据库。 编辑: 如果有人愿意并且能够帮我调试这个。 完整的项目可在此处获得 。 在issue107-contentprovider分支中, BaseballCardListAddCardsTest 。 题: 当我分别运行两个Android JUnit测试时,它们通过就好了。 但是,当我一起运行它们时,第一个通过,第二个通过。 问题似乎是第一次测试运行会向底层数据库添加一行。 tearDown()正确删除数据库,但第二个测试仍然以ListView显示的脏数据开始,尽管数据库不包含额外的行。 (我使用adb shell确认了这一点。)有没有人有任何想法如何解决这个问题? 可以在此处find正在测试的Activity类。 这是我的测试代码: /** * Tests for the {@link BaseballCardList} activity when the database contains * data. */ public class BaseballCardListWithDataTest extends ActivityInstrumentationTestCase2 { /** * Create instrumented test cases for {@link BaseballCardList}. */ public BaseballCardListWithDataTest() { super(BaseballCardList.class); } […]

当我添加片段自定义转换时,unit testingNPE

当我添加自定义转换时,OnBackPressed()测试会抛出NPE。 没有自定义过渡就没问题。 为什么? 这个NPE只能在unit testing中发生,而不是应用程序。 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 { […]

从InstrumentationTestCase创建通知

我想从unit testing中测试通知是否能够从资产中播放自定义声音。 测试并不是为了validation任何东西,我把它写成一种快速的方式来演示一个function而不会混淆主应用程序代码。 所以在测试项目中,我在/res/raw添加了一个wav文件。 我将在通知构建器中使用此URL: Uri path = Uri.parse(“android.resource:///testsound.wav”); 该URL应该根据我在SO中阅读的问题工作。 我们假设它有效。 现在因为我不想在主项目的/res/raw文件夹中包含测试wav文件,但是在测试项目中,我不得不从InstrumentationTestCase扩展我的unit testing,以便我可以访问测试项目。 这是代码: NotificationCompat.Builder builder = new NotificationCompat.Builder(getInstrumentation().getContext()); … builder.setSound(path, AudioManager.STREAM_NOTIFICATION); … NotificationManager notificationManager = (NotificationManager) getInstrumentation().getContext().getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(NOTIFICATION_ID, builder.build()); notify调用抛出以下exception: java.lang.SecurityException: Calling uid 10198 gave package which is owned by uid 10199 at android.os.Parcel.readException(Parcel.java:1540) at android.os.Parcel.readException(Parcel.java:1493) at android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag(INotificationManager.java:611) at android.app.NotificationManager.notify(NotificationManager.java:187) at android.app.NotificationManager.notify(NotificationManager.java:140) … at […]

将集成测试与Android Studio中的unit testing分开

我正试图在Android Studio 0.9中分离出集成测试。 我已将以下内容添加到构建文件中: sourceSets { integrationTest { java.srcDir file(‘src/integrationTest/java’) } } task integrationTest(type: Test) { testClassesDir = sourceSets.integrationTest.output.classesDir classpath = sourceSets.integrationTest.runtimeClasspath } 我遇到了几个问题: 该任务将运行,但它没有其他项目文件可用,所以我得到有关缺少类的错误。 我发现了一些Java特定的解决方案,例如: http://selimober.com/blog/2014/01/24/separate-unit-and-integration-tests-using-gradle/ https://blog.safaribooksonline.com/2013/08/22/gradle-test-organization/ 但是我还没弄清楚如何使用Android Studio。 main和main.output各种组合以及依赖关系的各种组合似乎不起作用,我得到如下错误: Error:(33, 0) Could not find property ‘main’ on SourceSet container.. 这有意义,因为android插件定义了自己的源集,但这些也不起作用。 IDE无法将该目录识别为测试源目录。 出于测试目的,我将源集名称更改为androidTest并且它正确获取绿色文件夹图标,并且测试与已在androidTest定义的现有unit testing一起运行。

结合androidTest的jacoco覆盖并测试

自从’com.android.tools.build:gradle:1.1.0’发布以来,我将大部分java测试代码从androidTest到test文件夹,因为JVM测试速度要快得多。 但我无法进行所有测试。 我真的需要设备测试,因为有一些ContentProvider东西。 在开始迁移之前,我已经拥有100%的代码覆盖率。 当我正在运行jacoco代码覆盖时,我获得了androidTest文件夹的40%和test文件夹的71%。 我的代码经过100%测试,但我没有报告certificate这一点。 有没有办法合并两份报告? 我find了JacocoMerge但却无法上class。 这是androidTest文件夹的输出: build/outputs/reports/coverage/debug/index.html 这里是使用此gradle任务生成的test文件夹build/reports/jacoco/generateJacocoTestReports/html/index.html输出: def coverageSourceDirs = [ ‘../library/src/main/java’ ] task generateJacocoTestReports(type: JacocoReport, dependsOn: “test”) { group = “Reporting” description = ‘Generate Jacoco Robolectric unit test coverage reports’ classDirectories = fileTree( dir: ‘../library/build/intermediates/classes/debug’, excludes: [‘**//*R.class’, ‘**//*R$*.class’, ‘***/*//*$ViewInjector*.*’, ‘**//*BuildConfig.*’, ‘**//*Manifest*.*’] ) sourceDirectories = files(coverageSourceDirs) additionalSourceDirs = files(coverageSourceDirs) executionData = […]

带有片段的Android应用程序的JUnit测试

我的Android应用程序是基于Single Activity,基于多个片段的模型构建的。 我需要为应用程序进行unit testing。 我可以为app编写unit testing用例,其中包含使用ActivityInstrumentationTestCase2 JUnit的所有活动,但不包含包含片段的app。 请建议为片段编写JUnit测试用例的方法。 谢谢

用于Marshmallow PermissionHelper的Android Robolectricunit testing

我想学习Robolectric用于Android Marshmallow应用程序的unit testing。 我用一些方法编写了一个PermissionHelper ,使权限处理更容易一些。 为了开始这个类的unit testing,我试图测试最简单的方法: public static boolean hasPermissions(Activity activity, String[] permissions) { for (String permission : permissions) { int status = ActivityCompat.checkSelfPermission(activity, permission); if (status == PackageManager.PERMISSION_DENIED) { return false; } } return true; } 这是我到目前为止写的Robolectric测试: @RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class) public class PermissionHelperTest { private PermissionHelper permissionHelper; private ShadowApplication application; @Before public […]

Eclipse中的Androidunit testing:“无法启动测试”

我刚开始尝试在基本上是我的第一个Android应用程序中设置一些unit testing。 我有一段时间为此寻找资源,但最终能够将我希望的正确道路向前推进。 首先,这就是我所做的。 在Eclipse中,我右键单击了我想为其创建测试项目的项目。 我选择了AndroidTools – > New Test Project我填写了必要的信息,为新项目选择../MyApp/tests的位置,并选择MyApp作为要测试的项目。 其他一切都被保留为默认值。 在执行此操作时,我收到以下错误: [2011-04-01 08:13:02 – WPMSTest] R.java手动修改! 恢复生成的版本! 但一切似乎都没问题。 我的tests文件夹中有一个新的源代码树。 所以我尝试通过RunAs – > Android jUnit test执行它(首先在硬件上,然后在模拟器上)。 在两次运行中,我在我的eclipse控制台中收到了以下内容: [2011-04-01 08:23:04 – WPMSTest]在设备模拟器-5554上启动检测android.test.InstrumentationTestRunner [2011-04-01 08:23:04 – WPMSTest]无法启动测试 我的两个清单文件: WPMSTest: WPMS: 我希望有人之前见过这样的事情,并且可以解释我做错了什么。 如果您需要更多文件,请告诉我,我一定会发布。 谢谢!

仅在运行测试时出现DexIndexOverflowException

我可以在调试和发布变体中成功构建和运行我的Android应用程序,没有任何问题。 然而,当我尝试运行我的新unit testing(之前从未有过它)时,我得到了可怕的DexIndexOverflowException 。 我怀疑ProGuard没有运行我的unit testing,但它是我正常的调试和发布buildTypes。 在unit testing运行配置中运行ProGuard需要做什么? 我搜索了Gradle文档, ProGuard文档和Android Studio文档来解决这个问题但我一无所获。