2017-03-04 57 views
2

我很喜歡特拉維斯CI進行持續集成測試。我測試了大部分C++控制檯,桌面(Qt,SFML)和Web(使用Wt)應用程序。它非常適合測試基於瀏覽器的應用程序and has documented this nicely特拉維斯CI的C++桌面GUI測試

我不能做的一件事是在Travis CI上測試桌面應用程序的GUI。我需要一些基本的東西,例如'獲得一個具有特定標題的窗口/命名它的大小','在窗口的中心'點擊鼠標左鍵'和'發送一個空間到窗口'。

我已經可以在本地做到這一點,但只能在本地使用xdotools,LDTP2和Sikuli。然而,在Travis CI上,我無法讓這些工具成功運行。我一直試圖寫一個關於它的tutorialthese are my scripts),我有contacted the folks at Travis甚至set a bounty here,都沒有成功。因爲這是一個複雜的過程(在Travis上設置一個Windows管理器,編寫桌面應用程序進行測試,編寫腳本以便在bash中測試這些腳本)我認爲在這裏發佈這些小個體錯誤是沒有用的(大多數答案這裏已經)。

我的問題是:任何人都不會有的

  • 非網C++圖形用戶界面應用程序
  • 有它的GUI在本地和特拉維斯
  • 這些測試包括了測試工作示例發送按鍵和鼠標點擊

我不關心確切的工具(xdotools或其他窗口管理器工具,Qt左右我其他C++ GUI庫,bash或任何其他腳本語言)。我想要的是讓Travis CI在git push上檢查我的GUI。

回答

0

不知道這是否回答你的問題,但你嘗試過的東西的語法可能是它爲什麼會破壞你的原因。

upstream issue,反覆以下時:

var=value; program 

你能嘗試使用下面的語法來代替:

var=value program 

export var=value; program 

說明:;是表達式的終止符,並且有變量t已設置不適用於子PID。要麼導出變量,要麼使用特殊語法(沒有;作爲分隔符)將使變量剛好可用於子PID。

+0

這很有幫助。我現在會試試這個。謝謝! – richelbilderbeek

+0

我試過使用它,但是https://travis-ci.org/richelbilderbeek/testing_cpp_gui_applications_tutorial#L948顯示這不是問題。感謝您的幫助,但:-) – richelbilderbeek

0

好了,我這裏有:

Nana C++ GUI test in Travis

Other click,特拉維斯:

3.04s$ ./clicked 
Will wait 2 sec... 
waiting 2 sec... 
running... 
3 times automatic click. 
Automatically clicking widget : 
When the window fm is clicked, this function is called. 
Automatically clicking widget : 
When the window fm is clicked, this function is called. 
Automatically clicking widget : 
When the window fm is clicked, this function is called. 
Now with then mouse. 
Congratulations, this was not trivial ! 
Done... 
Now again waiting 1 sec... 
Done... Now API::exit all ... 

編程here

void clicked(const nana::arg_click & eventinfo) 
{ 
    std::cout<< "When the window fm is clicked, this function is called. \n"; 
} 



int main() 
{ 
    using namespace nana; 
    form fm; 
    fm.events().click(clicked); 
    fm.show(); 
    exec(2, 1, [&fm]() 
     { 
      std::cout << "3 times automatic click. \n"; 
      click(fm); 
      click(fm); 
      click(fm); 

      nana::arg_mouse m; 
      m.window_handle=fm; 
      m.alt=m.ctrl=m.mid_button=m.shift=false; 
      m.left_button=true; 
      m.pos.x=m.pos.y=1; 
      m.button=::nana::mouse::left_button; 

      std::cout << "Now with then mouse. \n"; 
      //fm.events().mouse_down.emit(m); 
      //fm.events().mouse_up.emit(m); 

      // char c; 
      // std::cin >> c; 

      //fm.close(); 

     }); 
} 

這遠遠沒有準備好,只是我最初的想法。我最大的問題是,我沒有在Linux的GUI經驗。我實施了一些測試和幾個例子,目前這些例子足以讓我們發現大問題。我在Windows中測試localy(當然,當我有時間的時候......)但我個人無法在Linux中測試,所以,Travis對我來說非常有用。 我發明了幾個函數來在GUI庫自己寫測試。不是(非常)優雅。我希望我會有時間讓它變得更好。我很樂意看到您的解決方案。

+0

我很高興聽到你享受體面的單元測試。太糟糕了,它不能回答我的問題,例如'有一個特定的標題窗口/名稱的大小'。我也能夠從應用程序內操縱我的窗口。我想從程序外部發送按鍵和鼠標點擊。 – richelbilderbeek