Android Gradle app:connectedCheck从依赖项运行测试

时间:2014-07-11 19:08:02

标签: android gradle spoon

我有一些有自己测试的库项目。我不负责这个图书馆项目并且不关心它的测试,但是,当我运行gradle :app:connectedCheck它运行我的测试但它也运行依赖项'试验。有什么办法可以阻止这个吗?

我应该提一下,我的依赖关系不在我所说的app模块中。

编辑:更具体地说,我依赖的图书馆项目有非常长的测试,因为它们意味着早上2点在构建服务器上运行,所以我坐在这里等待绘画到干燥只是为了进行我真正的短暂测试。

EDIT2:我也尝试过使用Spoon。我现在已经安装它并且可以运行单独的类,但我想在一个包中运行所有内容。这可能吗?

EDIT3:文件夹结构微不足道,但这是一个非常非常详细的外观:

root
-some_library_project
-main_project
-settings.gradle

main_project build.gradle看起来像这样。我应该提一下勺子目前什么都不做,但我的选择是开放的:

buildscript{
 repositories {
     jcenter()
 }
 dependencies{
     classpath 'com.stanfy.spoon:spoon-gradle-plugin:0.10.+'
 }
}

apply plugin: 'com.android.application'
apply plugin: 'spoon'

android {
    compileSdkVersion 20
    buildToolsVersion '20.0.0'

 defaultConfig {
    applicationId "com.something.main_project"
    minSdkVersion 17
    targetSdkVersion 20
    versionCode 1
    versionName "1.0"

    testPackageName "com.something.main_project.test"
    testInstrumentationRunner "android.test.InstrumentationTestRunner"

 }

 signingConfigs {
    debug {
        storeFile file("debug.keystore")
    }

    release {
        storeFile file("release.keystore")
        storePassword "something"
        keyAlias "something"
        keyPassword "something"
    }
 }

 buildTypes {
    release {
        runProguard false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }
    debug{
        signingConfig signingConfigs.debug
    }
 }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])

    compile project(':some_library_project')

    androidTestCompile 'com.squareup.spoon:spoon-client:1.1.0'
}

spoon {
    if (project.hasProperty('spoonClassName')){
        className = project.spoonClassName
    }
}

2 个答案:

答案 0 :(得分:5)

您有Spoon插件,但正在使用gradle :app:connectedCheck。首先,进行这些更改,然后使用gradle spoon

运行

注释 androidTest.setRoot 主要包

以外的任何其他build.gradle

将这些内容添加到主程序包的build.gradle

在标记android

sourceSets {  //this one may not be needed. But wont hurt.
    androidTest.setRoot('src/androidTest')
}

修改spoon代码:

 spoon {
     debug = true
     testSizes = ['small', 'medium', 'large']   <<--- Change this to run specific test sizes
     if (project.hasProperty('spoonClassName')){
        className = project.spoonClassName
     }
  }

运行

所有测试:

  

gradle spoon

特定测试类

  

gradle spoon -PspoonClassName = [THE.PACKAGE.NAME]


修改

阅读完编辑&#34; Edit2&#34;后,我发现这只会指定要运行的某个类,而不是特定的包。不幸的是,我还没有找到解决方案,只是解决方法。我构建了一个bash脚本,并在其中添加了我的类以进行测试,如下所示:

第1步:在Android项目的根目录下创建文件:runAllTests.sh

第2步:修改.sh,如下所示:

 #!/bin/sh
 date +%b-%dT%H.%M > timestamp.out

 sites="$HOME"/path/to/project/root

 timestamp="$(cat "$sites"/timestamp.out)"
 result_folder="$sites"/results
 destdir="$result_folder/Results-$timestamp"

 mkdir -p "$destdir"
 echo "Directory created: ${destdir##*/}"

  <---------- Here you start running the test --------------->

  echo "Starting Master Setup"
  gradle spoon -PspoonClassName=com.espresso.test.MasterSetup
  cp -r "$sites"/app/build/spoon "$destdir"/MasterSetup
  echo "Results saved to MasterSetup"

  echo "Starting WorkoutSchedule"
  gradle spoon -PspoonClassName=com.espresso.test.CupcakeSchedule
  cp -f "$sites"/app/build/spoon "$destdir"/WorkoutSchedule
  echo "Results saved to WorkoutSchedule"

  echo "Starting Setting.test"
  gradle spoon -PspoonClassName=com.espresso.test.Settings
  cp -r "$sites"/app/build/spoon "$destdir"/Settings
  echo "Results saved to Settings"

第3步:授予脚本权限

  1. cd到脚本
  2. 输入chmod u+x runAllTest.sh
  3. 所以,这样做:

    1. 首先,它创建一个timestamp.out。我使用这个,所以我可以反复将结果保存到文件中,而不会覆盖之前的结果。你不需要这个部分。

    2. 接下来,它会在项目的根目录中创建一个结果文件夹(如果它尚不存在)。

    3. 然后,它会在结果文件夹中创建一个名为Results-SOME-DATE的文件夹。

    4. 最后,每个测试都会运行,将结果保存到项目的正常位置。 (内部构建/勺子)一旦测试完成,它会将结果复制到结果文件夹,并相应地命名每个测试结果,以便很容易看到所有测试都运行。

    5. 注意:此脚本是为MAC编写的。如果你的窗口或其他任何东西,这个脚本可能需要修改。


      此外:您会发现打开每个文件夹以打开index.html会很不方便。所以我写了这个脚本来添加到你的bash_profile

      function open-results () {
      # the browser to open up `index.html' in.
      browser='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
      
      # let the user know what directory we're looking in
      printf "looking in %s" "$(pwd)"
      echo ...
      
      for paths in $(find ./ -name 'debug' -type d); do
        for files in $(find "$paths" -name 'index.html'); do
          open -a "$browser" "$files"
        done
      done
      echo done
      }
      

      现在,cd到Results-SOME-DATE,然后输入open-results再次,这是为bash编写的。您可能需要根据您的操作系统进行修改。但结构应该是相同的

      我希望这会有所帮助。

答案 1 :(得分:3)

如果你有一个项目依赖于这个库,gradle想要构建和测试它,因为两者都是java项目的常规构建过程。 为避免这些测试,您可以执行以下操作之一:

  1. 就像Krylez在评论中提到的那样,你可能会跳过这个 具有./gradlew connectedAndroidTest -x :mylib:connectedAndroidTest
  2. 的特定测试任务
  3. 您在测试闭包中过滤测试,如下所述:http://www.gradle.org/docs/current/userguide/java_plugin.html#sec:java_test