2017-01-07 60 views
0

我必須爲Java「繪圖」應用程序GUI(如ArgoUML/LaTeXDraw/etc)自動生成測試。我需要驗證測試的應用程序的行爲是否正確。在我給出的例子中,我需要檢查Undo/Redo按鈕是否正常工作=撤銷將畫布置於前置狀態,並且重做將其重置爲原來的狀態。測試使用Java Swing編碼的應用程序GUI:最佳方法?

我已經我將如何處理這個問題,但我想有經驗的人的意見的想法:

  • 我應該使用機器人類的輸入模擬到GUI?或者 有沒有更簡單的方法?
  • 我需要捕捉程序供以後分析的狀態,看 如果程序的狀態是一致的,我應該只是截圖 窗口或者是有沒有辦法通過所有Jframe的 組件和捕獲迭代他們的屬性(它應該包括畫布 狀態)?

  • 更重要的是,我不知道如何找到在 接口上的每個按鈕。告訴機器人一個給定的 按鈕位於窗口中某個(x,y)位置的最簡單方法是什麼?我應該在按鈕的.jpeg版本中搜索 像素嗎?我是否應該手動定位界面上的每個 按鈕(即爲包含x,y屬性的每個按鈕 創建一個類)?

  • 最後,我從來沒有「附加」一個機器人到一個給定的程序。可以 我只是加載我想測試的軟件的.jar文件,並告訴 機器人在該窗口上運行?或者我需要使用原始項目中的所有 源文件?

謝謝你的時間,如果我的問題的任何部分似乎不夠清楚,請告訴我,我會盡力解釋它更清楚。

PS:關於我需要做的工作有什麼建議,歡迎:)

+0

*「我必須自動生成JAVA測試」*這些測試有什麼好處?是否真的測試*測試代碼的行爲*還是測試測試生成器是否正常工作?我不會依賴這樣的測試。 –

+0

我剛剛編輯OP – LostReality

+0

您可以嘗試使用ReTest(https://www.retest.de/en/),它帶有一種有趣的新方法,用於功能性迴歸測試和基於ai的猴子測試。 – roesslerj

回答

1

我已經done你在explained你在其他答案的評論。

Robot可以爲流程的各個部分有用的,但是,這取決於它是如何寫的,遵循最佳測試實踐的渴望,以及總體需求也可以得到有限的快。如果您沒有編寫它或者最佳編碼實踐使您無法訪問或直接測試應用程序的各個方面,則需要其他方法。

我的經驗讓我通過使用反射來測試實際狀態(如各種組件的文本值)來挖掘主入口點。 Robot只對我的情況執行key events有用。

最終,答案(S)取決於許多因素:

  1. 機器人? - 當然,只要它適合您的需求就使用它。
  2. 在滿足要求的同時做最簡單的事情。如果屏幕截圖可以,請執行此操作(使用Robot)。如果你需要更多的信息,你可以get the componentsJFrameJPanel,並保存提供的任何屬性。
  3. 這可以通過UI的調查以多種方式完成。找到該按鈕並直接執行doClick,使用Robot移動鼠標並按下鼠標等。
  4. 當您實例化新的Robot時,它將鏈接到主設備。簡單情況下不需要更多new Robot().keyPress(KeyEvent.VK_ENTER);

鑑於所有這些,有焦點等缺陷。最好啓動你的模擬/測試,不要觸摸機器外圍的任何。另外,根據某些方法的運行時間,您可能想要Thread.sleep()(正如我們遺憾地做的那樣)或使用連接的線程。

+0

非常感謝你的回答,這對我有很大的幫助。但我仍然沒有得到第三個問題的解釋。當你使用Robot時他怎麼知道可以說「新文件」按鈕位於JFrame上的位置(340,220)?您是否爲每個按鈕手動指定了幾何座標?這是我最大的擔心...... – LostReality

+0

@LostReality,很高興它的幫助。我工作了大約一年,所以我不確定你指的是什麼。我不記得我們使用座標來獲取組件,而是通過測試套件和util代碼進行掃描,但沒有看到類似的東西。如果我們確實在某處通過調查應用程序代碼來做到這一點。你能告訴我文件和行號嗎? – ChiefTwoPencils

+1

@LostReality,如果我誤解了最後一條評論,我們查看了應用程序的源代碼。所以,我們知道有一個'SimEnvelopeAcceptor'在'Simulator.java'中擴展了'Button'。通過反射,我們可以通過變量名(''envelopeAcceptor「')獲得該按鈕。如果您無法訪問應用程序源代碼,仍然可以通過這種方式來完成,但是您不知道該名稱,因此您必須將所有代碼都弄清楚並弄清楚。此時,最好使用Robot的鼠標移動並進行模擬點擊。這可以通過反覆試驗來完成。 – ChiefTwoPencils

0

您還沒有添加任何代碼,這樣我就可以猜出:

如果你的代碼如下MV(V)C模式你不需要通過GUI來測試。您可以直接測試處理重做/撤銷的控制器方法,並驗證它們是否正確地更改了模型並與撤銷/重做堆棧進行通信(是我的世界中的模型的一部分...)。

+0

我願意測試的軟件不是我自己編寫的,這個想法實際上是生成各種各樣的測試用例,然後在GUI上執行它。在執行這些測試時,應該「記錄」GUI的狀態以檢查應用程序是否具有所需的行爲。即在畫布上畫一個矩形,然後畫一個圓,然後撤消兩次,然後重做=畫布應該包含一個矩形。 – LostReality

相關問題