我目前设置了Travis-CI,以便在我的
Android设备的每个版本上运行gradle ConnectedCheck任务并执行我的所有单元测试.我已经能够成功地设置它.我现在正在尝试用Espresso构建一些功能测试,我目前遇到很多困难,设置Travis的方式使我的espresso测试可以与Travis的模拟器交互.我如何设置Travis以使其模拟器的工作方式与我在本地工作站上使用的模拟器完全相同?
这是我用来构建模拟器的.travis.yml的一部分.
language: android jdk: oraclejdk7 env: matrix: - ANDROID_TARGET=android-19 ANDROID_ABI=armeabi-v7a android: components: - build-tools-20.0.0 - build-tools-19.1.0 before_script: # Create and start emulator - echo no | android create avd --force -n test -t $ANDROID_TARGET --abi $ANDROID_ABI - emulator -avd test -no-skin -no-audio -no-window & - android-wait-for-emulator - adb shell input keyevent 82 &
解决方法
2015年9月7日更新
令人难以置信的是令人沮丧,但我在Android支持库中获得Espresso以在Travis CI上成功运行.这是对我有用的确切配置.特定的sdk和库版本号很重要,所以不要更改它们,否则会遇到问题.支持注释的解决策略也是必要的,所以不要删除它.由于Travis CI的Android支持仍处于测试阶段,因此这个答案可能已经过时了.查看Travis CI网站了解更新here.
.travis.yml
language: android jdk: openjdk7 android: components: - build-tools-22.0.1 - android-20 - extra - addon - sys-img-armeabi-v7a-android-19 before_script: - echo no | android create avd --force -n test -t android-19 --abi armeabi-v7a - emulator -avd test -no-skin -no-audio -no-window & - android-wait-for-emulator - adb shell input keyevent 82 & script: - ./gradlew connectedAndroidTest
的build.gradle
apply plugin: 'android-sdk-manager' apply plugin: 'com.android.application' buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+' } } android { compileSdkVersion 20 buildToolsVersion "22.0.1" defaultConfig { minSdkVersion 11 targetSdkVersion 20 testApplicationId "com.example.app.test" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.txt' } } packagingOptions { exclude 'LICENSE.txt' exclude 'Meta-INF/LICENSE' exclude 'Meta-INF/NOTICE' } lintOptions { abortOnError false } } dependencies { compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar' compile 'com.android.support:support-v4:20.+' compile 'joda-time:joda-time:2.3' compile 'com.squareup.retrofit:retrofit:1.4.1' compile 'com.squareup.retrofit:retrofit-converters:1.9.0' compile 'com.squareup.retrofit:retrofit-mock:1.4.0' compile 'com.fasterxml.jackson.core:jackson-core:2.3.1' compile 'com.fasterxml.jackson.core:jackson-annotations:2.3.0' compile 'com.fasterxml.jackson.core:jackson-databind:2.3.1' compile 'com.google.guava:guava:16.0' androidTestCompile 'com.android.support:support-annotations:20.+' androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2' androidTestCompile 'com.android.support.test:runner:0.3' androidTestCompile 'com.squareup:fest-android:1.0.7' } configurations.all { resolutionStrategy { // fail eagerly on version conflict (includes transitive dependencies) // e.g. multiple different versions of the same dependency (group and name are equal) failOnVersionConflict() // force certain versions of dependencies (including transitive) // *append new forced modules: force 'com.android.support:support-annotations:20.+','com.squareup.retrofit:retrofit:1.4.1' // *replace existing forced modules with new ones: forcedModules = ['com.android.support:support-annotations:20.+','com.squareup.retrofit:retrofit:1.4.1'] // cache dynamic versions for 10 minutes cacheDynamicVersionsFor 10*60,'seconds' // don't cache changing modules at all cacheChangingModulesFor 0,'seconds' } }
如果您收到这样的error:
PerformException: Error performing 'single click' on view
closeSoftKeyboard(); Thread.sleep(1000);
例
public void testThatSuccessDialogIsShownWithValidCardInput() throws Exception { onView(withId(R.id.card_number)) .perform(typeText("4242424242424242")); closeSoftKeyboard(); Thread.sleep(1000); onView(withId(R.id.card_exp_month)) .perform(typeText("01")); onView(withId(R.id.card_exp_year)) .perform(typeText("20")); onView(withId(R.id.card_cvc_code)) .perform(typeText("313")); closeSoftKeyboard(); Thread.sleep(1000); onView(withText("Submit")) .perform(click()); onView(withText("Success!")) .check(matches(isDisplayed())); onView(withText("OK")) .perform(click()); onView(withText("OK")) .check(doesNotExist()); }
工作项目