配置测试记录以进行仪器化测试。

4
我想配置针对我的仪器测试的`testLogging`。但是,Gradle似乎忽略了我在`android.testOptions.unitTests.all.testLogging`中的配置。我已经配置所有通过和失败的测试都应该被记录,但是跳过的测试不应该被记录。然而,Gradle没有记录我的通过测试,但却记录了我的跳过测试。 build.gradle:
plugins {
    id 'com.android.application'
}

android {
    compileSdk 31

    defaultConfig {
        applicationId 'com.example.myapplication'
        minSdk 26
        targetSdk 31
        versionCode 1
        versionName '1.0'

        testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    testOptions {
        unitTests {
            all {
                testLogging {
                    events = ["passed", "failed"]
                }
            }
        }
    }
}

dependencies {
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    androidTestImplementation 'androidx.test:runner:1.4.0'
}

ExampleInstrumentedTest.java:

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import org.junit.Ignore;
import org.junit.Test;

public class ExampleInstrumentedTest {
    @Test
    public void passedTest() {
        assertEquals(2, 1 + 1);
    }

    @Test
    public void failedTest() {
        assertEquals(3, 1 + 1);
    }

    @Test
    @Ignore
    public void skippedTest() {
        fail("Should be skipped");
    }
}

很遗憾,Gradle没有考虑到我的测试日志配置。除了我的Gradle配置外,跳过的测试会输出,但通过的测试不会输出。

输出

> Task :app:connectedDebugAndroidTest
Starting 3 tests on test(AVD) - 12

com.example.myapplication.ExampleInstrumentedTest > skippedTest[test(AVD) - 12] SKIPPED 

com.example.myapplication.ExampleInstrumentedTest > failedTest[test(AVD) - 12] FAILED 
    java.lang.AssertionError: expected:<3> but was:<2>
    at org.junit.Assert.fail(Assert.java:88)
Tests on test(AVD) - 12 failed: There was 1 failure(s).

我已经将完整的最小示例项目托管在GitHub上:pmwmedia/android-test-example

2个回答

1

很遗憾,这是不可能的,因为connected${Variant}AndroidTest任务不继承自Gradle的AbstractTestTask,因此testOptions.unitTests对于Android仪器化测试没有影响。

除非您以某种方式扩展Android的连接测试任务并实现自定义任务,以补充Gradle的testLogging扩展,否则您将无法做到这一点。

您可以在这里检查任务源代码,在这里是实际记录日志的地方。


0

通过一些反射和自定义类,这是可能的。

虽然不是最好的代码,但像这样的代码可以让您以某种方式自定义日志记录(使用AGP 7.4):

tasks.withType<com.android.build.gradle.internal.tasks.DeviceProviderInstrumentTestTask> {
    val field = javaClass.superclass.superclass.superclass.superclass.superclass.superclass.getDeclaredField("logger")
    field.isAccessible = true
    val defaultLogger = field.get(this)
    val delegate = defaultLogger.javaClass.getDeclaredField("delegate").apply { isAccessible = true }.get(defaultLogger) as Logger
    field.set(this, CustomInstrumentationTestsLogger(delegate))
 }
        
class CustomInstrumentationTestsLogger(delegate: Logger) :
       org.gradle.internal.logging.slf4j.DefaultContextAwareTaskLogger(delegate) {
       ...
}

然后,您可以重写isEnabledlog(或其他)方法,以切换某些消息的日志级别。

这是一个不太正规的解决方法,但它有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接