Эспрессо 2.1 не находит мои тесты

Я просмотрел все вопросы в стеке, которые я нашел с похожей проблемой, но ни один из них не дал мне действительно работающего ответа (https://stackoverflow.com/search?q=espresso+empty+test+suite).

У меня есть простой проект, на котором я хочу попробовать эспрессо. Мой файл класса выглядит так:

package com.example.myapplication;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class FirstActivity extends Activity implements View.OnClickListener {

    Button mClickMeButton;
    TextView mHelloWorldTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        setupView();
    }

    private void setupView() {
        mHelloWorldTextView = (TextView) findViewById(R.id.helloWorldTextView);
        mHelloWorldTextView.setText(getTitleText());
        mClickMeButton = (Button) findViewById(R.id.clickMeBtn);
        mClickMeButton.setOnClickListener(this);
    }

    private String getTitleText() {
        return "First Activity";
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this, SecondActivity.class);
        startActivity(intent);
    }
}

Мой тестовый файл выглядит так:

package com.example.myapplication.test;

import android.graphics.Bitmap;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.SmallTest;

import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withText;

import com.example.myapplication.BuildConfig;
import com.example.myapplication.FirstActivity;

@RunWith(AndroidJUnit4.class)
@SmallTest
public class FirstActivityTest extends ActivityInstrumentationTestCase2<FirstActivity> {

    public FirstActivityTest() {
        super(FirstActivity.class);
    }

    @Override
    public void setUp() throws Exception {
        super.setUp();
        getActivity();
    }

    @Test
    public void testListGoesOverTheFold() {
        onView(withText("First Activity")).check(matches(isDisplayed()));
    }
}

и build.gradle вот так:

apply plugin: 'com.android.application'
apply plugin: 'jacoco'
apply plugin: "sonar-runner"
apply plugin: 'spoon'

android {
    compileSdkVersion 21
    buildToolsVersion '22.0.1'

    packagingOptions {
        exclude 'LICENSE.txt'
    }

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 14
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"

        testApplicationId "com.example.myapplication.test"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        debug {
            testCoverageEnabled true
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    dependencies {
        testCompile 'org.easytesting:fest:1.0.16'
        testCompile 'junit:junit:4.12'
        testCompile 'org.robolectric:robolectric:2.4'
        testCompile 'com.squareup:fest-android:1.0.8'

        androidTestCompile 'com.squareup.spoon:spoon-client:1.1.9'
        androidTestCompile 'com.android.support.test:runner:0.2'
        androidTestCompile 'com.android.support.test:rules:0.2'
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.1') {
            exclude group: 'javax.inject'
        }
    }

    spoon {
        debug = true
        //devices = ['333236E9AE5800EC']
        if (project.hasProperty('spoonClassName')){
            className = project.spoonClassName
        }
    }
}

def coverageSourceDirs = [
        '../app/src/main/java', 'src/gen'
]


task jacocoTestReport(type: JacocoReport, dependsOn: "testDebug") {
    group = "Reporting"
    description = "Generate Jacoco coverage reports after running tests."
    reports {
        xml.enabled = true
        html.enabled = true
    }

    classDirectories = fileTree(
            dir: './build/intermediates/classes/debug',
            excludes: ['**/R.class',
                       '**/R$*.class'
            ])
    sourceDirectories = files(coverageSourceDirs)
    executionData = files('build/jacoco/testDebug.exec')
}
}

Каждый раз, когда я пытаюсь запустить его, я получаю:

Testing started at 16:57 ...
Target device: genymotion-google_nexus_5___5_0_0___api_21___1080x1920-192.168.56.101:5555
Uploading file
    local path: /Users/pernillauhlin/development/pingdom/android-robolectric-test/app/build/outputs/apk/app-debug.apk
    remote path: /data/local/tmp/com.example.myapplication
No apk changes detected. Skipping file upload, force stopping package instead.
DEVICE SHELL COMMAND: am force-stop com.example.myapplication
Uploading file
    local path: /Users/pernillauhlin/development/pingdom/android-robolectric-test/app/build/outputs/apk/app-debug-androidTest-unaligned.apk
    remote path: /data/local/tmp/com.example.myapplication.test
No apk changes detected. Skipping file upload, force stopping package instead.
DEVICE SHELL COMMAND: am force-stop com.example.myapplication.test
Running tests
Test running startedTest running failed: Unable to find instrumentation info for: ComponentInfo{com.example.myapplication.test/android.test.InstrumentationTestRunner}
Empty test suite.

Моя структура:

введите здесь описание изображения

Кроме того, запуск ложки из команды дает мне тот же результат. Итак, мой вопрос:

  • Что мне не хватает?
  • Аннотация к тестам; Видел много вариаций, выше класс, до теста и так далее. Каков правильный путь? Или вы можете указать @LargeTest перед классом и @SmallTest перед фактическим методом тестирования?

РЕДАКТИРОВАТЬ:

Моя конфигурация запуска выглядит так:

Похоже, что android.support.test.runner.AndroidJUnitRunner не существует.

Варианты сборки:

введите здесь описание изображения


person peuhse    schedule 08.05.2015    source источник
comment
В Android Studio перейдите к Build Variants и выберите Android Instrumentation Tests в Test Artifact.   -  person Viktor K    schedule 08.05.2015
comment
Я уже выбрал это.   -  person peuhse    schedule 11.05.2015


Ответы (2)


Мне удалось воспроизвести вашу ситуацию, установив неправильный android.test.InstrumentationTestRunner в тестовой конфигурации.

Я бы посоветовал проверить, правильно ли вы указали -android.support.test.runner.AndroidJUnitRunner- (или ни одного) в меню Выполнить | Изменить конфигурации.

Кроме того, заголовок вашего вопроса несколько сбивает с толку, поскольку, насколько я понимаю, исходя из зависимостей сборки, вы на самом деле собираетесь использовать Espresso 2.1. Если это так, обратите также внимание на то, что:

Тестовые случаи, такие как ActivityInstrumentationTestCase2 или ServiceTestCase, устарели в пользу ActivityTestRule или ServiceTestRule.

Как это также можно увидеть здесь или здесь аннотации должны использоваться в следующих способ: (изменит ваш устаревший тестовый класс только потому, что я хороший)

//annotate JUnit4 test classes with
@RunWith(AndroidJunit4.class)
@LargeTest
public class FirstActivityTest {

//use the following annotation and declare an ActivityTestRule for your activity under test
@Rule
public ActivityTestRule<FirstActivity> mActivityRule = new ActivityTestRule(FirstActivity.class);

//use @Before to setup your test fixture
@Before
public void setUp() { ... }

//annotate all test methods with
@Test
public void testHelloWorld() { ... }

//release resources by using
@After
public void tearDown() { ... }
}

Подробнее об Правилах

Другое отличное место, где можно узнать больше об аннотациях тестовых размеров

person appoll    schedule 09.05.2015
comment
У меня был правильный, хотя он выглядит недействительным (runner становится красным, как будто он не распознает бегуна), см. мое редактирование выше. Также обновил заголовок. Я собираюсь пойти по правилам, я просто хотел, чтобы они начали работать раньше, чем я. - person peuhse; 11.05.2015
comment
у меня тоже такое иногда случалось. попробуйте перезапустить AS или сделать недействительными кэши/перезапустить. - person appoll; 11.05.2015
comment
Это тоже не сработало. Я загрузил проект здесь: dropbox.com/ s/0majnbk2ebgor91/android-robolectric-test.zip?dl=0, если хотите взглянуть на него. Проект Android Studio. - person peuhse; 11.05.2015
comment
Ошибка была очень простой. Я пропустил создание папки java для тестов. Таким образом, структура должна быть: - android test - java -com.example.myapplication.test и у меня было: - android test -com.example.myapplication.test Досадно пропустить это! - person peuhse; 11.05.2015
comment
правда, эта структура проекта создается при создании нового проекта. счастлив, что это решилось - person appoll; 11.05.2015

Возможно, это поможет кому-то в будущем: если вы получаете сообщение об ошибке "Нет свободного места на устройстве" при установке программ для Android, вам придется все переустанавливать.

(Если ваш диск не был заполнен или почти заполнен во время установки, не читайте его.)

У меня была аналогичная проблема, тест не запускался. Причина заключалась в том, что заявленные требования к памяти для Android-студии не включали компоненты, необходимые для тестирования. (Кстати, вам нужно не просто 2G, а 2G в /tmp и 2G в вашем домашнем каталоге.) Теперь, когда память на диске исчерпана, вы получаете установку, которая не работает. После того, как вы очистите дополнительное пространство и повторно запустите программу установки, она все равно не работает. Вы должны удалить все, очистить ~/.AndroidStudio1.5 (потому что после удаления программного обеспечения оно просто тратит драгоценное место) и переустановить. (Скорее всего, они скачивают .zip-архивы и не проверяют результат. Даже если они считают проверку md5 слишком сложной, они все равно могут проверить длину файла! Но они этого не делают.)

Чтобы распечатать использование памяти в каталоге под Linux, используйте du -h -d 1 (или du -h -d 2 для двух уровней каталога, -h означает "удобочитаемый").

person 18446744073709551615    schedule 22.02.2016