2016-08-12 65 views
2

我想讓測試類知道它們當前是否在Suite內執行。 我有一個測試套件,在所有測試之前啓動服務器,並在所有測試後使用ExternalResource關閉服務器。完美的作品。 在編寫新測試時,我想運行一個測試(或者來自同一個測試類的所有測試)來啓動和停止服務器。所以我希望這些類能夠意識到它們當前是否在套件內部執行,並相應地啓動服務器啓動。 這似乎是不可能的。套件Description永遠不會傳遞到@Rule s或@ClassRule看來。我也無法獲得目前運行當前測試的Runner的參考信息。如何使JUnit測試知道它們當前是否在套件內運行

有沒有辦法做到這一點?

更新由於首次提出答案:

請注意,有可能測試套件之前和之後運行許多其他測試。因此我不能依靠JVM關閉。 我的主要需求是在編寫測​​試之後立即在IDE(eclipse)中運行單個測試,並且仍然啓動服務器並關閉服務器。儘管套件中的每個測試都不應該發生。

回答

0
  1. 使所有的測試類擴展一些AbstractServerTest
  2. 在其中添加@BeforeClass方法來檢查服務器是否已在運行,如果不是,則啓動它。
    • 請記住,將爲每個子類調用@BeforeClass,因此if語句是必需的。
  3. 當最後一次測試完成時,JVM將關閉,所以只要您的服務器運行在相同的JVM中(而不是單獨的進程),則不需要執行任何清理。
    • 如果你的服務器運行的是作爲一個獨立的進程,在你@BeforeClass方法,你可以添加一個shutdownHook將執行一些命令停止服務器時,JVM關閉。
+0

總的來說,我同意這種方法,除了繼承,通常的問題適用於此。你可以用'Rule'來完成,並避免完全繼承 – tddmonkey

+0

@tddmonkey是否需要將此規則添加到每個類?在這兩種情況下,所有測試類都必須改變,但在我看來'擴展AbstractServerTest'比添加註釋更加簡單,這是其他領域的一個噪音。你也必須記住公開場地,否則將被忽略。繼承你不能犯這樣的錯誤。 –

+0

可以工作,但不是在我的情況。有幾百個其他的JUnit測試可以在使用服務器的測試之前或之後運行。這意味着在完成最後一次測試後,JVM不一定會關閉。 – sorrymissjackson

0

也許我只是建議使用端口的探測和檢查,如果一個端口是JUnit測試規則內已經綁定(或@Before/@BeforeClass標註的方法),並只初始化服務端口是否仍然可用。通過這種方式,您可以在外部或套件內啓動該服務,並在測試中重新使用該服務,或者在測試之前對其進行初始化(如果端口仍然可用)。這當然需要固定的端口分配,僅用於測試時所需的特定服務。

正如您明顯正在執行集成測試一樣,您可能也會對如何設置MavenGradle自動在測試集成階段執行測試感興趣。

相關問題