如何将已测试的测试和单元测试源集添加到现有的Android Studio项目中

时间:2019-06-07 17:23:29

标签: android android-studio gradle

当我创建一个新的Gradle项目时,除了主应用程序目录外,还有两个目录,一个用于单元测试,一个用于仪器化测试,例如

java
  com.example.myapplication
  com.example.myapplication (androidTest) <--- instrumented testing
  com.example.myapplication (test) <---- unit testing

我猜这两个目录基本上都包含Android Studio将使用Gradle生成并启动测试到设备的源集。

但是,我正在一个缺少这两个目录的项目中工作。我只有应用程序源目录。

所有教程仅显示假设两个测试目录已由Android Studio自动生成的情况下如何创建测试。

我需要知道如何创建这些源集目录,但这对我来说只是个魔术,而我不知道该怎么做。

我想在最坏的情况下,我只能创建一个新项目并将其代码移植到其中,但我讨厌这样做,因为这并不是真正的解决方案,只是一个la脚的解决方法。

我正在使用Android Gradle插件,所以我想我很接近,但是没有番茄。有什么建议吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

CommonWare是正确的。您只需创建目录androidTest并在build.gradle中更改配置(大致来说)。

  1. 转到Project视图
  2. 右键单击src
  3. 选择View in Terminal上下文选项
  4. ls目录中执行src
  5. 执行mkdir androidTestmkdir main并将com移至main

转到build.gradle并替换src

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        resources.srcDirs = ['src']
        aidl.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }

    // ...
 }

src/main(我想也可以在androidTest上设置根)

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src/main']
        resources.srcDirs = ['src/main']
        aidl.srcDirs = ['src/main']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }

    androidTest {
        java.srcDirs = ['src/androidTest/java']
    }
    androidTest.setRoot('src/androidTest')

    // ...
}

那么至少对我来说,整个源集块看起来都是这样

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src/main']
        resources.srcDirs = ['src/main']
        aidl.srcDirs = ['src/main']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }

    androidTest {
        java.srcDirs = ['src/androidTest/java']
    }
    androidTest.setRoot('src/androidTest')

    debug.setRoot('build-types/debug')
    release.setRoot('build-types/release')
}

最后要记得添加默认的跑步者(如果尚未包含的话),这样

defaultConfig {
    applicationId "com.slacorp.myApp"
    minSdkVersion 19
    targetSdkVersion 26
    versionCode 190
    versionName "23.5"
}

成为这个

defaultConfig {
    applicationId "com.slacorp.myApp"
    minSdkVersion 19
    targetSdkVersion 26
    versionCode 190
    versionName "23.5"

    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

然后添加依赖项,这样

dependencies {
    implementation project(':lib-android-common-ui')
    implementation project(':android-lite')
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation project(':lib-j-rci')
}

成为这个

dependencies {
    implementation project(':lib-android-common-ui')
    implementation project(':android-lite')
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation project(':lib-j-rci')

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

}

然后同步Gradle,然后添加带有导入的测试类

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.assertEquals;

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {

    @Test
    public  void useAppContext() throws Exception {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();
        assertEquals("foo", appContext.getPackageName());
    }
}

如果这不起作用,请执行file > sync with file systemfile > invalidate and restart

答案 1 :(得分:0)

添加新的Android测试。选择Tests视图。

enter image description here

您将看到全部,一个或没有测试包。

enter image description here

添加一个:

enter image description here

enter image description here

转到课程,然后按 Ctrl + Shift + T 。选择Create New Test...,选择“ JUnit4”,然后按“ OK”。您将看到之前创建的所有可用测试包。

enter image description here

确保在build.gradle中需要依赖项:

android {
    defaultConfig {
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

dependencies {
    androidTestImplementation 'androidx.test:runner:1.3.0'
    androidTestImplementation 'androidx.test:rules:1.3.0'