标签: android-testing

在Jenkins上允许不稳定的Android Gradle构建

嗨,我已经在Jenkins上设置了我的Android项目来提供CI.它运行良好,在连接的Android手机上运行测试.测试在Android测试框架上运行,扩展了jUnit3.

不幸的是,如果有任何测试失败,则构建被标记为失败.我希望能够通过两种方式改进这一点:

  1. 允许不稳定的构建
  2. 能够标记已知的测试失败

对于第1项,我尝试将其添加到项目build.gradle中:

connectedCheck {
    ignoreFailures = true
}
Run Code Online (Sandbox Code Playgroud)

但它没有效果.查看构建日志,我意识到实际的测试任务名为connectedInstrumentTest,但未找到此任务:

connectedInstrumentTest {
    ignoreFailures = true
}
Run Code Online (Sandbox Code Playgroud)

原因:

无法在项目':Playtime'上为参数[build_4ldpah0qgf0ukktofecsq41r98 $ _run_closure3 @ 9cd826]找到方法connectedInstrumentTest().

我错过了吗?

谢谢

编辑:继承我的项目build.gradle,没什么特别的:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}
apply plugin: 'android'

dependencies {
    compile files('libs/android-support-v4.jar')
}

android {
    compileSdkVersion 17
    buildToolsVersion "18.0.1"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 16
        testPackageName "com.bb.pt.test"
        testInstrumentationRunner "android.test.InstrumentationTestRunner"
    }
}

connectedCheck {
    ignoreFailures = true
}
Run Code Online (Sandbox Code Playgroud)

我在詹金斯的gradle设置:

switches: --stacktrace --info
tasks: :pt:assembleDebug :pt:assembleTest :pt:connectedCheck
Run Code Online (Sandbox Code Playgroud)

编辑: …

android gradle jenkins android-testing build.gradle

8
推荐指数
1
解决办法
2944
查看次数

使用Mockito和Retrofit 2.0

我正在尝试使用我的api调用(通过Retrofit2.0制作)创建单元测试Mockito.

这似乎是在使用最流行的博客MockitoRetrofit.

http://mdswanson.com/blog/2013/12/16/reliable-android-http-testing-with-retrofit-and-mockito.html

不幸的是,它使用的是早期版本Retrofit,并且取决于CallbacksRetrofitError,它们从2.0中断.

你是怎么做到的Retrofit 2.0

PS:我使用的是RxJava一起retrofit,让一些有工作RxJava将是巨大的.谢谢!

android mockito android-testing rx-java retrofit

8
推荐指数
1
解决办法
1万
查看次数

如何为Android中的深层链接编写测试?

我想使用UI测试框架(Espresso)为深度链接案例编写Android应用程序测试 - 仅使用ACTION_VIEW意图启动应用程序并检查打开屏幕上的所有视图.

但看起来像Espresso(甚至espresso-intents)没有这个功能,并且需要定义Activity类.

我试过这种方式,但它无法正常工作,因为启动了两次应用程序 - 使用AppLauncherActivity标准启动(Espresso需要)并通过深层链接启动.

@RunWith(AndroidJUnit4.class)
public class DeeplinkAppLauncherTest {

    @Rule
    public ActivityTestRule<AppLauncherActivity> activityRule = new ActivityTestRule<>(AppLauncherActivity.class);

    @Test
    public void testDeeplinkAfterScollDownAndBackUp() {
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("myapp://search/777"));
        activityRule.launchActivity(intent);

        onView(withId(R.id.search_panel)).check(matches(isDisplayed()));
    }

}
Run Code Online (Sandbox Code Playgroud)

我想在没有标准启动的情况下仅使用深层链接启动测试应用程序.你知道吗,怎么办?

android deep-linking android-testing android-espresso

8
推荐指数
1
解决办法
1649
查看次数

在演示者类中测试协程

我正在努力测试我的演示者,该演示者从存储库层调用暂停的函数,如下所示:

 override fun viewCreated() {
        launch {
            val hasPermission = permissionChecker.execute() //suspended function
            if (hasPermission) {
                foo()
            } else {
                view.bar()
            }
         }
Run Code Online (Sandbox Code Playgroud)

演示者还在扩展此接口:

interface CoroutinePresenter: CoroutineScope {

val job: Job

override val coroutineContext: CoroutineContext
    get() = Dispatchers.Main + job

fun stopAllActiveJobs() {
    coroutineContext.cancelChildren()
}
Run Code Online (Sandbox Code Playgroud)

暂停功能定义如下:

 suspend fun execute() : Boolean = withContext(Dispatchers.IO) {
    return@withContext class.foo()
}
Run Code Online (Sandbox Code Playgroud)

一切都在应用程序中按预期工作,但是当我尝试编写一些单元测试时,我注意到,每当我在启动时调用一段代码时,线程都会切换,但是测试不会等待执行。这是测试的执行:

@Test
fun `Test of Suspended Function`() = runBlocking {
    presenter.viewCreated()
    then(view).should().bar()
    ...
}
Run Code Online (Sandbox Code Playgroud)

我还添加了建议的测试库,kotlinx-coroutines-test但结果仍然相同。我也试图按照这一建议,并实施像这样,但仍然没有运气。我认为问题在于在演示者中调用 …

android unit-testing kotlin android-testing kotlin-coroutines

8
推荐指数
1
解决办法
218
查看次数

Android espresso-contrib gradle构建失败

我正在尝试学习android espresso ..我遵循了一些基本的教程,它工作正常.但现在我想在android导航抽屉上做一些测试.为此我需要使用gradle依赖androidTestCompile'c​​om.android.support.test.espresso:espresso-contrib:2.2.2',但它导致与其他依赖项冲突.我的gradle文件:

apply plugin: 'com.android.application'

android {
compileSdkVersion 23
buildToolsVersion "23.0.3"

defaultConfig {
    applicationId "my.com.myapp_android"
    minSdkVersion 18
    targetSdkVersion 23
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
}
repositories {
jcenter()
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
//material design
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.android.support:support-v4:23.3.0'

//zxing
compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
compile 'com.google.zxing:core:3.2.1'

//Testing
// Optional -- Mockito framework
testCompile 'org.mockito:mockito-core:1.10.19'
androidTestCompile 'com.android.support:support-annotations:23.3.0'
androidTestCompile 'com.android.support.test:runner:0.5'
androidTestCompile 'com.android.support.test:rules:0.4.1'
// …
Run Code Online (Sandbox Code Playgroud)

android-testing android-gradle-plugin android-espresso

7
推荐指数
1
解决办法
5987
查看次数

浓缩咖啡:断言对话框未显示

如何断言未显示对话框?

目前我有一个测试,检查文本是否不存在于不显示对话框的对话框中

onView(withText("Mobile connection")).inRoot(isDialog()).check(doesNotExist());
Run Code Online (Sandbox Code Playgroud)

但我得到一个 NoMatchingRootException

android.support.test.espresso.NoMatchingRootException: Matcher 'is dialog' did not match any of the following roots: [Root{application-window-token=android.view.ViewRootImpl$W@9acefba, window-token=android.view.ViewRootImpl$W@9acefba, has-window-focus=true, layout-params-type=1, layout-params-string=WM.LayoutParams{(0,0)(fillxfill) ty=1 fl=#81810100 wanim=0x1030465 needsMenuKey=2}, decor-view-string=DecorView{id=-1, visibility=VISIBLE, width=768, height=1280, has-focus=true, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=5}}]
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:1566)
at android.support.test.espresso.base.DefaultFailureHandler.getUserFriendlyError(DefaultFailureHandler.java:92)
at android.support.test.espresso.base.DefaultFailureHandler.handle(DefaultFailureHandler.java:56)
at android.support.test.espresso.ViewInteraction.runSynchronouslyOnUiThread(ViewInteraction.java:184)
at android.support.test.espresso.ViewInteraction.check(ViewInteraction.java:158)
at uk.co.imagitech.learn2.hp.MainActivityConnectedTest.doesntShowMeteredDialogAtStart(MainActivityConnectedTest.java:43)
at java.lang.reflect.Method.invoke(Native Method)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at android.support.test.internal.statement.UiThreadStatement.evaluate(UiThreadStatement.java:55)
at android.support.test.rule.ActivityTestRule$ActivityStatement.evaluate(ActivityTestRule.java:270)
at org.junit.rules.RunRules.evaluate(RunRules.java:20)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at …
Run Code Online (Sandbox Code Playgroud)

android android-dialog android-testing android-espresso

7
推荐指数
1
解决办法
1611
查看次数

如何测试片段场景测试中可见的矢量可绘制对象?

我编写了一些片段场景测试,这些测试将截取屏幕截图和一些点击事件。由于未显示图像视图,很少有测试失败。

测试库( https://developer.android.com/training/basics/fragments/testing )中的测试活动似乎使用 FragmentActivity,它不是 AppCompatActivity 的子类。结果,这些图像视图不可见。我可以添加属性android:src以使其在测试中可见,但这将是一个丑陋的修复。还有其他解决办法吗?

感谢对此的任何评论或建议。

view_item.xml

<ImageView
                android:id="@+id/ivRemove"
                android:layout_width="16dp"
                android:layout_height="16dp"
                android:layout_marginStart="@dimen/spacing_16dp"
                android:layout_marginTop="@dimen/spacing_16dp"
                android:layout_marginBottom="@dimen/spacing_16dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:srcCompat="@drawable/ic_remove" />
Run Code Online (Sandbox Code Playgroud)

构建.gradle.kts

defaultConfig {
        this.testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        this.vectorDrawables.useSupportLibrary = true
    }
Run Code Online (Sandbox Code Playgroud)

android android-testing android-vectordrawable android-fragmentscenario

7
推荐指数
0
解决办法
178
查看次数

使用jetpack compose时在android测试中测试小吃栏

我正在使用 jetpack compose 并使用此代码来显示我的 Snackbar:

 LaunchedEffect(true) {
        viewModel.snackBar.collectLatest { message ->
            scaffoldState.snackbarHostState.currentSnackbarData?.dismiss()
            scaffoldState.snackbarHostState.showSnackbar(message = message)
        }
    }
Run Code Online (Sandbox Code Playgroud)

通常,当我想访问 compose 元素时,我使用testTagin modifier。但 Snackbar 没有。那么我如何测试我的 Snackbar 是否显示特定文本?

我尝试使用:

 composeRule.onNodeWithText(SNACKBAR_MESSAGE).assertIsDisplayed()
Run Code Online (Sandbox Code Playgroud)

但它找不到任何节点。

testing android android-testing android-snackbar android-jetpack-compose

7
推荐指数
1
解决办法
1151
查看次数

Android ViewModel 协程启动测试不等待

我正在尝试使用 Kotlin(1.6.21) Coroutines(1.6.4) 和 Kotlin Flow 进行 ViewModel 测试。

遵循官方Kotlin 协程测试文档,但ViewModel 在测试完成之前不会等待/返回挂起函数的结果。已经浏览了 StackOverflow 的热门答案,并尝试了所有建议的解决方案,例如注入相同的内容CoroutineDispatcher,并传递相同的内容CoroutineScope,但到目前为止没有一个有效。所以在这里我发布当前的简单测试实现。必须发布测试用例中涉及的所有类代码以获得更好的想法。

ReferEarnDetailViewModel.kt:
注入 Usecase 和 CoroutineContextProvider 并使用 viewModelScope 和提供的调度程序调用 API。但是从测试用例调用callReferEarnDetails()后,它不会收集模拟用例方法发出的任何数据。已尝试使用直接 repo 方法调用,也没有 Kotlin 流程,但同样失败。

@HiltViewModel class 
ReferEarnDetailViewModel @Inject constructor(
  val appDatabase: AppDatabase?,
  private val referEarnDetailsUseCase: ReferEarnDetailsUseCase,
  private val coroutineContextProvider: CoroutineContextProvider) : BaseViewModel() {
  
  fun callReferEarnDetails() {
    setProgress(true)
    viewModelScope.launch(coroutineContextProvider.default + handler) {
        
    referEarnDetailsUseCase.execute(UrlUtils.getUrl(R.string.url_referral_detail))
            .collect { referEarnDetail ->
                parseReferEarnDetail(referEarnDetail)
            }
    }
}

 private fun parseReferEarnDetail(referEarnDetail: 
  ResultState<CommonEntity.CommonResponse<ReferEarnDetailDomain>>) {
   when (referEarnDetail) …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-testing android-viewmodel kotlin-coroutines

7
推荐指数
1
解决办法
2160
查看次数

仪表化测试将无法运行——在路径“META-INF/LICENSE.md”中找到 6 个文件

编辑:发现 MockK 导致了这个问题。我猜当我模拟 API 请求时,它会复制这些文件。当我删除 MockK 和/或 Mockito 时。我没有收到这些错误。有任何想法吗?

收到此错误,表明存在这些重复的元数据文件。我尝试在 build.gradle 文件中添加打包选项块以排除这些文件,但随后我的测试根本无法运行。有没有办法手动删除重复项?这些文件将位于哪里?任何帮助是极大的赞赏。我迷路了哈哈。

测试:

    @RunWith(AndroidJUnit4::class)
    class ViewModelTests {
    
        @get:Rule(order = 1)
        val testRule = ActivityScenarioRule(MainActivity::class.java)
    
        private lateinit var viewModel: NewsViewModel
        private lateinit var repositoryImpl: RepositoryImpl
        private val context = InstrumentationRegistry.getInstrumentation().targetContext
    
        @Before
        fun setUp() {
            val newsDao = NewsDatabase.getDatabase(context).myDao()
            val newsApi = mockk<NewsApi>()
            viewModel = mockk()
            repositoryImpl = RepositoryImpl(newsApi, newsDao)
        }
    
        @Test
        fun test_empty_database() = runBlocking {
            assertEquals(0, repositoryImpl.getNewsFromDatabase.value?.size)
        }
    }
Run Code Online (Sandbox Code Playgroud)

错误:任务“:app:mergeDebugAndroidTestJavaResource”执行失败。

执行 com.android.build.gradle.internal.tasks.MergeJavaResWorkAction 时发生故障 从输入中找到路径“META-INF/LICENSE.md”的 6 个文件: - /Users/sammorton/.gradle/caches/modules-2/文件-2.1/org.junit.jupiter/junit-jupiter-params/5.8.2/ddeaf92fc263f895bfb73ffeca7fd56e23c2cce/junit-jupiter-params-5.8.2.jar - …

android gradle kotlin android-testing build.gradle

7
推荐指数
3
解决办法
5329
查看次数