嗨,我已经在Jenkins上设置了我的Android项目来提供CI.它运行良好,在连接的Android手机上运行测试.测试在Android测试框架上运行,扩展了jUnit3.
不幸的是,如果有任何测试失败,则构建被标记为失败.我希望能够通过两种方式改进这一点:
对于第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)
编辑: …
我正在尝试使用我的api调用(通过Retrofit2.0制作)创建单元测试Mockito.
这似乎是在使用最流行的博客Mockito用Retrofit.
http://mdswanson.com/blog/2013/12/16/reliable-android-http-testing-with-retrofit-and-mockito.html
不幸的是,它使用的是早期版本Retrofit,并且取决于Callbacks和RetrofitError,它们从2.0中断.
你是怎么做到的Retrofit 2.0?
PS:我使用的是RxJava一起retrofit,让一些有工作RxJava将是巨大的.谢谢!
我想使用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)
我想在没有标准启动的情况下仅使用深层链接启动测试应用程序.你知道吗,怎么办?
我正在努力测试我的演示者,该演示者从存储库层调用暂停的函数,如下所示:
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
我正在尝试学习android espresso ..我遵循了一些基本的教程,它工作正常.但现在我想在android导航抽屉上做一些测试.为此我需要使用gradle依赖androidTestCompile'com.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) 如何断言未显示对话框?
目前我有一个测试,检查文本是否不存在于不显示对话框的对话框中
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) 我编写了一些片段场景测试,这些测试将截取屏幕截图和一些点击事件。由于未显示图像视图,很少有测试失败。
测试库( 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
我正在使用 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
我正在尝试使用 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
编辑:发现 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-testing ×10
android ×9
kotlin ×3
build.gradle ×2
gradle ×2
deep-linking ×1
jenkins ×1
mockito ×1
retrofit ×1
rx-java ×1
testing ×1
unit-testing ×1