Android的拆分单元和集成测试

时间:2016-12-13 09:38:23

标签: android unit-testing gradle integration-testing

目前我有一个test/src/java文件夹,其中存储了Android应用程序的所有测试(测试是使用junit,mockito和robolectric完成的)。

我可以使用./gradlew test

运行它们

我想要实现的是拥有两个文件夹:

  1. integrationTest/src/java - 用于集成测试
  2. test/src/java - 用于单元测试
  3. 我还想单独运行它们,例如./gradlew test./gradlew integrationTest

    我设法使用sourceSets分割目录,如下所示:

        sourceSets {
            test {
                java {
                    srcDirs = ['src/test/java', 'src/integrationTest/java', 'src/commonTest/java']
                }
                resources {
                    srcDirs = ['src/test/resources', 'src/integrationTest/resources', 'src/commonTest/resources']
                }
            }
        }
    

    我在Google上搜索了许多关于如何创建自定义测试任务的示例,但其中大多数与java而不是android有关,而其他的已经过时了。我现在花了整整一天,所以如果有人可以帮助我,我会非常感激。

3 个答案:

答案 0 :(得分:3)

如果您的集成测试是检测测试,那么您可以使用默认文件夹testandroidTest并使用./gradlew test./gradlew connectedAndroidTest

分别运行它们

另一种方法(如果你可以在test文件夹中进行集成测试)将在test文件夹中使用单独的包,并使用以下命令单独运行测试:

./gradlew testDebug --tests="com.yourapplication.unittests.*"
./gradlew testDebug --tests="com.yourapplication.integrationtests.*"
...

答案 1 :(得分:2)

几天前我遇到了同样的问题。

为了解决它并且能够独立地运行每种类型的测试,我将测试分开:

// run only unit tests
test{
    include '**/unit/**'
    exclude '**/integration/**'
    doLast {
        println 'Unit tests execution finished.'
    }
}

// run only integration tests
task integrationTest(type: Test){
    include '**/integration/**'
    exclude '**/unit/**'
    doLast {
        println 'Integration tests execution finished.'
    }
}

// run all tests (unit + integration)
task allTests(type: Test){
    include '**/integration/**'
    include '**/unit/**'
    doLast {
        println 'All tests execution finished.'
    }
}

include 关键字表示执行命令时要包含的文件。如果您只想运行 单元测试,则只能包含包含单元测试的文件夹,并排除包含集成测试的文件夹。

创建gradle命令时,您可以使用类似的逻辑来运行 集成测试。

要使用此配置和gradle执行测试,请使用:

  • ./gradlew test执行单元测试
  • ./gradlew integrationTests执行集成测试
  • ./gradlew allTests执行两者集成和单元测试。

注意:您可以在include / excludes中设置路径,以便在执行测试时包含/排除测试或类。也可以只包含一个测试并排除其他测试,反之亦然。

答案 2 :(得分:0)

可能类似

sourceSets {
    integrationTest {
        java {
            compileClasspath += main.output
            runtimeClasspath += main.output
            srcDir 'src/integrationTest/java'
        }
        resources.srcDir 'src/integrationTest/resources'
    }
}

configurations {
    integrationTestCompile { 
        extendsFrom compile 
    }
    integrationTestRuntime {
        extendsFrom runtime
    }
}

task integrationTest(type: Test) {
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath = sourceSets.integrationTest.runtimeClasspath
}
check.dependsOn integrationTest

然后你可以做

dependencies {
    integrationTestCompile 'org.seleniumhq.selenium:selenium-java:3.0.1'
    integrationTestRuntime 'com.foo:bar:1.0'
}