3

私はTravis CIを使用して、そのテストを実行してcodecovで結果を確認しようとしています。Travis CI&CodeCov Android

.travis.yml:

language: android 
sudo: required 
jdk: oraclejdk8 

before_cache: 
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock 
- rm -fr $HOME/.gradle/caches/*/plugin-resolution/ 

cache: 
directories: 
- $HOME/.gradle/caches/ 
- $HOME/.gradle/wrapper/ 

env: 
global: 
- ANDROID_API=25 
- EMULATOR_API=21 
- ANDROID_BUILD_TOOLS=25.0.0 
- ADB_INSTALL_TIMEOUT=5 # minutes 

android: 
components: 
- tools 
- platform-tools 
- build-tools-$ANDROID_BUILD_TOOLS 
- android-$ANDROID_API 
- android-$EMULATOR_API_LEVEL 
- extra-google-m2repository 
- extra-android-m2repository # for design library 
- addon-google_apis-google-19 # google play services 
- sys-img-armeabi-v7a-addon-google_apis-google-$ANDROID_API_LEVEL 
- sys-img-armeabi-v7a-addon-google_apis-google-$EMULATOR_API_LEVEL 

licenses: 
- android-sdk-preview-license-.+ 
- android-sdk-license-.+ 
- google-gdk-license-.+ 

before_install: 
- mkdir "$ANDROID_HOME/licenses" || true 
- echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license" 
- echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license" 
- chmod +x gradlew 
#- ./gradlew dependencies || true # DON'T ADD unless you are getting "Install missing components using SDK manager" 
#Source: https://medium.com/@oldergod/constraint-layout-and-circleci-travis-d50342696d2 



script: 
    - ./gradlew build jacocoTestReport assembleAndroidTest 
    - echo no | android create avd --force -n test -t android-21 --abi armeabi-v7a 
    - emulator -avd test -no-skin -no-audio -no-window & 
    - android-wait-for-emulator 
    - adb shell setprop dalvik.vm.dexopt-flags v=n,o=v 
    - ./gradlew connectedCheck 

after_success: 
- bash <(curl -s https://codecov.io/bash) 

build.gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules. 

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.2.2' 
     classpath 'com.dicedmelon.gradle:jacoco-android:0.1.1' 
     // NOTE: Do not place your application dependencies here; they belong 
     // in the individual module build.gradle files 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
    } 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

はbuild.gradle(アプリ):

apply plugin: 'com.android.application' 
apply plugin: 'jacoco-android' 

android { 
    compileSdkVersion 24 
    buildToolsVersion "24.0.3" 
    defaultConfig { 
     applicationId "<ID>" 
     minSdkVersion 15 
     targetSdkVersion 24 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     vectorDrawables.useSupportLibrary = true 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
     debug { 
      testCoverageEnabled true 
     } 
    } 
    testOptions { 
     unitTests.returnDefaultValues = true 
    } 
    lintOptions { 
     abortOnError false 
    } 
    productFlavors { 
     free {} 
     paid {} 
    } 


    packagingOptions { 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE.txt' 
    } 
} 

dependencies { 
    compile files('libs/httpclient-4.5.1.jar') 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:24.2.1' 
    compile 'com.android.support:support-v4:24.2.1' 
    compile 'com.android.support:design:24.2.1' 
    compile 'com.android.support:support-vector-drawable:24.2.1' 
    testCompile 'junit:junit:4.12' 
    compile files('libs/themoviedbapi-4.3.jar') 
    compile files('libs/api-common-2.0.jar') 
    compile files('libs/commons-codec-1.9.jar') 
    compile files('libs/commons-lang3-3.4.jar') 
    compile files('libs/httpcore-4.4.3.jar') 
    compile files('libs/jackson-annotations-2.7.1.jar') 
    compile files('libs/jackson-core-2.7.1.jar') 
    compile files('libs/jackson-databind-2.7.1.jar') 
    compile files('libs/slf4j-api-1.7.16.jar') 
} 

我々が実行しようとしているテストがあります計装試験。トラヴィスログの出力は次のようになります。

com.example.fabian.tinf15b4_lsmf.SeeMovieDetailsTest > seeMovieDetails[test(AVD) - 5.0.2] [31mFAILED [0m 
    java.lang.NoSuchMethodError: No virtual method releaseConnection()V in class Lorg/apache/http/client/methods/HttpRequestBase; or its super classes (declaration of 'org.apache.http.client.methods.HttpRequestBase' appears in /system/framework/ext.jar) 

    at org.yamj.api.common.http.DigestedResponseReader.processRequest(DigestedResponseReader.java:119) 

Tests on test(AVD) - 5.0.2 failed: Instrumentation run failed due to 'java.lang.NoSuchMethodError' 
:app:connectedFreeDebugAndroidTest FAILED 

は、単に2つの数値を加算して、結果を確認自動生成されたテストがあったが、トラヴィスもそれを通過しませんでした。

誰でもこの混乱を修正できますか?

+0

私はHttpClientを使用していませんが、おそらくあなたに役立ついくつかの関連する回答の下に追加しました。 – albodelu

答えて

0

this related questionHTTPClient - NoSuchMethodError for .releaseConnectionを読んでください。

definetely 4.2 versionで添加したHttpRequestBase#releaseConnection()方法。

あなたはおそらくジャーナリストです。コンパイラにコンパイルエラーがない場合、 クラスの別のバージョンを実行時にロードすることができます。実際の原因 はビルドツールによって異なります。あなたがmaven/gradleを使用しているなら、 は推移的な依存関係があります。

したがって、実際にはHttpRequestBase#releaseConnection()メソッドは、AbstractExecutionAwareRequest#reset()への呼び出し のプロキシだけです。そして AbstractExecutionAwareRequest#reset()キャンセル方法の実行のみ。 おそらくそれはあなたが必要とするものではありません。

httpClientリソースを実行して解放する正しい方法は、 httpResponseを閉じることです。つまり、httpClientの internal threadPoolでスレッドを解放できます。あなたは.releaseConnection()はもはや使用されていることを (それは推奨されません)、 ではなく、応答オブジェクトが接続を確保するために閉じられて表示されますquickstart

private static String makeRequest(HttpUriRequest httpRequest) throws IOException { 
     CloseableHttpResponse httpResponse = httpClient.execute(httpRequest); 
     try { 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      StringWriter writer = new StringWriter(); 
      IOUtils.copy(httpEntity.getContent(), writer, "UTF-8"); 
      return writer.toString(); 
     } finally { 
      httpResponse.close(); 
     } 
    } 

が閉鎖されています。

hereから)異なるhttpclientまたはhttpcoreバージョン試してみてください:あなたは BasicHttpContextの古い/新しいバージョンとjarファイルを持っているように見えます

を。直接衝突があった場合は、 ClassNotFoundExceptionが返されます。 ClassLoadersは、これについての典型的なジャークです 種類のものです。この場合、クラスは存在しますが、他のライブラリ(Contextを呼び出すのは というhttpclientだと思います)がコンパイルされたメソッドは、 というメソッドを持っていません。また、あなたの/app/build.gradle like thisthe removed apache libraryを追加することができ23+ APIについては

android { 
compileSdkVersion 24 
buildToolsVersion "24.0.3" 
    useLibrary 'org.apache.http.legacy' 
    ... 
} 

のAndroid 6.0のリリースは、Apache HTTPクライアントのサポートを削除します。 アプリがこのクライアントを使用していて、Android 2.3(APIレベル9)または をターゲットにしている場合は、代わりにHttpURLConnectionクラスを使用してください。このAPI効率的な...

this articlethis sample よりは、Androidとトラビス-CIのためCodecovを設定するのに便利に見えるさ:

計測テストコードカバレッジレポートを生成すると、ビルドに マイナーな変更を必要としますスクリプト。

android { 
    buildTypes { 
    debug { 
     testCoverageEnabled true 
    } 
    } 
} 

カバレッジレポートによって我々のテストを無視して回避するために、我々は に必要な以下の設定を行います。

android { 
    testOptions { 
    unitTests.all { 
     jacoco { 
     includeNoLocationClasses = true 
     } 
    } 
    } 
} 

次に、我々は、レポート出力を設定する必要があります。

jacocoAndroidUnitTestReport { 
    csv.enabled false 
    html.enabled true 
    xml.enabled true 
}