Не удалось заставить Robotium работать в Android Studio

Я изо всех сил пытаюсь заставить Robotium работать с Android Studio на основе gradle, и я не могу найти способ сделать это.

Это мой файл build.gradle

buildscript {
    dependencies {
        repositories {
            mavenCentral()
            mavenLocal()
        }

        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}

apply plugin: 'android'

repositories {
    mavenCentral()
   /* maven {
        url "https://oss.sonatype.org/content/repositories/snapshots"
    }*/
}

sourceSets {
    testLocal {
        java.srcDir file('src/test/java')
        resources.srcDir file('src/test/resources')
    }
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 17
    }

    sourceSets {
        instrumentTest.setRoot('src/test')
    }
}

dependencies {
    compile 'com.android.support:support-v4:13.0.+'

    // Dependencies for the `testLocal` task, make sure to list all your global dependencies here as well
    testLocalCompile 'junit:junit:4.11'
    testLocalCompile 'com.google.android:android:4.1.1.4'
    testLocalCompile 'com.android.support:support-v4:13.0.+'
    testLocalCompile 'org.robolectric:robolectric:2.1.+'
    testLocalCompile 'com.jayway.android.robotium:robotium-solo:4.2'

    // Android Studio doesn't recognize the `testLocal` task, so we define the same dependencies as above for instrumentTest
    // which is Android Studio's test task
    instrumentTestCompile 'junit:junit:4.11'
    instrumentTestCompile 'com.google.android:android:4.1.1.4'
    instrumentTestCompile 'com.android.support:support-v4:13.0.+'
    instrumentTestCompile 'org.robolectric:robolectric:2.1.+'
    instrumentTestCompile 'com.jayway.android.robotium:robotium-solo:4.2'


}

task localTest(type: Test, dependsOn: assemble) {
    testClassesDir = sourceSets.testLocal.output.classesDir

    android.sourceSets.main.java.srcDirs.each { dir ->
        def buildDir = dir.getAbsolutePath().split('/')
        buildDir =  (buildDir[0..(buildDir.length - 4)] + ['build', 'classes', 'debug']).join('/')

        sourceSets.testLocal.compileClasspath += files(buildDir)
        sourceSets.testLocal.runtimeClasspath += files(buildDir)
    }

    classpath = sourceSets.testLocal.runtimeClasspath
}




check.dependsOn localTest

Как видите, я использую Robolectric и Robotium. У меня возникает проблема всякий раз, когда я пытаюсь создать тест Robotium, например этот:

import android.test.ActivityInstrumentationTestCase2;

import com.dlv.testing.MainActivity;
import com.jayway.android.robotium.solo.Solo;

public class MainActivityUITest extends
        ActivityInstrumentationTestCase2<MainActivity> {

    private Solo solo;

    public MainActivityUITest() {
        super(MainActivity.class);
    }

    public void setUp() throws Exception {
        solo = new Solo(getInstrumentation(), getActivity());
    }

    public void testStuff() throws Exception {
        solo.assertCurrentActivity("Check on first Activity", MainActivity.class);
        solo.sendKey(Solo.MENU);

    }

    @Override
    public void tearDown() throws Exception {
        solo.finishOpenedActivities();
    }
}

он не может найти никакого импорта, проект не перестает компилироваться в Android Studio, он просто терпит неудачу, когда я запускаю тесты, и если я удаляю класс и ссылки в зависимостях, Robolectric работает просто отлично


person MariusBudin    schedule 12.09.2013    source источник
comment
Я думаю, что теперь можно запускать робоэлектрические тесты из студии Android. перейдите по следующей ссылке с большого ранчо ботаников   -  person sirFunkenstine    schedule 26.02.2015


Ответы (1)


Насколько я могу судить, вы пока не можете успешно запускать какие-либо тесты из Android Studio (см. android-studio">Как я могу создавать тесты в Android Studio?). Вам нужно сделать это из командной строки (учтите, что вам может понадобиться сначала очистить ./gradlew clean):

Чтобы запустить инструментальные тесты, используйте ./gradlew connectedInstrumentTest

Чтобы запустить тестовую задачу, используйте ./gradlew localTest

Для справки в будущем, когда Android Studio будет лучше работать с тестовой интеграцией, вы можете настроить его для запуска любой заданной задачи Gradle. Перейдите в «Редактировать конфигурации» и нажмите кнопку «+», чтобы добавить новую. Выберите «Gradle», а затем настройте его так, чтобы он указывал на правильный файл gradle.build и задачу, которую вы хотите запустить. Однако я не уверен, что бы вы добавили в раздел «Перед запуском», если что.

Все, что было сказано, вот как я провел свои тесты роботиума:

  1. Я использовал встроенную конфигурацию Instrument Test, потому что не смог заставить работать задачу localTest (у меня были те же ошибки, что и у вас, когда не удалось найти импорт). Я использовал структуру папок по умолчанию с папкой instrumentTest, но похоже, что вы можете просто использовать строку instrumentTest.setRoot('src/test'), чтобы она работала так же с вашей настройкой.

  2. Я настроил свой файл build.gradle следующим образом:

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.5.+'
        }
    }
    apply plugin: 'android'
    
    repositories {
        mavenCentral()
    }
    
    dependencies {
        // Included library modules
        ...
    
        // My regular dependencies
        compile 'com.android.support:support-v4:13.0.0'
        ...
    
        // Test dependencies. Notice that all I have to include is robotium
        // because the rest just works using the instrumentTest configuration
        instrumentTestCompile 'com.jayway.android.robotium:robotium-solo:4.3'
    }
    
    android {
        compileSdkVersion 17
        buildToolsVersion "18.0.1"
    
        defaultConfig {
            minSdkVersion 7
            targetSdkVersion 16
        }
    
    }
    
  3. Я добавил библиотеку robotium в структуру проекта (command-; на моем Mac) в качестве библиотеки maven.

  4. Затем я написал такой тест:

    import android.test.ActivityInstrumentationTestCase2;
    import com.example.activity.WelcomeScreen;
    import com.jayway.android.robotium.solo.Solo;
    
    public class WelcomeScreenTest extends ActivityInstrumentationTestCase2<WelcomeScreen> {
        private Solo solo;
    
        public WelcomeScreenTest() {
            super(WelcomeScreen.class);
        }
    
        protected void setUp() throws Exception {
            super.setUp();
    
            solo = new Solo(getInstrumentation(), getActivity());
        }
    
        public void testActivity() {
            // robotium assert
            solo.assertCurrentActivity("Welcome Screen", WelcomeScreen.class);
            // junit assert
            assertEquals(true, true);
        }
    }
    
  5. Затем я запустил тест через командную строку ./gradlew connectedInstrumentTest, и у меня это сработало.

person jDutton    schedule 18.09.2013
comment
Все, что я получаю, когда запускаю это: ошибка: пакет com.jayway.android.robotium.solo не существует import com.jayway.android.robotium.solo.Solo; - person slott; 21.11.2013
comment
Мне все еще не хватает еще одной части головоломки. Когда я делаю все это, он говорит, что пакет com.jayway.android.robotium.solo не существует. Только если я добавлю скомпилировать «com.jayway.android.robotium:robotium-solo:4.3», это сработает. Но похоже, что мой тестовый класс включен в исходный код проекта, не так ли? - person slott; 22.11.2013
comment
Не забудьте перезапустить/повторно импортировать проект после добавления прагмы instrumentTestCompile — это доставило мне немного головной боли при написании первого теста (импорт роботов был недоступен) — протестировано и доказано, что оно работает на Android Studio 0.4.2. - person pkk; 12.01.2014