Я работаю с Android Studio на Windows 7, 64 бит. Я noobie на Android Studio (или любой Intel IDE).
Я загрузил и установил Ruby 1.9.3, Ruby DevKit и calabash-android, и я могу успешно запускать тесты Cucumber в своем приложении для Android с помощью командной строки (запуск calabash-android)
Мне также удалось установить плагин Cucumber для Android Studio, так что мои файлы функций могут извлечь выгоду из автозаполнения и т.д.
У меня есть следующие вопросы:
-
Можно ли установить плагин Ruby (RubyMine?), чтобы я мог писать определения шагов для моих тестов? Если да, я слышал, что люди могут отлаживать тесты Cucumber: может ли это быть достигнуто и в приложениях Android Studio для Android?
-
Можно ли запустить тест calabash для Android-приложения из Android Studio? Если да, то как я могу это сделать?
-
Могу ли я интегрировать (автоматические) тесты с помощью калабаша в сборки Gradle для Android-приложения? Если да, то как я могу это сделать?
Спасибо!
Update:
Я прикрепил пользовательский Gradle Plugin<Project>
(см. ниже код паза, который я написал, чтобы иметь базовую поддержку для выполнения тестов calabash-android.
Эти ручные шаги по-прежнему необходимы:
- Установите Ruby 1.9.x и его Devkit, установите камень кальяба-андроида и т.д.
- Создайте соответствующий (аромат) APK, используя плагин android Gradle (ручной или автоматический)
В приложении build.gradle
теперь добавляется apply plugin: 'calabash'
, и он позволяет сборке запускать файл функций в качестве теста calabash.
В нем рассматриваются доступные вкусы продукта (встроенные ароматы) и добавляются соответствующие задачи, связанные с калабашей (например, calabashDebug
или calabashFlavor1Release
и т.д.).
Ниже представлен файл groovy, который реализует мой плагин "calabash" (только для Windows):
package com.mediaarc.gradle.plugins
import org.gradle.api.*
import org.gradle.api.plugins.*
import org.gradle.api.tasks.*
class CalabashPlugin implements Plugin<Project> {
void apply(Project project) {
project.extensions.create("calabash", CalabashPluginExtension)
if (!project.android) {
throw new IllegalStateException("Android plugin is not configured.")
}
project.android.applicationVariants.each { variant ->
final def buildName = variant.name
final def buildVar = variant.baseName
final def packageApp = variant.packageApplication;
project.task("doPrepare${buildName}") << {
project.calabash.init(project, buildVar)
def apkFile = packageApp.outputFile
project.calabash.writeCommandFile(apkFile)
}
project.task("doClean${buildName}") << {
project.calabash.init(project, buildVar)
project.calabash.clean()
}
project.task("calabash${buildName}", type: Exec, dependsOn: [ project["assemble${buildName}"], project["doPrepare${buildName}"] ]) {
println project["assemble${buildName}"]
project.calabash.init(project, buildVar)
configureTask(project[name], buildName)
project.calabash.execute(project[name])
}
project.task("cleanCalabash${buildName}", dependsOn: project["doClean${buildName}"]) {
project.calabash.init(project, buildVar)
configureClean(project[name], buildName)
}
}
}
private def configureTask(def task, def buildVariant) {
task.group = JavaBasePlugin.VERIFICATION_GROUP
task.description = "Runs calabash tests for Build '${buildVariant}'"
}
private def configureClean(def task, def buildVariant) {
task.group = BasePlugin.BUILD_GROUP
task.description = "Deletes the calabash tests results for Build '${buildVariant}'"
}
}
class CalabashPluginExtension {
def root = 'src/calabash'
def resultFile = "calabash-results.html"
//protected def hash = new Object()
protected File outputFile
protected File workingDir
protected File tmpFile
protected init(Project project, def buildVariant) {
if (!buildVariant) {
buildVariant = "debug"
}
File rootFile = project.file(root)
outputFile = new File(project.file("build/reports/calabash/${buildVariant}"), resultFile)
workingDir = rootFile
}
protected writeCommandFile(def apkFile) {
if (!workingDir.exists()) {
throw new IllegalStateException("The root directory for the calabash-tests could not be found: '${workingDir}'")
}
if (!(new File(workingDir, "features").exists())) {
throw new IllegalStateException("The required 'features' directory could not be found in '${workingDir}'")
}
outputFile.parentFile.mkdirs()
def calabashCmd = "cd ${workingDir.canonicalPath}\r\necho calabash-android run \"${apkFile.canonicalPath}\" --format html --out \"${outputFile.canonicalPath}\"\r\n"
getCommandFile().write calabashCmd
}
protected execute(Exec exec) {
exec.commandLine 'cmd', '/c', getCommandFile().canonicalPath
}
protected clean() {
outputFile.delete()
}
private File getCommandFile() {
if (!tmpFile) {
tmpFile = File.createTempFile("run-calabash", ".bat")
tmpFile.deleteOnExit()
}
return tmpFile
}
}