Подтвердить что ты не робот

Android Gradle приложение: connectedCheck запускает тесты из зависимостей

У меня есть проект библиотеки, который имеет свои собственные тесты. Я не несу ответственности за этот проект библиотеки и не забочусь о его тестах, однако, когда я запускаю gradle :app:connectedCheck, он запускает мои тесты, но он также запускает тесты зависимостей. Есть ли способ предотвратить это?

Я должен упомянуть, что мои зависимости не входят в модуль app, о котором я говорю.

EDIT: В частности, проект библиотеки, в котором я вхожу, имеет очень длинные тесты, поскольку они предназначены для запуска на сервере сборки в 2 часа ночи, поэтому я сижу здесь, ожидая, когда краска высохнет, чтобы запустить мои действительно короткие тесты.

EDIT2: Я также пробовал использовать Spoon. У меня есть настройка прямо сейчас и вы можете запускать отдельные классы, но я бы хотел запустить все в одном пакете. Возможно ли это?

EDIT3: структура папок невелика, но здесь очень очень не детализированный вид:

root
-some_library_project
-main_project
-settings.gradle

Основной_проект 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
    }
}
4b9b3361

Ответ 1

У вас есть плагин 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 ложка

Специфический класс испытаний

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


Изменить

После прочтения вашего редактирования "Редактировать2" я вижу, что это будет указывать только определенный класс для запуска, а не конкретный пакет. К сожалению, я не нашел решения для этого, только обход. Я построил bash script, и в нем я добавил свои классы для тестирования, например:

Шаг 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: Предоставьте разрешения script

  • cd в script
  • type chmod u+x runAllTest.sh

Итак, что это делает:

  • Сначала создается timestamp.out. Я использую это, чтобы сохранить результаты в файл снова и снова, не перезаписывая предыдущие результаты. Вам не нужна эта часть.

  • Затем он создает папку результатов в корне вашего проекта, если она еще не существует.

  • Затем он создаст папку внутри папки результатов с именем Results-SOME-DATE.

  • Наконец, каждый тест будет запущен, сохранив результаты в обычном месте вашего проекта. (Внутренняя сборка/ложка). После завершения теста она скопирует результаты в папку результатов и соответствующим образом назовет каждый результат теста, поэтому легко увидеть, что все ваши тесты выполнялись.

ПРИМЕЧАНИЕ. Этот script был написан для MAC. Если в ваших окнах или что-то еще, этот script может потребоваться внести изменения.


Дополнительно:. Вам будет неудобно открывать в каждую папку, чтобы открыть index.html. Поэтому я написал этот script, чтобы добавить к вашему 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. Возможно, вам потребуется изменить в зависимости от вашей ОС. Но структура должна быть одинаковой

Надеюсь, это поможет.

Ответ 2

Если у вас есть зависимость проекта от этой библиотеки, gradle хочет ее построить и протестировать, так как оба являются обычным процессом сборки java-проекта. Чтобы избежать этого теста, вы можете сделать одно из следующих действий:

  • Как сказал Крылец в своем комментарии, вы можете просто пропустить конкретная тестовая задача с ./gradlew connectedAndroidTest -x :mylib:connectedAndroidTest
  • вы фильтруете свои тесты в закрытии теста, как это объясняется здесь: http://www.gradle.org/docs/current/userguide/java_plugin.html#sec:java_test