Git Product home page Git Product logo

agent-android's Introduction

Report Portal integration for Android Espresso and JUnit5

DISCLAIMER: We use Google Analytics for sending anonymous usage information such as agent's and client's names, and their versions after a successful launch start. This information might help us to improve both ReportPortal backend and client sides. It is used by the ReportPortal team only and is not supposed for sharing with 3rd parties.

Maven Central CI Build Join Slack chat! stackoverflow Build with Love

The latest version: 5.2.3. Please use Maven Central link above to get the agent. Minimal supported API version: 26

Overview: How to Add ReportPortal integration to Your Android Project

Report Portal supports Android Espresso JUnit 5 tests. The integration is built on top of android-junit5 library by Marcel Schnelle.

To start using Report Portal with Android please do the following steps:

  1. Configuration
    • Add test module
    • Build system configuration
    • Create reportportal.properties configuration file
    • JUnit 5 configuration
    • Debug Manifest file
  2. Logging configuration
  3. Running tests
    • Build system commands
  4. Examples

Configuration

Add test module

To start implementation of Android integration tests you need a separate module inside your project. Open Android Studio and create a Library module:

  1. Right-click on Android project view
  2. Select New -> Module
  3. Select Android Library and click Next
  4. Specify your module name, E.G: :junit5-integration-tests
  5. Specify Language and Bytecode level
  6. Specify Minimum SDK - currently it is API 26: Android 8.0 (Oreo)
  7. Click Finish

Build system configuration

Before you can start test implementation you need to update your build.gradle file with the following steps. Please notice that library versions change rapidly and you should use the latest available versions instead of copy-pasting them from here.

  1. Change library plugin com.android.library on test plugin com.android.test
  2. Add repositories section with our official repository
  3. In the android section:
    • Add targetProjectPath ':your_app_module_name'
    • Add packagingOptions section because Android does not allow duplicate files:
    packagingOptions {
        exclude "META-INF/LICENSE*"
    }
    • Add testOptions which disables animation on emulators to avoid test failures:
    testOptions {
        animationsDisabled=true
    }
  4. In the android.defaultConfig section:
    • Change testInstrumentationRunner on testInstrumentationRunner 'com.epam.reportportal.android.junit5.AndroidJUnit5ReportPortalRunner'
  5. In the dependencies section:
    • Add your application module dependency: implementation project(':your_app_module_name')
    • You can remove these dependencies:
      • implementation 'androidx.core:core-ktx:1.3.2'
      • implementation 'com.google.android.material:material:1.3.0'
      • testImplementation 'junit:junit:4.+'
    • Change androidTestImplementation keyword on implementation for Espresso libraries:
    implementation 'androidx.test.ext:junit:1.1.5'
    implementation 'androidx.test.espresso:espresso-core:3.5.1'
    • Add Report Portal agent dependency:
    implementation ('com.epam.reportportal:agent-android-junit5:5.2.3') {
        exclude group: 'org.aspectj' // AspectJ usually already included by Android
    }
    • Add Android-JUnit5 dependencies:
    implementation 'androidx.test:runner:1.5.2'
    implementation 'de.mannodermaus.junit5:android-test-core:1.4.0'
    implementation 'de.mannodermaus.junit5:android-test-runner:1.4.0'
    • Add JUnit 5 dependencies:
     implementation "org.junit.platform:junit-platform-runner:1.10.0"
     implementation "org.junit.jupiter:junit-jupiter-engine:5.10.0"
    
     // JUnit5 (Optional) If you need "Parameterized Tests"
     implementation "org.junit.jupiter:junit-jupiter-params:5.10.0"

Here is a full example of build.gradle file for Kotlin-based project (remember update library versions):

plugins {
    id 'com.android.test'
    id 'kotlin-android'
}

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 33
    buildToolsVersion "30.0.3"

    targetProjectPath ':app'

    defaultConfig {
        minSdkVersion 26
        targetSdkVersion 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner 'com.epam.reportportal.android.junit5.AndroidJUnit5ReportPortalRunner'

        consumerProguardFiles "consumer-rules.pro"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = JavaVersion.VERSION_1_8
    }
    packagingOptions {
        exclude "META-INF/LICENSE*"
    }
    testOptions {
        animationsDisabled=true
    }
}

dependencies {
    implementation project(':app') // your application project

    // Standard android libraries
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

    // Android libraries for testing Activities
    implementation 'androidx.appcompat:appcompat:1.6.1'

    // Android Espresso libraries
    implementation 'androidx.test.ext:junit:1.1.5'
    implementation 'androidx.test.espresso:espresso-core:3.5.1'

    // Report Portal libraries
    implementation ('com.epam.reportportal:agent-android-junit5:5.2.3') {
        exclude group: 'org.aspectj' // AspectJ usually already included by Android
    }
    implementation 'com.epam.reportportal:logger-java-logback:5.2.2'

    // Logging support, newer versions of logback do not support Android
    implementation 'ch.qos.logback:logback-classic:1.3.12'

    // android-junit5 necessary libraries
    implementation 'androidx.test:runner:1.5.2'
    implementation 'de.mannodermaus.junit5:android-test-core:1.4.0'
    implementation 'de.mannodermaus.junit5:android-test-runner:1.4.0'

    // JUnit5 libraries, 'junit-jupiter-api' is inherited from agent
    implementation "org.junit.platform:junit-platform-runner:1.10.0"
    implementation "org.junit.jupiter:junit-jupiter-engine:5.10.0"

    // JUnit5 (Optional) If you need "Parameterized Tests"
    implementation "org.junit.jupiter:junit-jupiter-params:5.10.0"
}

Create reportportal.properties configuration file

You also need to create a file named reportportal.properties in your project in a source folder src/main/resources (create this folder if necessary):

# '10.0.2.2' - is a special alias to your dev host loopback interface (i.e., 127.0.0.1 on your development machine)
rp.endpoint = http://10.0.2.2:8080
rp.api.key = your_api_key
rp.launch = Android JUnit 5 Tests
rp.project = default_personal

JUnit 5 configuration

JUnit 5 requires additional configuration to work seamlessly on Android:

  1. Create META-INF/services directory inside src/main/resources
  2. Put a file named org.junit.jupiter.api.extension.Extension into the META-INF/services directory with this content:
com.epam.reportportal.android.junit5.AndroidReportPortalExtension
  1. Create a file named junit-platform.properties inside src/main/resources folder with the following content:
junit.jupiter.extensions.autodetection.enabled=true
  1. To enable parallel execution you can add in the junit-platform.properties the following lines:
junit.jupiter.execution.parallel.enabled=true
junit.jupiter.execution.parallel.mode.default=concurrent
junit.jupiter.execution.parallel.config.strategy=fixed
junit.jupiter.execution.parallel.config.fixed.parallelism=5

Debug Manifest file

Report Portal agent uses Rest API calls to report test, but Android does not allow plain text requests by default. To do this please add debug folder inside src folder of your application module and put AndroidManifest.xml file there with the following content (change package attribute on your own):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools" package="com.epam.test">

   <uses-permission android:name="android.permission.INTERNET" />

   <!-- Allow plaintext traffic and disable backups for debug runs-->
   <application
           android:allowBackup="false"
           android:usesCleartextTraffic="true"
           tools:replace="android:allowBackup">
      <activity
              android:name=".path.to.your.Activity"
              android:exported="true">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
   </application>
</manifest>

This overrides some properties in your original manifest allowing plain text requests during the test phase only.

Logging configuration

Logback Framework

Logback dependencies

Put this dependency into dependencies section of your build.gradle file of integration test module:

implementation 'com.epam.reportportal:logger-java-logback:5.2.2'

'logback.xml' file

To add logging configuration put a file named logback.xml into src/main/resources folder:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- Send debug messages to System.out -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- By default, encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %-5level %logger{5} - %thread - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="RP" class="com.epam.reportportal.logback.appender.ReportPortalAppender">
        <encoder>
            <!--Best practice: don't put time and logging level to the final message. Appender do this for you-->
            <pattern>%d{HH:mm:ss.SSS} [%t] %-5level - %msg%n</pattern>
            <pattern>[%t] - %msg%n</pattern>
        </encoder>
    </appender>

    <!--'additivity' flag is important! Without it logback will double-log log messages-->
    <logger name="binary_data_logger" level="TRACE" additivity="false">
        <appender-ref ref="RP"/>
    </logger>

    <!-- Mute Report Portal messages -->
    <logger name="com.epam.reportportal.service" level="WARN"/>
    <logger name="com.epam.reportportal.utils" level="WARN"/>

    <!-- By default, the level of the root level is set to DEBUG -->
    <root level="DEBUG">
        <appender-ref ref="RP"/>
        <!-- Uncomment if you want to see console logs -->
        <!-- <appender-ref ref="STDOUT"/> -->
    </root>
</configuration>

Test run

Build system commands

To run tests from command-line execute:

gradlew junit5-integration-tests:connectedAndroidTest

Examples

Kotlin examples

See: https://github.com/reportportal/android-kotlin-example

Java examples

See: https://github.com/reportportal/android-java-example

agent-android's People

Contributors

hardnorth avatar raikbitters avatar

Stargazers

 avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Forkers

busingebrian

agent-android's Issues

Can't send image to the RP

I try to add a screenshot/image to the report and have an error in the Logger class.

I have logger utils calls:

object LoggingUtils {
    private val LOGGER: Logger = LoggerFactory.getLogger("binary_data_logger")

    fun log(file: String, message: String?) {
        LOGGER.info("RP_MESSAGE#FILE#{}#{}", file, message)
    }

    fun log(bytes: ByteArray?, message: String?) {
        LOGGER.info("RP_MESSAGE#BASE64#{}#{}", Base64.getEncoder().encodeToString(bytes), message)
    }

    fun logBase64(base64: String?, message: String?) {
        LOGGER.info("RP_MESSAGE#BASE64#{}#{}", base64, message)
    }
}

In the test presence code for sending file:

val targetContext = InstrumentationRegistry.getInstrumentation().targetContext
val file = EspressoScreenshot.takeScreenshotPath("rp-test8303202978285528238.png", targetContext)
Log.i("Logi", File(file).exists().toString())
LoggingUtils.log(file, "Android launch with file")

So file locates at this directory: /data/user/0/com.epam.test/cache/rp-test8303202978285528238.png
2021-04-12 11:52:56.943 16833-16869/com.epam.test I/Logi: true

And I have that error:

java.lang.ExceptionInInitializerError
	at org.apache.tika.mime.MimeTypesFactory.create(MimeTypesFactory.java:69)
	at org.apache.tika.mime.MimeTypesFactory.create(MimeTypesFactory.java:100)
	at org.apache.tika.mime.MimeTypesFactory.create(MimeTypesFactory.java:189)
	at org.apache.tika.mime.MimeTypes.getDefaultMimeTypes(MimeTypes.java:604)
	at org.apache.tika.config.TikaConfig.getDefaultMimeTypes(TikaConfig.java:82)
	at org.apache.tika.config.TikaConfig.<init>(TikaConfig.java:247)
	at org.apache.tika.config.TikaConfig.getDefaultConfig(TikaConfig.java:386)
	at org.apache.tika.parser.AutoDetectParser.<init>(AutoDetectParser.java:55)
	at com.epam.reportportal.utils.MimeTypeDetector.<clinit>(MimeTypeDetector.java:37)
	at com.epam.reportportal.utils.MimeTypeDetector.detect(MimeTypeDetector.java:57)
	at com.epam.reportportal.utils.files.Utils.getFile(Utils.java:131)
	at com.epam.reportportal.message.HashMarkSeparatedMessageParser$MessageType$1.toByteSource(HashMarkSeparatedMessageParser.java:54)
	at com.epam.reportportal.message.HashMarkSeparatedMessageParser.parse(HashMarkSeparatedMessageParser.java:116)
	at com.epam.reportportal.logback.appender.ReportPortalAppender.lambda$append$0$ReportPortalAppender(ReportPortalAppender.java:55)
	at com.epam.reportportal.logback.appender.-$$Lambda$ReportPortalAppender$h9OyensytHEmozo0ozSSnM19Lbo.apply(Unknown Source:6)
	at com.epam.reportportal.service.LoggingContext.prepareRequest(LoggingContext.java:131)
	at com.epam.reportportal.service.LoggingContext.lambda$emit$1$LoggingContext(LoggingContext.java:148)
	at com.epam.reportportal.service.-$$Lambda$LoggingContext$K_IOQDBW1XzYIx0WSWzjuqV5Ea4.apply(Unknown Source:8)
	at io.reactivex.internal.functions.Functions$Array2Func.apply(Functions.java:529)
	at io.reactivex.internal.functions.Functions$Array2Func.apply(Functions.java:516)
	at io.reactivex.internal.operators.maybe.MaybeZipArray$ZipCoordinator.innerSuccess(MaybeZipArray.java:111)
	at io.reactivex.internal.operators.maybe.MaybeZipArray$ZipMaybeObserver.onSuccess(MaybeZipArray.java:176)
	at io.reactivex.internal.operators.maybe.MaybeCache.subscribeActual(MaybeCache.java:66)
	at io.reactivex.Maybe.subscribe(Maybe.java:4290)
	at io.reactivex.internal.operators.maybe.MaybeZipArray.subscribeActual(MaybeZipArray.java:62)
	at io.reactivex.Maybe.subscribe(Maybe.java:4290)
	at io.reactivex.internal.operators.maybe.MaybeToFlowable.subscribeActual(MaybeToFlowable.java:45)
	at io.reactivex.Flowable.subscribe(Flowable.java:14918)
	at io.reactivex.Flowable.subscribe(Flowable.java:14865)
	at io.reactivex.internal.operators.flowable.FlowableFlatMap$MergeSubscriber.onNext(FlowableFlatMap.java:163)
	at io.reactivex.internal.operators.flowable.FlowableOnBackpressureBuffer$BackpressureBufferSubscriber.drain(FlowableOnBackpressureBuffer.java:187)
	at io.reactivex.internal.operators.flowable.FlowableOnBackpressureBuffer$BackpressureBufferSubscriber.onNext(FlowableOnBackpressureBuffer.java:112)
	at io.reactivex.internal.operators.flowable.FlowableFromObservable$SubscriberObserver.onNext(FlowableFromObservable.java:54)
	at io.reactivex.subjects.PublishSubject$PublishDisposable.onNext(PublishSubject.java:308)
	at io.reactivex.subjects.PublishSubject.onNext(PublishSubject.java:228)
	at com.epam.reportportal.service.LoggingContext.emit(LoggingContext.java:148)
	at com.epam.reportportal.service.ReportPortal.emitLog(ReportPortal.java:218)
	at com.epam.reportportal.logback.appender.ReportPortalAppender.append(ReportPortalAppender.java:43)
	at com.epam.reportportal.logback.appender.ReportPortalAppender.append(ReportPortalAppender.java:36)
	at ch.qos.logback.core.AppenderBase.doAppend(AppenderBase.java:82)
	at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51)
	at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270)
	at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257)
	at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421)
	at ch.qos.logback.classic.Logger.filterAndLog_2(Logger.java:414)
	at ch.qos.logback.classic.Logger.info(Logger.java:587)
	at com.epam.test.android.espresso.junit5.LoggingUtils.log(LoggingUtils.kt:12)
	at com.epam.test.android.espresso.junit5.UiTest.test_short_password_error_1(UiTest.kt:88)
	at java.lang.reflect.Method.invoke(Native Method)
	at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:688)
	at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
	at android.com.epam.reportportal.junit5.ReportPortalExtension.interceptTestMethod(ReportPortalExtension.java:222)
	at org.junit.jupiter.engine.descriptor.-$$Lambda$gvLh9pTap0g17ZemJcSAjpfE7To.apply(Unknown Source:0)
	at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.execution.-$$Lambda$ExecutableInvoker$ReflectiveInterceptorCall$AfiRfaQW5MFAa8lovVwndaKa8l0.apply(Unknown Source:2)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
	at org.junit.jupiter.engine.execution.-$$Lambda$ExecutableInvoker$hmdF2IKSQSF2OJBv_amWUUg0sS8.apply(Unknown Source:6)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
	at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
	at org.junit.jupiter.engine.descriptor.-$$Lambda$gvLh9pTap0g17ZemJcSAjpfE7To.apply(Unknown Source:0)
	at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
	at org.junit.jupiter.engine.execution.-$$Lambda$ExecutableInvoker$ReflectiveInterceptorCall$AfiRfaQW5MFAa8lovVwndaKa8l0.apply(Unknown Source:2)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
	at org.junit.jupiter.engine.execution.-$$Lambda$ExecutableInvoker$hmdF2IKSQSF2OJBv_amWUUg0sS8.apply(Unknown Source:6)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
	at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
	at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$6$TestMethodTestDescriptor(TestMethodTestDescriptor.java:210)
	at org.junit.jupiter.engine.descriptor.-$$Lambda$TestMethodTestDescriptor$HI566US9RrpykSmg1FzjlYD6qrA.execute(Unknown Source:6)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:206)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:131)
	at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:65)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5$NodeTestTask(NodeTestTask.java:139)
	at org.junit.platform.engine.support.hierarchical.-$$Lambda$NodeTestTask$oEtjVUBr1dzvAyO4rHrqPrrp8iU.execute(Unknown Source:2)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7$NodeTestTask(NodeTestTask.java:129)
	at org.junit.platform.engine.support.hierarchical.-$$Lambda$NodeTestTask$sIF-wJyqQcSlbWMGWi7dBYWbuCo.invoke(Unknown Source:2)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8$NodeTestTask(NodeTestTask.java:127)
	at org.junit.platform.engine.support.hierarchical.-$$Lambda$NodeTestTask$EAUqZA5CfD8zbN3AlxhbCoS66eU.execute(Unknown Source:2)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:185)
	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService.invokeAll(ForkJoinPoolHierarchicalTestExecutorService.java:129)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5$NodeTestTask(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.-$$Lambda$NodeTestTask$oEtjVUBr1dzvAyO4rHrqPrrp8iU.execute(Unknown Source:2)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7$NodeTestTask(NodeTestTask.java:129)
	at org.junit.platform.engine.support.hierarchical.-$$Lambda$NodeTestTask$sIF-wJyqQcSlbWMGWi7dBYWbuCo.invoke(Unknown Source:2)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8$NodeTestTask(NodeTestTask.java:127)
	at org.junit.platform.engine.support.hierarchical.-$$Lambda$NodeTestTask$EAUqZA5CfD8zbN3AlxhbCoS66eU.execute(Unknown Source:2)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:185)
	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService.invokeAll(ForkJoinPoolHierarchicalTestExecutorService.java:129)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5$NodeTestTask(NodeTestTask.java:143)
	at org.junit.platform.engine.support.hierarchical.-$$Lambda$NodeTestTask$oEtjVUBr1dzvAyO4rHrqPrrp8iU.execute(Unknown Source:2)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7$NodeTestTask(NodeTestTask.java:129)
	at org.junit.platform.engine.support.hierarchical.-$$Lambda$NodeTestTask$sIF-wJyqQcSlbWMGWi7dBYWbuCo.invoke(Unknown Source:2)
	at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8$NodeTestTask(NodeTestTask.java:127)
	at org.junit.platform.engine.support.hierarchical.-$$Lambda$NodeTestTask$EAUqZA5CfD8zbN3AlxhbCoS66eU.execute(Unknown Source:2)
	at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:126)
	at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:84)
	at org.junit.platform.engine.support.hierarchical.ForkJoinPoolHierarchicalTestExecutorService$ExclusiveTask.compute(ForkJoinPoolHierarchicalTestExecutorService.java:185)
	at java.util.concurrent.RecursiveAction.exec(RecursiveAction.java:189)
	at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:285)
	at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1155)
	at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1993)
	at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1941)
	at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: java.lang.RuntimeException: problem initializing SAXParser pool
	at org.apache.tika.mime.MimeTypesReader.<clinit>(MimeTypesReader.java:119)
	... 123 more
Caused by: org.apache.tika.exception.TikaException: prooblem creating SAX parser factory
	at org.apache.tika.mime.MimeTypesReader.newSAXParser(MimeTypesReader.java:394)
	at org.apache.tika.mime.MimeTypesReader.setPoolSize(MimeTypesReader.java:378)
	at org.apache.tika.mime.MimeTypesReader.<clinit>(MimeTypesReader.java:117)
	... 123 more
Caused by: org.xml.sax.SAXNotRecognizedException: http://javax.xml.XMLConstants/feature/secure-processing
	at org.apache.harmony.xml.parsers.SAXParserFactoryImpl.setFeature(SAXParserFactoryImpl.java:93)
	at org.apache.tika.mime.MimeTypesReader.newSAXParser(MimeTypesReader.java:390)
	... 125 more

At the RP I see launch with that filed test. This code for adding screenshots works on my web project but fails with android - what do I do wrong?

The project I've got from https://github.com/reportportal/android-kotlin-example

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.