Вопросы о поддержке calabash-android в Android Studio: Ruby, Редактирование функций и шагов, Запуск тестов

Я работаю с 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
        }
    }

Ответ 1

Очень хороший вопрос. Xamarin провел вебинар по использованию тестов Calabash в своем продукте Test Cloud. К концу разговора идет довольно много практических действий по созданию тестовой экосистемы и проведению тестов Calabash для Android. Там много там, которые не относятся к вашей среде, но некоторые очень хорошие советы и идеи от Karl Krukow - одного из основных участников кальяба-андроида.