2016-12-13 212 views
6

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

,我还可以使用./gradlew test

我想达成什么是有两个文件夹运行这些:

  1. integrationTest/src/java - 集成测试
  2. test/src/java - 单元测试

而且我想单独运行它们,如./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有关的,而不是机器人其他的都过时了。我花了整整一天的时间,所以如果有人能帮助我,我会非常感激。

+0

这个库在这里:[link](https://github.com/Yelp/yelp-android/blob/master/build.gradle)有它的工作。不过它使用了“com.android.library”插件。 – rmoore

+0

有一个默认的'androidTest'文件夹用于android测试,它将在设备/模拟器上运行。那个文件夹是你需要的吗? –

回答

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' 
} 
+0

这是一个Java解决方案,不是吗? Android有点不同。 – rmoore

2

如果您的集成测试仪器的测试,那么你可以使用默认的文件夹testandroidTest并单独使用./gradlew test运行它们和./gradlew connectedAndroidTest

另一种方式(如果你可以有整合在test文件夹内的离子测试)将使用test文件夹内单独的包,并分别使用运行测试:

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

'./gradlew testDebug --tests com.company.package.unittest。*' 请参阅https://developer.android.com/studio/test/command-line.html#RunTestsGradle 和 https:// docs.gradle.org/current/userguide/java_plugin.html#test_filtering 真正适用于android应用的解决方案。还有很多其他的示例和解决方案,但它们都是关于java项目的,而不是android。 – Mike

1

我前几天有同样的问题。

为了解决这个问题,并能够独立运行各类型的测试,我分开我的测试是这样的:

// 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.' 
    } 
} 

包括关键字表明您希望在执行命令时包含哪些文件。如果您只想运行您的单元测试,则只能包含包含单元测试的文件夹,并排除包含集成测试的文件夹。

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

要执行使用此配置的gradle和你的测试,使用方法:

  • ./gradlew test执行单元测试
  • ./gradlew integrationTests执行集成测试只有
  • ./gradlew allTests执行的整合和单元测试。

注:您可以设置为包括/执行你的测试时,排除测试或类中包含/排除的路径。也可以只包含一个测试并排除其他测试,反之亦然。