Android 浓缩咖啡失败时设置生成失败
Gradle在单元测试失败时将构建设置为失败,但在插入指令的测试失败时将构建设置为成功(在我的例子中是espresso)。有人知道如何在espresso失败时强制构建失败吗Android 浓缩咖啡失败时设置生成失败,android,jenkins,gradle,automated-tests,android-espresso,Android,Jenkins,Gradle,Automated Tests,Android Espresso,Gradle在单元测试失败时将构建设置为失败,但在插入指令的测试失败时将构建设置为成功(在我的例子中是espresso)。有人知道如何在espresso失败时强制构建失败吗 Ops:需要与Jenkins集成,所以当单元测试和浓缩咖啡测试失败时,它一定会失败,并且不想使用Jenkins文本查找插件。为了让大家知道,我创建了一个解决方案,答案如下:,我做到了 并执行./gradlew connectedAndroidTest——继续 现在,它对这两种风格都运行了所有检测测试,如果其中任何一种失败,构
Ops:需要与Jenkins集成,所以当单元测试和浓缩咖啡测试失败时,它一定会失败,并且不想使用Jenkins文本查找插件。为了让大家知道,我创建了一个解决方案,答案如下:,我做到了 并执行./gradlew connectedAndroidTest——继续
现在,它对这两种风格都运行了所有检测测试,如果其中任何一种失败,构建也会失败。为了让大家知道,我找到了一个解决方案,答案如下:,我做到了 并执行./gradlew connectedAndroidTest——继续
现在,它为这两种风格运行所有检测测试,如果其中任何一种失败,构建也会失败。我找到了更干净的解决方案,在root build.gradle中使用:
//if in start command "--continue" was added, then apply ignoring for android test fails
gradle.taskGraph.whenReady { graph ->
if (gradle.startParameter.continueOnFailure) {
graph.allTasks.findAll { it.name ==~ /connected.*AndroidTest/ }*.ignoreFailures = true
}
}
我找到了更干净的解决方案,在root build.gradle中使用:
//if in start command "--continue" was added, then apply ignoring for android test fails
gradle.taskGraph.whenReady { graph ->
if (gradle.startParameter.continueOnFailure) {
graph.allTasks.findAll { it.name ==~ /connected.*AndroidTest/ }*.ignoreFailures = true
}
}
这个解决方案对我有效。 将此代码添加到UI测试类:
// Use this TestRule to setup IdlingResource
@Rule
@JvmField
val mIdlingResourceTestRule = CustomIdlingResTestRule()
这是CustomIdlingResTestRule的代码:
import androidx.test.espresso.IdlingPolicies
import androidx.test.espresso.IdlingRegistry
import com.jakewharton.espresso.OkHttp3IdlingResource
import com.kasikorn.retail.mbanking.kplus.basemodule.AppModule
import com.kasikorn.retail.mbanking.kplus.util.OkHttpProvider
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement
import java.util.concurrent.TimeUnit
/**
* TestRule class help to setup IdlingResource
*/
class CustomIdlingResTestRule : TestRule {
protected var mIdlingResource: CustomIdlingResource = CustomIdlingResource()
val idlingResourceOkHttp: OkHttp3IdlingResource by lazy {
OkHttp3IdlingResource.create(AppModule.APP_CONTEXT, OkHttpProvider.getOkHttpInstance())
}
override fun apply(base: Statement?, description: Description?): Statement {
return object : Statement() {
override fun evaluate() {
IdlingPolicies.setMasterPolicyTimeout(60, TimeUnit.SECONDS)
IdlingPolicies.setIdlingResourceTimeout(26, TimeUnit.SECONDS)
IdlingRegistry.getInstance().register(idlingResourceOkHttp, mIdlingResource)
//NOTE: use try cache to ignore UI Test Failures
try {
base?.evaluate()
} catch (e: Throwable) {
e.printStackTrace()
}
IdlingRegistry.getInstance().unregister(idlingResourceOkHttp, mIdlingResource)
}
}
}
}
import android.app.Activity
import android.util.Log
import androidx.test.espresso.IdlingResource
import androidx.test.espresso.core.internal.deps.guava.collect.Iterables
import androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry
import androidx.test.runner.lifecycle.Stage
class CustomIdlingResource() : IdlingResource {
private var mIsIdle = false
private var resourceCallback: IdlingResource.ResourceCallback? = null
override fun getName(): String = this.javaClass.simpleName
override fun isIdleNow(): Boolean {
if (mIsIdle) return true
val currentActivity = getCurrentActivity()
Log.d("LOG", this.javaClass.simpleName + " | isIdleNow() | currentActivity: $currentActivity")
if (currentActivity != null) {
mIsIdle = true
resourceCallback?.onTransitionToIdle()
}
return mIsIdle
}
override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) {
this.resourceCallback = callback
}
private fun getCurrentActivity(): Activity? {
val activity = arrayOfNulls<Activity>(1)
val activities: Collection<Activity> = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED)
activity[0] = Iterables.getOnlyElement(activities)
return activity[0]
}
}
导入androidx.test.espresso.IdlingPolicies
导入androidx.test.espresso.IdlingRegistry
导入com.jakewharton.espresso.OkHttp3IdlingResource
导入com.kasikorn.retail.mbanking.kplus.basemodule.AppModule
导入com.kasikorn.retail.mbanking.kplus.util.OkHttpProvider
导入org.junit.rules.TestRule
导入org.junit.runner.Description
导入org.junit.runners.model.Statement
导入java.util.concurrent.TimeUnit
/**
*TestRule类帮助设置IdlingResource
*/
类CustomIdlingResTestRule:TestRule{
受保护的var mIdlingResource:CustomIdlingResource=CustomIdlingResource()
val idlingresourcecokhttp:OkHttp3IdlingResource by lazy{
OkHttp3IdlingResource.create(AppModule.APP_上下文,OkHttpProvider.getOkHttpInstance())
}
覆盖应用(基:语句?,描述:描述?:语句){
返回对象:语句(){
重写{
IdlingPolicys.setMasterPolicyTimeout(60,时间单位:秒)
IdlingPolicys.setIdlingResourceTimeout(26,时间单位。秒)
IdlingRegistry.getInstance().register(IdlingResourceCeOkhttp,mIdlingResource)
//注意:使用try-cache忽略UI测试失败
试一试{
base?.evaluate()
}捕获(e:可丢弃){
e、 printStackTrace()
}
IdlingRegistry.getInstance().unregister(IdlingResourceCeOkhttp,mIdlingResource)
}
}
}
}
导入android.app.Activity
导入android.util.Log
导入androidx.test.espresso.IdlingResource
导入androidx.test.espresso.core.internal.deps.guava.collect.Iterables
导入androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry
导入androidx.test.runner.lifecycle.Stage
类CustomIdlingResource():IdlingResource{
私有变量mIsIdle=false
私有变量resourceCallback:IdlingResource.resourceCallback?=null
override fun getName():String=this.javaClass.simpleName
重写isIdleNow():布尔值{
如果(mIsIdle)返回true
val currentActivity=getCurrentActivity()
Log.d(“Log”,this.javaClass.simpleName+“|isIdleNow()|currentActivity:$currentActivity”)
如果(currentActivity!=null){
mIsIdle=true
resourceCallback?.onTransitionToIdle()
}
返回错误怠速
}
重写fun registerIdleTransitionCallback(回调:IdlingResource.ResourceCallback?){
this.resourceCallback=callback
}
私人娱乐getCurrentActivity():活动{
val活动=arrayOfNulls(1)
val活动:Collection=ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.recovered)
活动[0]=Iterables.getOnlyElement(活动)
返回活动[0]
}
}
这个解决方案适合我。
将此代码添加到UI测试类:
// Use this TestRule to setup IdlingResource
@Rule
@JvmField
val mIdlingResourceTestRule = CustomIdlingResTestRule()
这是CustomIdlingResTestRule的代码:
import androidx.test.espresso.IdlingPolicies
import androidx.test.espresso.IdlingRegistry
import com.jakewharton.espresso.OkHttp3IdlingResource
import com.kasikorn.retail.mbanking.kplus.basemodule.AppModule
import com.kasikorn.retail.mbanking.kplus.util.OkHttpProvider
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement
import java.util.concurrent.TimeUnit
/**
* TestRule class help to setup IdlingResource
*/
class CustomIdlingResTestRule : TestRule {
protected var mIdlingResource: CustomIdlingResource = CustomIdlingResource()
val idlingResourceOkHttp: OkHttp3IdlingResource by lazy {
OkHttp3IdlingResource.create(AppModule.APP_CONTEXT, OkHttpProvider.getOkHttpInstance())
}
override fun apply(base: Statement?, description: Description?): Statement {
return object : Statement() {
override fun evaluate() {
IdlingPolicies.setMasterPolicyTimeout(60, TimeUnit.SECONDS)
IdlingPolicies.setIdlingResourceTimeout(26, TimeUnit.SECONDS)
IdlingRegistry.getInstance().register(idlingResourceOkHttp, mIdlingResource)
//NOTE: use try cache to ignore UI Test Failures
try {
base?.evaluate()
} catch (e: Throwable) {
e.printStackTrace()
}
IdlingRegistry.getInstance().unregister(idlingResourceOkHttp, mIdlingResource)
}
}
}
}
import android.app.Activity
import android.util.Log
import androidx.test.espresso.IdlingResource
import androidx.test.espresso.core.internal.deps.guava.collect.Iterables
import androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry
import androidx.test.runner.lifecycle.Stage
class CustomIdlingResource() : IdlingResource {
private var mIsIdle = false
private var resourceCallback: IdlingResource.ResourceCallback? = null
override fun getName(): String = this.javaClass.simpleName
override fun isIdleNow(): Boolean {
if (mIsIdle) return true
val currentActivity = getCurrentActivity()
Log.d("LOG", this.javaClass.simpleName + " | isIdleNow() | currentActivity: $currentActivity")
if (currentActivity != null) {
mIsIdle = true
resourceCallback?.onTransitionToIdle()
}
return mIsIdle
}
override fun registerIdleTransitionCallback(callback: IdlingResource.ResourceCallback?) {
this.resourceCallback = callback
}
private fun getCurrentActivity(): Activity? {
val activity = arrayOfNulls<Activity>(1)
val activities: Collection<Activity> = ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(Stage.RESUMED)
activity[0] = Iterables.getOnlyElement(activities)
return activity[0]
}
}
导入androidx.test.espresso.IdlingPolicies
导入androidx.test.espresso.IdlingRegistry
导入com.jakewharton.espresso.OkHttp3IdlingResource
导入com.kasikorn.retail.mbanking.kplus.basemodule.AppModule
导入com.kasikorn.retail.mbanking.kplus.util.OkHttpProvider
导入org.junit.rules.TestRule
导入org.junit.runner.Description
导入org.junit.runners.model.Statement
导入java.util.concurrent.TimeUnit
/**
*TestRule类帮助设置IdlingResource
*/
类CustomIdlingResTestRule:TestRule{
受保护的var mIdlingResource:CustomIdlingResource=CustomIdlingResource()
val idlingresourcecokhttp:OkHttp3IdlingResource by lazy{
OkHttp3IdlingResource.create(AppModule.APP_上下文,OkHttpProvider.getOkHttpInstance())
}
覆盖应用(基:语句?,描述:描述?:语句){
返回对象:语句(){
重写{
IdlingPolicys.setMasterPolicyTimeout(60,时间单位:秒)
IdlingPolicys.setIdlingResourceTimeout(26,时间单位。秒)
IdlingRegistry.getInstance().register(IdlingResourceCeOkhttp,mIdlingResource)
//注意:使用try-cache忽略UI测试失败
试一试{
base?.evaluate()
}捕获(e:可丢弃){
e、 printStackTrace()
}
IdlingRegistry.getInstance().unregister(IdlingResourceCeOkhttp,mIdlingResource)
}
}
}
}
导入android.app.Activity
导入android.util.Log
导入androidx.test.espresso.IdlingResource
导入androidx.test.espresso.core.internal.deps.guava.collect.Iterables
导入androidx.test.runner.lifecycle.ActivityLifecycleMonitorRegistry
导入androidx.test.runner.lifecycle.Stage
类CustomIdlingResource():IdlingReso