使用Gradle在Android中使用JUnit进行单元测试

时间:2014-08-29 15:42:43

标签: android junit gradle android-gradle

我正在尝试设置Junit测试以在android项目中测试我的Java代码。我似乎无法使用Gradle构建。

我现在已经设置了一个测试作为例子。我的项目是遗留的,我移植到Gradle,所以我已经定义了源集和结构,而不是将文件移动到新的目录格式。

当我运行构建或仅运行UnitTest时,输出是Build Successful,但它实际上没有运行我的测试单元测试。 Android studio似乎也不会将该文件识别为java,也不会在我的ExampleTest.java文件中显示错误/代码完成。

Project
  -> Module
     -> assets
     -> build
     -> gen
     -> libs
     -> res
     -> src
     -> tests

我的gradle构建文件:

    buildscript {
    repositories {
        mavenCentral()
        maven { url 'http://repo1.maven.org/maven2' }
        maven { url 'http://download.crashlytics.com/maven' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:+'
        classpath 'com.crashlytics.tools.gradle:crashlytics-gradle:1.+'
    }
}

apply plugin: 'android'
apply plugin: 'crashlytics'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 20
    buildToolsVersion '20.0.0'


    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 20
        versionCode 47
        versionName '2.1'

    }
    buildTypes {
        release {
            runProguard true
            zipAlign true
            proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
            proguardFile 'proguard-project.txt'
        }
        debug {
            runProguard false
        }
    }

    productFlavors {
        defaultFlavor {
            proguardFile 'proguard-project.txt'
        }
    }

    signingConfigs {
        debug {
            storeFile file('../debug.keystore')
        }

        release {
            storeFile file("XX")
            storePassword "XX"
            keyAlias "XX"
            keyPassword "XX"
        }
    }

    sourceSets {

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

        }

        unitTest {
            java.srcDir file('tests')
            resources.srcDir file('test/resources')
        }

    }
}


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

dependencies {
    compile 'com.viewpagerindicator:library:2.4.1@aar'
    compile 'com.crashlytics.android:crashlytics:1.+'
    unitTestCompile 'junit:junit:4.1+'
    unitTestCompile files("$buildDir/intermediates/classes/debug")
}


configurations {
    unitTestCompile.extendsFrom runtime
    unitTestRuntime.extendsFrom unitTestCompile
}

task unitTest(type:Test, dependsOn: assemble) {
    description = "run unit tests"
    testClassesDir = project.sourceSets.unitTest.output.classesDir
    classpath = project.sourceSets.unitTest.runtimeClasspath
}


// bind to check
build.dependsOn unitTest

1 个答案:

答案 0 :(得分:1)

对您的gradle脚本执行以下操作。这将允许您在JVM中运行测试,这意味着无需运行模拟器或在设备上运行测试。

在顶部:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.robolectric:robolectric-gradle-plugin:0.12.+'
    }
}

新插件:

apply plugin: 'robolectric'

靠近底部:

robolectric {

    //configure the set of classes for JUnit tests
    include '**/*Test.class'

    //configure whether failing tests should fail the build
    ignoreFailures false

}

并添加以下依赖项:

androidTestCompile ('junit:junit:4.11')
androidTestCompile ('org.robolectric:robolectric:2.3') {
    exclude module: 'classworlds'
    exclude module: 'maven-artifact'
    exclude module: 'maven-artifact-manager'
    exclude module: 'maven-error-diagnostics'
    exclude module: 'maven-model'
    exclude module: 'maven-plugin-registry'
    exclude module: 'maven-profile'
    exclude module: 'maven-project'
    exclude module: 'maven-settings'
    exclude module: 'nekohtml'
    exclude module: 'plexus-container-default'
    exclude module: 'plexus-interpolation'
    exclude module: 'plexus-utils'
    exclude module: 'wagon-file'
    exclude module: 'wagon-http-lightweight'
    exclude module: 'wagon-http-shared'
    exclude module: 'wagon-provider-api'
    exclude group: 'com.android.support', module: 'support-v4'
}

然后开始在tests文件夹中编写测试。正如您所看到的,我设置了一个过滤器,因此只有以Test.class开头的类才包含在测试套件中。请务必在以下任何一个测试类中添加以下注释:(请务必更改清单文件的URL,因为它与您编写的内容不同)

@RunWith(RobolectricTestRunner.class)
@Config(manifest = "./src/main/AndroidManifest.xml", emulateSdk = 18)
class FirstTest {
    // tests go here
}

最后,使用./gradlew test

运行测试