2012-12-28 65 views
2

這些測試應該在之後運行這個jar文件被構建。 他們應測試它是否運行, 以及它是否在給定某些輸入文件的情況下生成正確的控制檯輸出。如何使用Maven測試Java控制檯應用程序?

請問您可以指出控制檯應用程序的這些測試的一些示例嗎?這些測試是否必須用Java編寫才能用於Maven?

還有一個類似的問題(Testing console based applications/programs - Java),但我需要的是黑匣子測試,而不是單元測試。它沒有提到Maven。


UPDATE:

原來,它VAS很容易做到的。我的第一個問題是在看到如此多的定義(What is Unit test, Integration Test, Smoke test, Regression Test?; What's the difference between unit, functional, acceptance, and integration tests?; What are unit testing and integration testing, and what other types of testing should I know about?; What is an integration test exactly?)之後,對集成測試有一個誤解。第二個問題是我不打算用Java編寫這些測試,但最終我不得不學習如何使用java.lang.Runtime

首先,我已經加入這個我的pom.xml

<plugin> 
    <artifactId>maven-failsafe-plugin</artifactId> 
    <version>2.6</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>integration-test</goal> 
       <goal>verify</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 

然後我就在的src/test/java下創建的* IT.java文件:

public class MyAppIT { 

    @Test 
    public void test() throws IOException { 
     Runtime runtime = Runtime.getRuntime(); 
     String cmd = "java -cp target/myapp.jar my.app.Main"; 
     Process process = runtime.exec(cmd); 
     InputStreamReader isr = new InputStreamReader(process.getErrorStream()); 
     BufferedReader br = new BufferedReader(isr); 
     Boolean containsUsage = false; 
     String line; 
     while ((line = br.readLine()) != null) { 
      if (line.contains("Usage")) { 
       containsUsage = true; 
      } 
     } 
     assertTrue(containsUsage); 
    } 
} 

現在我用mvn驗證而不是mvn包

Results : 

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 

回答

3

看來你想要集成測試。

在許多情況下,應用程序是由持續集成(CI)系統構建,如Hudson,Travis或者某些程序。該CI在每次提交源代碼後編譯並運行單元測試。 編譯成功後,觸發集成測試項目。

集成測試駐留在單獨的maven源項目中。你可以像src/test/java中的普通單元測試一樣創建集成測試類。當然,你不要單獨測試一個類 - 這就是單元測試 - 你需要爲系統設置集成測試(連接正確的組件)並執行所需的測試「煙霧測試」。

因此,您可以創建另一個項目進行集成測試,並在構建應用程序後執行此項目。您可以創建一個maven parent-pom並使用子模塊來避免手動集成測試構建。

測試類需要是java,位於src/test/java中,它們看起來像正常的單元測試,並且由maven運行。 當然,您可以在測試中啓動一個非java程序並聲明結果。

控制檯應用程序有一個「」方法,所以我會在測試中調用主要方法。否則,你必須運行一個shell命令或其他東西。 (通過java.lang.Runtime中)

有測試控制檯應用程序沒有特長。除非你想測試用戶界面 - 用戶界面的自動化測試不是那麼容易和困難,請澄清這是否是你的焦點。

+0

是的,我要的是測試如果程序實際運行,沒有如果「** **爲主」的方法運作。我不會稱之爲我的程序的界面測試不允許任何用戶交互。它只是處理輸入文件並輸出結果。 – utapyngo

+0

命令行調用會發出對主方法的調用。您可以使用Runtime來執行「java my.app.Main」命令,您在測試項目中擁有完整的java可能性。 – burna

+0

不滿意 - 還有問題嗎? – burna

1

我會建議結合使用maven-invoker-pluginexec-maven-plugin。 Invoker創建一個子項目並運行它,exec插件啓動你的JAR。調用者然後驗證其輸出。

例如,採取s3auth-relay項目一起來看看這款pom.xml。該模塊本身生成一個JAR控制檯應用程序,它是一個HTTP守護程序。 pom.xmlmaven-invoker-plugin配置的一部分。它啓動控制檯應用程序並檢查它是否正常關閉。爲了防止JAR作爲守護進程啓動,我們使用可選的-d標誌。

該示例沒有顯示測試JAR輸出的能力,但可以使用post build script機制maven-invoker-plugin

+0

不幸的是,maven-invoker-plugin旨在運行Maven作爲maven-plugins集成測試的一部分,特別是控制檯應用程序。 – khmarbaise

+0

只要您的控制檯應用程序並不需要用戶輸入Maven的調用,插件是一個完美的結合 – yegor256

+0

你有一些用法示例? – khmarbaise

相關問題