本篇文章給大家分享的是有關(guān)如何用C語言對Gtk及應用進行功能測試,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
創(chuàng)新互聯(lián)是一家專業(yè)的成都網(wǎng)站建設(shè)公司,我們專注成都網(wǎng)站設(shè)計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè)、網(wǎng)絡(luò)營銷、企業(yè)網(wǎng)站建設(shè),賣友情鏈接,一元廣告為企業(yè)客戶提供一站式建站解決方案,能帶給客戶新的互聯(lián)網(wǎng)理念。從網(wǎng)站結(jié)構(gòu)的規(guī)劃UI設(shè)計到用戶體驗提高,創(chuàng)新互聯(lián)力求做到盡善盡美。
如何測試你應用的功能。
自動化測試用來保證你程序的質(zhì)量以及讓它以預想的運行。單元測試只是檢測你算法的某一部分,而并不注重各組件間的適應性。這就是為什么會有功能測試,它有時也稱為集成測試。
功能測試簡單地與你的用戶界面進行交互,無論它是網(wǎng)站還是桌面應用。為了展示功能測試如何工作,我們以測試一個 Gtk+ 應用為例。為了簡單起見,這個教程里,我們使用 Gtk+ 2.0 教程的示例。
基礎(chǔ)設(shè)置
對于每一個功能測試,你通常需要定義一些全局變量,比如 “用戶交互時延” 或者 “失敗的超時時間”(也就是說,如果在指定的時間內(nèi)一個事件沒有發(fā)生,程序就要中斷)。
#define TTT_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(f) ((TttFunctionalTestUtilIdleCondition)(f)) #define TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME (125000) #define TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME_LONG (500000) typedef gboolean (*TttFunctionalTestUtilIdleCondition)(gpointer data); struct timespec ttt_functional_test_util_default_timeout = { 20, 0, };
現(xiàn)在我們可以實現(xiàn)我們自己的超時函數(shù)。這里,為了能夠得到期望的延遲,我們采用 usleep 函數(shù)。
void ttt_functional_test_util_reaction_time() { usleep(TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME); } void ttt_functional_test_util_reaction_time_long() { usleep(TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME_LONG); }
直到獲得控制狀態(tài),超時函數(shù)才會推遲執(zhí)行。這對于一個異步執(zhí)行的動作很有幫助,這也是為什么采用這么長的時延。
void ttt_functional_test_util_idle_condition_and_timeout( TttFunctionalTestUtilIdleCondition idle_condition, struct timespec *timeout, pointer data) { struct timespec start_time, current_time; clock_gettime(CLOCK_MONOTONIC, &start_time); while(TTT_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(idle_condition)(data)){ ttt_functional_test_util_reaction_time(); clock_gettime(CLOCK_MONOTONIC, ¤t_time); if(start_time.tv_sec + timeout->tv_sec < current_time.tv_sec){ break; } } ttt_functional_test_util_reaction_time(); }
與圖形化用戶界面交互
為了模擬用戶交互的操作, Gdk 庫 為我們提供了一些需要的函數(shù)。要完成我們的工作,我們只需要如下 3 個函數(shù):
gdk_display_warp_pointer()
gdk_test_simulate_button()
gdk_test_simulate_key()
舉個例子,為了測試按鈕點擊,我們可以這么做:
gboolean ttt_functional_test_util_button_click(GtkButton *button) { GtkWidget *widget; GdkWindow *window; gint x, y; gint origin_x, origin_y; if(button == NULL || !GTK_IS_BUTTON(button)){ return(FALSE); } widget = button; if(!GTK_WIDGET_REALIZED(widget)){ ttt_functional_test_util_reaction_time_long(); } /* retrieve window and pointer position */ gdk_threads_enter(); window = gtk_widget_get_window(widget); x = widget->allocation.x + widget->allocation.width / 2.0; y = widget->allocation.y + widget->allocation.height / 2.0; gdk_window_get_origin(window, &origin_x, &origin_y); gdk_display_warp_pointer(gtk_widget_get_display(widget), gtk_widget_get_screen(widget), origin_x + x, origin_y + y); gdk_threads_leave(); /* click the button */ ttt_functional_test_util_reaction_time(); gdk_test_simulate_button(window, x, y, 1, GDK_BUTTON1_MASK, GDK_BUTTON_PRESS); ttt_functional_test_util_reaction_time(); gdk_test_simulate_button(window, x, y, 1, GDK_BUTTON1_MASK, GDK_BUTTON_RELEASE); ttt_functional_test_util_reaction_time(); ttt_functional_test_util_reaction_time_long(); return(TRUE); }
我們想要保證按鈕處于激活狀態(tài),因此我們提供一個空閑條件函數(shù):
gboolean ttt_functional_test_util_idle_test_toggle_active( GtkToggleButton **toggle_button) { gboolean do_idle; do_idle = TRUE; gdk_threads_enter(); if(*toggle_button != NULL && GTK_IS_TOGGLE_BUTTON(*toggle_button) && gtk_toggle_button_get_active(*toggle_button)){ do_idle = FALSE; } gdk_threads_leave(); return(do_idle); }
測試場景
因為這個 Tictactoe 程序非常簡單,我們只需要確保點擊了一個 GtkToggleButton 按鈕即可。一旦該按鈕肯定進入了激活狀態(tài),功能測試就可以執(zhí)行。為了點擊按鈕,我們使用上面提到的很方便的 util 函數(shù)。
如圖所示,我們假設(shè),填滿***行,玩家 A 就贏,因為玩家 B 沒有注意,只填充了第二行。
GtkWindow *window; Tictactoe *ttt; void* ttt_functional_test_gtk_main(void *) { gtk_main(); pthread_exit(NULL); } void ttt_functional_test_dumb_player_b() { GtkButton *buttons[3][3]; guint i; /* to avoid race-conditions copy the buttons */ gdk_threads_enter(); memcpy(buttons, ttt->buttons, 9 * sizeof(GtkButton *)); gdk_threads_leave(); /* TEST 1 - the dumb player B */ for(i = 0; i < 3; i++){ /* assert player A clicks the button successfully */ if(!ttt_functional_test_util_button_click(buttons[0][i])){ exit(-1); } functional_test_util_idle_condition_and_timeout( ttt_functional_test_util_idle_test_toggle_active, ttt_functional_test_util_default_timeout, &buttons[0][i]); /* assert player B clicks the button successfully */ if(!ttt_functional_test_util_button_click(buttons[1][i])){ exit(-1); } functional_test_util_idle_condition_and_timeout( ttt_functional_test_util_idle_test_toggle_active, ttt_functional_test_util_default_timeout, &buttons[1][i]); } } int main(int argc, char **argv) { pthread_t thread; gtk_init(&argc, &argv); /* start the tictactoe application */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); ttt = tictactoe_new(); gtk_container_add(window, ttt); gtk_widget_show_all(window); /* start the Gtk+ dispatcher */ pthread_create(&thread, NULL, ttt_functional_test_gtk_main, NULL); /* launch test routines */ ttt_functional_test_dumb_player_b(); /* terminate the application */ gdk_threads_enter(); gtk_main_quit(); gdk_threads_leave(); return(0); }
以上就是如何用C語言對Gtk及應用進行功能測試,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站標題:如何用C語言對Gtk及應用進行功能測試
當前URL:http://www.chinadenli.net/article22/ieosjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機、網(wǎng)站制作、網(wǎng)站改版、ChatGPT、自適應網(wǎng)站、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)