2009-10-18 81 views
12

我有一個Java應用程序,它使用JOGL來提供大部分的GUI。OpenGL應用程序的自動測試

有哪些你知道的,或已經使用它可以自動的OpenGL應用程序測試(或更多specificly使用JOGL那些)

只是爲了更新任何工具:該工具可以在Linux或Windows上運行。

+0

赦免noob問題,但是什麼使OpenGL應用程序測試與其他任何應用程序測試不同? – Bahbar 2009-10-20 09:56:26

+1

我的意思是測試OpenGL視圖本身。點擊,拖動,旋轉縮放等....有一些工具可以讓你記錄你的GUI交互並說一個Swing App並重播它們。您可以爲所有核心交互執行此操作,並將其重放爲迴歸測試。我想要一個OpenGL的類似解決方案,但我不知道存在一個。 – hhafez 2009-10-20 21:15:42

回答

10

我已經編寫了C++(Linux上的Qt)&之前的單元測試。我不知道任何理由也不應該爲Java工作。

這爲我工作的事情是:

  • 摘要你的OpenGL上下文提供讓你的代碼的其餘部分是獨立的。在我的情況下,主要應用程序使用Qt的QGLWidget,但是unittests使用了一個基於pbuffer的應用程序,我可以在沒有窗口基礎設施的情況下創建(除了指定的X11 DISPLAY)。後來,我添加了一個「屏幕外Mesa」(純軟件OpenGL實現),所以他們甚至可以在無GPU的無頭構建器上工作。

  • 讓您的OpenGL代碼獨立於您的GUI代碼。在我的情況下,OpenGL「渲染引擎」對Qt類(例如鼠標事件)一無所知。定義您自己的可測試API,它不受任何特定GUI概念的束縛,併爲其編寫測試。

  • 在unittests中,使用glReadPixels從幀緩衝區中讀取內容,並用某些關於哪些像素應該是特定值的斷言命中它們,或者沿着迴歸測試路線並將幀緩衝區捕獲與存儲的圖像進行比較你知道是好的(無論是從手動驗證,還是由其他參考模型生成)。

  • 在任何圖像迴歸測試中允許有點模糊;大多數OpenGL實現產生稍微不同的輸出。

  • (我不這樣做,但是......),理想情況下,希望能夠通過聲明來測試GUI層,它使呼叫的預期序列的渲染引擎響應GUI活動。如果是這樣,並且由於上述測試你對渲染層有信心......呃,不需要真正做渲染。因此,創建使用你的渲染層的合適的模擬對象時,GUI測試(我「從這裏鼠標拖動到那裏的通話效果來渲染層設置一個特定的變換矩陣」想像這樣的測試......這樣的東西)。

+1

+1對於所有的好建議。對於幀緩衝區比較,我們寫了一個小應用程序,它在圖像上進行模糊差異,看看感知增量值,而不是絕對像素值。 – 2009-10-21 22:00:39

+0

問題是GUI是一個使用JOGL構建的定製框架。這就是爲什麼2號不能工作。 例如,我們使用在屏幕上創建圖形元素,用戶可以使用JOGL與所有人交互。我需要一種方法來自動化用戶交互.... – hhafez 2009-10-22 00:55:09

+2

使用任何特定的庫來實現GUI應該沒有關係。創建一個抽象OpenGL Canvas /框架的GraphicsContext類,以及一個抽象任何GUI功能的GUI類。然後,GUI類實現可以呈現給顯示上下文實現,但是您的應用程序不需要關心他們如何一起工作。 – 2009-10-25 11:41:46

2

我一直在想使用的圖片,比較工具,如PDiff測試OpenGL的代碼,通過拍攝快照,將它們保存到磁盤,並與前回歸輸出進行比較。那樣的話,真正糟糕的東西(缺少紋理)會彈出,但人爲的不可感知的東西(例如上面提到的在實現之間的小差異)會很好。上的一個按鈕

此外,對於自動化的用戶交互,無論是GUI類應具有足夠的開放爲您發送的事件或撥打「點擊」,你必須手動注入OS事件添加到您的應用程序。這是可能的,但更麻煩。如果它是開放源代碼,可能更容易打開GUI層。

+0

SSIM(「結構相似性索引」) - http://en.wikipedia.org/wiki/Structural_similarity - 是基於感知考慮的另一種圖像比較器。 – timday 2009-10-30 20:24:25

3

您可以測試使用Sikuli它通過在屏幕截圖圖像識別techonolgy進行UI自動化您的JOGL基礎的應用。

我目前正在使用Sikuli功能測試主要基於NASA Worldwind Java SDK(基於JOGL)的Java應用程序。使用Sikuli Java API我的測試套件可以識別OpenGL畫布中的圖標,點擊它們並拖動它們。 Sikuli也可以通過OCR從畫布上識別和提取文本,但是這種表現似乎有點碰巧(取決於文本背後的語言,字體,大小和背景顏色)。

我已經做了很多自動化的UI測試,使用其他工具通過內省窗口工具包(例如Swing,SWT,native Windows)工作,發現Sikuli比那些運行速度慢得多,但是這是可以理解的,它需要在幕後進行圖像處理。另外請注意,Sikuli目前需要您的應用程序在窗口中運行(而不是全屏模式)。

Sikuli在Windows和Linux上運行。我建議你試試看。我找不到任何其他工具能夠對基於OpenGL的應用程序進行功能測試。