2016-12-13 166 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執行的整合和單元測試。

注:您可以設置爲包括/執行你的測試時,排除測試或類中包含/排除的路徑。也可以只包含一個測試並排除其他測試,反之亦然。