2013-07-25 68 views
1

我有一個基於Maven的Android項目設置,用於雲上的ci。我的Jenkins工作只是在從BitBucket中檢索src之後運行「安裝」目標。一切都很好。唯一的問題是單元測試無法運行。Maven無法在雲上運行單元測試

在IntelliJ(本地)中運行完全一樣的目標確實會找到並運行單元測試。

我POM看起來是這樣的 - >

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.odl</groupId> 
    <artifactId>GhostRunner</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>apk</packaging> 
    <name>GhostRunner</name> 

    <properties> 
     <platform.version> 4.1.1.4 
      </platform.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>com.google.android</groupId> 
      <artifactId>android</artifactId> 
      <version>${platform.version}</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.robolectric</groupId> 
      <artifactId>robolectric</artifactId> 
      <version>2.0-alpha-1</version> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.8.2</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.j256.ormlite</groupId> 
      <artifactId>ormlite-android</artifactId> 
      <version>4.45</version> 
     </dependency> 
     <dependency> 
      <groupId>com.j256.ormlite</groupId> 
      <artifactId>ormlite-core</artifactId> 
      <version>4.45</version> 
     </dependency> 
     <dependency> 
      <groupId>com.j256.ormlite</groupId> 
      <artifactId>ormlite-jdbc</artifactId> 
      <version>4.45</version> 
     </dependency> 
     <dependency> 
      <groupId>org.mockito</groupId> 
      <artifactId>mockito-all</artifactId> 
      <version>1.8.4</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>com.jayway.maven.plugins.android.generation2</groupId> 
       <artifactId>android-maven-plugin</artifactId> 
       <version>3.6.0</version> 
       <configuration> 
        <androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile> 
        <assetsDirectory>${project.basedir}/assets</assetsDirectory> 
        <resourceDirectory>${project.basedir}/res</resourceDirectory> 
        <nativeLibrariesDirectory>${project.basedir}/src/main/native</nativeLibrariesDirectory> 
        <sdk> 
         <platform>16</platform> 
        </sdk> 
             <undeployBeforeDeploy>true</undeployBeforeDeploy> 
       </configuration> 
       <extensions>true</extensions> 
      </plugin> 

      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.0</version> 
       <configuration> 
        <source>1.6</source> 
        <target>1.6</target> 
       </configuration> 
      </plugin> 

      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <version>2.15</version> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

詹金斯輸出這樣的 - >

[INFO] --- maven-surefire-plugin:2.15:test (default-test) @ GhostRunner --- 
[INFO] No tests to run. 
mojoSucceeded org.apache.maven.plugins:maven-surefire-plugin:2.15(default-test) 
[JENKINS] Recording test results 
mojoStarted com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.6.0(default-emma) 

另一個有趣的一點是,我可以刪除神火依賴和單元測試仍然針對IntelliJ中的安裝目標運行良好。出於某種原因,Maven在Cloudbees上從Jenkins運行時看不到測試。

智慧收到感謝。

這裏是CloudBees的不得不說::

這裏的問題是,是的IntelliJ編譯測試類爲您 並把這些類到 $ {} project.build.testOutputDirectory爲您。

您可以通過獲取的IntelliJ執行 乾淨安裝在本地複製此故障(按住⌘而在生命週期的目標點擊)

有兩種方法來解決這個問題。

告訴Maven的,你的測試源不是在標準位置

把你的測試源到標準位置。

當你在處理大量的插件,其中一些未由Apache Maven的團隊或Codehaus的Mojo的小組撰寫 的,與 標準的目錄結構會是最好的方式。根據 對Apache Maven或Codehaus Mojo社區的評論,插件通常會在您告訴Maven您正在使用非標準佈局的 時收到更改。不受該審覈流程限制的插件 通常不知道如何正確工作,因此您最終會被迫與標準版面保持一致。

斯蒂芬·康諾利CloudBees的,公司

我已經重新組織我的項目,以反映Maven的規範,但它仍然不能運行CloudBees的服務器上的測試。

下面是從詹金斯控制檯輸出::

[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ GhostRunner --- 
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! 
[INFO] skip non existing resourceDirectory /scratch/jenkins/workspace/ghost runner/src/test/resources 
mojoSucceeded org.apache.maven.plugins:maven-resources-plugin:2.6(default-testResources) 
mojoStarted org.apache.maven.plugins:maven-compiler-plugin:3.0(default-testCompile) 
[INFO] No sources to compile 
[INFO] 
[INFO] --- maven-compiler-plugin:3.0:testCompile (default-testCompile) @ GhostRunner --- 
mojoSucceeded org.apache.maven.plugins:maven-compiler-plugin:3.0(default-testCompile) 
mojoStarted org.apache.maven.plugins:maven-surefire-plugin:2.15(default-test) 
[INFO] 
[INFO] --- maven-surefire-plugin:2.15:test (default-test) @ GhostRunner --- 
[INFO] No tests to run. 

我想最重要的一點是輸出相關

沒有源編譯

不知怎的,它仍然不知道測試的地方。

+0

你在哪裏找到你的單元測試? 'src/test/java',並且你將它們命名爲['* Test * .java','* Test.java'和'* TestCase.java'](http://maven.apache.org/surefire/maven -surefire-插件/測試mojo.html#包括)。 – khmarbaise

+0

它們在/ src/test下,並且都以測試的格式命名。你認爲測試文件夾下的java文件夾很重要嗎? –

+0

是的,它是必需的,因爲它是[Maven中的默認](http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html)'src/main/java'用於單元測試的生產代碼'src/test/java'。在單元測試中,可以在生產代碼和'src/test/resources'中使用資源的'src/main/resources'。 – khmarbaise

回答

1

根據上述問題中的註釋,您似乎並未將測試源文件放入Maven預期的目錄結構中。這實際上是Maven配置問題,並且與CloudBees沒有直接關係(除了CloudBees使用vanilla maven來運行你的構建)。如果您嘗試通過maven'mvn'命令在本地運行自己的構建(例如CloudBees Jenkins CI作業),則應該會遇到同樣的錯誤。

基礎上standard Maven directory structure,你應該把源爲你的測試中:的src/test/java下

如果你想/需要改變默認的Maven目錄結構中,通常有配置更改可以在pom.xml中提供這些設置。然而,許多人發現,與Maven作鬥爭只會導致更多的痛苦,並最終退回標準。

欲瞭解更多信息,檢查出這個關於how to change the default Maven tests directory的stackoverflow線程。

+0

這是有趣的事情。我已經修改了我的項目結構,將所有的src代碼放在預期的位置(如上所述),並且測試仍然不在雲上運行。如果我使用'mvn clean'在本地運行cmd命令行,然後執行'mvn install',則測試全部運行。這個問題看起來似乎是由於某些原因,cloudbees構建不能找到測試來源。 –

+0

請在CloudBees上打開支持憑單,我們可以幫助您深入。 – swashbuck1r

+0

感謝Cloudbees的所有人幫助我。最後問題是我。在重新安排我的項目結構時,我設法從版本控制中刪除了它的很大一部分(源代碼),所以它不會在IntelliJ中顯示爲「更改」。本地一切工作,但bitbucket回購是空的。必須更努力:) –

相關問題