Espresso 2.1 找不到我的测试

Espresso 2.1 doesn't find my tests

我查看了堆栈中所有我发现有类似问题的问题,但 none 给了我一个实际有效的答案 (https://whosebug.com/search?q=espresso+empty+test+suite)。

我有一个简单的项目,想尝试浓缩咖啡。我的 class 文件如下所示:

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.

我的结构是:

另外,运行命令中的 ning spoon 给了我同样的结果。所以,我的问题是:

编辑:

我的 运行 配置如下所示:

好像android.support.test.runner.AndroidJUnitRunner不存在

构建变体:

我通过在测试配置中设置错误 android.test.InstrumentationTestRunner 成功重现了您的情况。

我建议检查 运行 菜单中指定的 -android.support.test.runner.AndroidJUnitRunner-(或 none)是否正确 |编辑配置

此外,您的问题的标题有些令人困惑,因为根据构建 gradle 依赖项,我的理解是您实际上是在使用 Espresso 2.1。如果是这样,请注意:

TestCases like ActivityInstrumentationTestCase2 or ServiceTestCase are deprecated in favor of ActivityTestRule or ServiceTestRule.

也可以看出here or here,注释将按以下方式使用:(将调整您已弃用的测试class只是因为我很好)

//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() { ... }
}

更多关于Rules

了解更多有关 test size annotations

的其他好地方

也许这对以后的人有帮助:如果你在安装 Android 时遇到 "no space left on device" 错误,你必须重新安装所有东西。

(如果你的盘在安装的时候不是满的几乎是满的,请不要看。)

我有类似的问题,测试没有运行。原因是 Android 工作室公布的内存要求不包括测试所需的组件。 (顺便说一句,您不仅需要 2G,还需要 2G in /tmp and 2G in your home directory.)现在,当磁盘内存耗尽时,您将获得一个安装不行。清除一些额外的 space 并重新 运行 安装程序后,它仍然不起作用。您必须删除所有内容,清除~/.AndroidStudio1.5(因为删除软件后只会浪费宝贵的space),然后重新安装。 (最有可能的是,他们下载了 .zip 压缩文件并且不检查结果。即使他们认为 md5 检查太复杂,他们仍然可以检查文件长度!但他们没有。)

要在 Linux 下的目录中打印内存使用情况,请使用 du -h -d 1(或 du -h -d 2 用于 2 个目录级别,-h 代表人类可读)。