精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用C語言對(duì)Gtk+應(yīng)用進(jìn)行功能測(cè)試

開發(fā) 后端
自動(dòng)化測(cè)試用來保證你程序的質(zhì)量以及讓它以預(yù)想的運(yùn)行。單元測(cè)試只是檢測(cè)你算法的某一部分,而并不注重各組件間的適應(yīng)性。這就是為什么會(huì)有功能測(cè)試,它有時(shí)也稱為集成測(cè)試。

[[206159]]

這個(gè)簡(jiǎn)單教程教你如何測(cè)試你應(yīng)用的功能。

自動(dòng)化測(cè)試用來保證你程序的質(zhì)量以及讓它以預(yù)想的運(yùn)行。單元測(cè)試只是檢測(cè)你算法的某一部分,而并不注重各組件間的適應(yīng)性。這就是為什么會(huì)有功能測(cè)試,它有時(shí)也稱為集成測(cè)試。

功能測(cè)試簡(jiǎn)單地與你的用戶界面進(jìn)行交互,無論它是網(wǎng)站還是桌面應(yīng)用。為了展示功能測(cè)試如何工作,我們以測(cè)試一個(gè) Gtk+ 應(yīng)用為例。為了簡(jiǎn)單起見,這個(gè)教程里,我們使用 Gtk+ 2.0 教程的示例。

基礎(chǔ)設(shè)置

對(duì)于每一個(gè)功能測(cè)試,你通常需要定義一些全局變量,比如 “用戶交互時(shí)延” 或者 “失敗的超時(shí)時(shí)間”(也就是說,如果在指定的時(shí)間內(nèi)一個(gè)事件沒有發(fā)生,程序就要中斷)。

  1. #define TTT_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(f) ((TttFunctionalTestUtilIdleCondition)(f)) 
  2. #define TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME (125000) 
  3. #define TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME_LONG (500000) 
  4. typedef gboolean (*TttFunctionalTestUtilIdleCondition)(gpointer data); 
  5. struct timespec ttt_functional_test_util_default_timeout = { 
  6.   20, 
  7.   0, 
  8. }; 

現(xiàn)在我們可以實(shí)現(xiàn)我們自己的超時(shí)函數(shù)。這里,為了能夠得到期望的延遲,我們采用 usleep 函數(shù)。

  1. void 
  2. ttt_functional_test_util_reaction_time() 
  3.   usleep(TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME); 
  4. void 
  5. ttt_functional_test_util_reaction_time_long() 
  6.   usleep(TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME_LONG); 

直到獲得控制狀態(tài),超時(shí)函數(shù)才會(huì)推遲執(zhí)行。這對(duì)于一個(gè)異步執(zhí)行的動(dòng)作很有幫助,這也是為什么采用這么長(zhǎng)的時(shí)延。

  1. void 
  2. ttt_functional_test_util_idle_condition_and_timeout( 
  3.      TttFunctionalTestUtilIdleCondition idle_condition, 
  4.      struct timespec *timeout, 
  5.      pointer data) 
  6.   struct timespec start_time, current_time
  7.   clock_gettime(CLOCK_MONOTONIC, 
  8.                 &start_time); 
  9.   while(TTT_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(idle_condition)(data)){ 
  10.     ttt_functional_test_util_reaction_time(); 
  11.     clock_gettime(CLOCK_MONOTONIC, 
  12.                   &current_time); 
  13.     if(start_time.tv_sec + timeout->tv_sec < current_time.tv_sec){ 
  14.       break; 
  15.     } 
  16.   } 
  17.   ttt_functional_test_util_reaction_time(); 

與圖形化用戶界面交互

為了模擬用戶交互的操作, Gdk 庫 為我們提供了一些需要的函數(shù)。要完成我們的工作,我們只需要如下 3 個(gè)函數(shù):

  • gdk_display_warp_pointer()
  • gdk_test_simulate_button()
  • gdk_test_simulate_key()

舉個(gè)例子,為了測(cè)試按鈕點(diǎn)擊,我們可以這么做:

  1. gboolean 
  2. ttt_functional_test_util_button_click(GtkButton *button) 
  3.   GtkWidget *widget; 
  4.   GdkWindow *window; 
  5.   gint x, y; 
  6.   gint origin_x, origin_y; 
  7.   if(button == NULL || 
  8.      !GTK_IS_BUTTON(button)){ 
  9.     return(FALSE); 
  10.   } 
  11.   widget = button; 
  12.   if(!GTK_WIDGET_REALIZED(widget)){ 
  13.     ttt_functional_test_util_reaction_time_long(); 
  14.   } 
  15.   /* retrieve window and pointer position */ 
  16.   gdk_threads_enter(); 
  17.   window = gtk_widget_get_window(widget); 
  18.   x = widget->allocation.x + widget->allocation.width / 2.0; 
  19.   y = widget->allocation.y + widget->allocation.height / 2.0; 
  20.   gdk_window_get_origin(window, &origin_x, &origin_y); 
  21.   gdk_display_warp_pointer(gtk_widget_get_display(widget), 
  22.                            gtk_widget_get_screen(widget), 
  23.                            origin_x + x, origin_y + y); 
  24.   gdk_threads_leave(); 
  25.   /* click the button */ 
  26.   ttt_functional_test_util_reaction_time(); 
  27.   gdk_test_simulate_button(window, 
  28.                            x, 
  29.                            y, 
  30.                            1, 
  31.                            GDK_BUTTON1_MASK, 
  32.                            GDK_BUTTON_PRESS); 
  33.   ttt_functional_test_util_reaction_time(); 
  34.   gdk_test_simulate_button(window, 
  35.                            x, 
  36.                            y, 
  37.                            1, 
  38.                            GDK_BUTTON1_MASK, 
  39.                            GDK_BUTTON_RELEASE); 
  40.   ttt_functional_test_util_reaction_time(); 
  41.   ttt_functional_test_util_reaction_time_long(); 
  42.   return(TRUE); 

我們想要保證按鈕處于激活狀態(tài),因此我們提供一個(gè)空閑條件函數(shù):

  1. gboolean 
  2. ttt_functional_test_util_idle_test_toggle_active( 
  3.      GtkToggleButton **toggle_button) 
  4.   gboolean do_idle; 
  5.   do_idle = TRUE
  6.   gdk_threads_enter(); 
  7.   if(*toggle_button != NULL && 
  8.      GTK_IS_TOGGLE_BUTTON(*toggle_button) && 
  9.      gtk_toggle_button_get_active(*toggle_button)){ 
  10.     do_idle = FALSE
  11.   } 
  12.   gdk_threads_leave(); 
  13.   return(do_idle); 

測(cè)試場(chǎng)景

因?yàn)檫@個(gè) Tictactoe 程序非常簡(jiǎn)單,我們只需要確保點(diǎn)擊了一個(gè) GtkToggleButton 按鈕即可。一旦該按鈕肯定進(jìn)入了激活狀態(tài),功能測(cè)試就可以執(zhí)行。為了點(diǎn)擊按鈕,我們使用上面提到的很方便的 util 函數(shù)。

如圖所示,我們假設(shè),填滿***行,玩家 A 就贏,因?yàn)橥婕?B 沒有注意,只填充了第二行。

  1. GtkWindow *window; 
  2. Tictactoe *ttt; 
  3. void* 
  4. ttt_functional_test_gtk_main(void *) 
  5.   gtk_main(); 
  6.   pthread_exit(NULL); 
  7. void 
  8. ttt_functional_test_dumb_player_b() 
  9.   GtkButton *buttons[3][3]; 
  10.   guint i; 
  11.   /* to avoid race-conditions copy the buttons */ 
  12.   gdk_threads_enter(); 
  13.   memcpy(buttons, ttt->buttons, 9 * sizeof(GtkButton *)); 
  14.   gdk_threads_leave(); 
  15.   /* TEST 1 - the dumb player B */ 
  16.   for(i = 0; i < 3; i++){ 
  17.     /* assert player A clicks the button successfully */ 
  18.     if(!ttt_functional_test_util_button_click(buttons[0][i])){ 
  19.       exit(-1); 
  20.     } 
  21.     functional_test_util_idle_condition_and_timeout( 
  22.          ttt_functional_test_util_idle_test_toggle_active, 
  23.          ttt_functional_test_util_default_timeout, 
  24.          &buttons[0][i]); 
  25.     /* assert player B clicks the button successfully */ 
  26.     if(!ttt_functional_test_util_button_click(buttons[1][i])){ 
  27.       exit(-1); 
  28.     } 
  29.     functional_test_util_idle_condition_and_timeout( 
  30.          ttt_functional_test_util_idle_test_toggle_active, 
  31.          ttt_functional_test_util_default_timeout, 
  32.          &buttons[1][i]); 
  33.   } 
  34. int 
  35. main(int argc, char **argv) 
  36.   pthread_t thread; 
  37.   gtk_init(&argc, &argv); 
  38.   /* start the tictactoe application */ 
  39.   window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
  40.   ttt = tictactoe_new(); 
  41.   gtk_container_add(window, ttt); 
  42.   gtk_widget_show_all(window); 
  43.   /* start the Gtk+ dispatcher */ 
  44.   pthread_create(&thread, NULL
  45.                  ttt_functional_test_gtk_main, NULL); 
  46.   /* launch test routines */ 
  47.   ttt_functional_test_dumb_player_b(); 
  48.   /* terminate the application */ 
  49.   gdk_threads_enter(); 
  50.   gtk_main_quit(); 
  51.   gdk_threads_leave(); 
  52.   return(0); 

(題圖:opensource.com)

 

責(zé)任編輯:龐桂玉 來源: Linux中國(guó)
相關(guān)推薦

2009-03-18 14:42:23

LinuxGTK+ 2.16.0發(fā)布

2009-07-08 14:32:10

GTK+嵌入式Linux

2010-08-24 16:07:37

C語言

2020-12-30 08:50:15

Font ManageLinux開源

2013-05-15 10:27:05

R語言

2009-02-16 09:10:00

ChromeLinuxGTK

2011-05-13 15:46:49

C模塊化

2014-07-15 11:16:17

Go語言

2014-04-11 09:45:15

2019-07-29 09:19:26

編程語言PythonJava

2010-05-18 11:04:11

MySQL數(shù)據(jù)庫

2011-08-31 17:55:06

2023-09-03 23:49:35

2021-02-03 13:56:09

KerasAPI深度學(xué)習(xí)

2019-09-29 09:40:20

LinuxWindowsMacOS

2009-10-09 18:21:32

服務(wù)器測(cè)試

2009-10-23 12:53:25

VB.NET語言

2013-05-24 09:25:27

2015-08-18 09:31:12

圖標(biāo)AB測(cè)試

2010-10-27 10:19:33

UnicodeJava
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美日韩在线播放| 国产一区二区三区av电影| 亚洲精品99久久久久中文字幕| 免费的av在线| 国产高清在线观看视频| 在线成人欧美| 精品亚洲一区二区三区在线播放 | 亚洲免费伊人电影在线观看av| 日韩中文字幕在线免费| 四虎永久在线精品免费网址| 国产精品日本欧美一区二区三区| 国产视频在线一区二区| 一区二区三区 日韩| 欧美日韩在线看片| 成人一区二区三区在线观看| 91av视频导航| 激情高潮到大叫狂喷水| 中文字幕av一区二区三区四区| 黄色一区二区三区| 色乱码一区二区三在线看| 国产色视频在线| 亚洲影视在线| 中文字幕精品视频| 污片免费在线观看| 成人全视频在线观看在线播放高清| 亚洲欧洲色图综合| 国产综合欧美在线看| 中文字幕无线码一区| 黄色成人在线网址| 正在播放欧美一区| 又黄又爽的网站| 欧美91在线|欧美| 亚洲成av人片观看| 国产福利片一区二区| 日本黄色三级视频| 韩国女主播成人在线观看| 欧美亚洲另类在线| 老司机精品免费视频| 国产欧美三级电影| 欧美精品日日鲁夜夜添| 国产成人a亚洲精v品无码| 2021国产在线| 国产精品色一区二区三区| 国产日韩久久| 精品女同一区二区三区| 日日嗨av一区二区三区四区| 久久久在线视频| 欧美h片在线观看| 久草成人资源| 日韩av在线精品| 免费看涩涩视频| 色综合一本到久久亚洲91| 性做久久久久久免费观看| 欧美亚洲视频一区| 国产高清视频在线观看| 91欧美一区二区| 成人精品一二区| 国产欧美一级片| 美女任你摸久久| 国产极品jizzhd欧美| 六月丁香激情综合| 国产在线成人| 欧美成人精品激情在线观看| 三上悠亚在线观看视频| 欧美a级成人淫片免费看| 亚洲午夜av久久乱码| 欧亚乱熟女一区二区在线| 精品视频在线观看免费观看| 宅男在线国产精品| 久久国产精品国产精品| 国产91亚洲精品久久久| 欧美性猛片xxxx免费看久爱| 久草精品在线播放| 欧美专区福利免费| 91黄色免费观看| 黄色三级视频在线| 99riav视频一区二区| 欧美午夜精品一区二区三区| 国产成人手机视频| 欧美va视频| 欧美撒尿777hd撒尿| 91色国产在线| 成人永久在线| 日韩一二三四区| 成人免费看片载| 国产日韩三级| 亚洲国产精品电影| 一级黄色片大全| 欧美精品一区二区三区精品| 日韩在线视频免费观看| 91动漫免费网站| 在线免费观看日本欧美爱情大片| 欧美成人中文字幕在线| 日韩免费一级片| 日韩精品一二区| 91在线免费看网站| 成人18视频在线观看| 亚洲人精品一区| 亚洲精品一区二区三区av| 久久精品国产美女| 久久成人免费观看| 麻豆成全视频免费观看在线看| 精品日本美女福利在线观看| 各处沟厕大尺度偷拍女厕嘘嘘| 日韩av首页| 欧美一区二区日韩| 免费在线观看日韩av| 丝袜连裤袜欧美激情日韩| 在线播放国产一区二区三区| 国产高潮国产高潮久久久91| 欧美日韩1080p| 琪琪亚洲精品午夜在线| ,亚洲人成毛片在线播放| 国产成人精品三级| 国产在线精品一区二区中文| 国产永久免费高清在线观看视频| 亚洲婷婷综合色高清在线| 妞干网视频在线观看| 成人日韩在线观看| 欧美一级搡bbbb搡bbbb| 9.1成人看片免费版| 99久久www免费| 91国产精品电影| 一区二区三区午夜| 99精品视频中文字幕| 伊人久久大香线蕉精品| 欧产日产国产精品视频| 在线亚洲高清视频| 任你躁av一区二区三区| 久久中文字幕二区| 69精品小视频| 国产三级自拍视频| 欧美国产日韩亚洲一区| 性一交一乱一伧国产女士spa| 中文字幕色婷婷在线视频| 91精品国产全国免费观看| 亚洲区免费视频| 欧美日韩精选| 成人欧美一区二区三区在线 | 欧美成人综合| 国产精品jizz在线观看麻豆| 国产精品久久久国产盗摄| 久久精品人人做人人爽97| 野外做受又硬又粗又大视频√| 99精品视频在线免费播放| 国产一区二区三区在线观看视频 | 欧美精品乱码视频一二专区| 蜜臀av国产精品久久久久| 农村寡妇一区二区三区| 超黄网站在线观看| 日韩午夜在线播放| 色欲狠狠躁天天躁无码中文字幕 | 天天综合久久| 欧美亚洲免费电影| 无码国产精品96久久久久| 亚洲综合视频在线| 波多野结衣中文字幕在线播放| 自拍偷拍欧美一区| 午夜精品久久久久久久久久久久 | 免费成人在线电影| 亚洲第一福利在线观看| 91麻豆精品成人一区二区| 蜜桃视频免费观看一区| 亚洲精品一区国产精品| 亚洲电影有码| 一区二区三区国产视频| 成人免费毛片男人用品| 久久欧美一区二区| 日本女优爱爱视频| 日本久久综合| 国产欧美婷婷中文| 久久77777| 制服.丝袜.亚洲.中文.综合| 欧美成人aaa片一区国产精品| 国产一区二区三区免费看| 国产免费xxx| 亚洲精品v亚洲精品v日韩精品| 久热精品在线视频| 精品国产av一区二区| 亚洲综合区在线| 日本一卡二卡在线| 久久精品一区二区三区中文字幕| 欧美一区二区视频17c| 人在线成免费视频| 亚洲无线码在线一区观看| 在线观看一二三区| 综合欧美一区二区三区| 伊人色在线视频| 欧美精品导航| 欧美极品一区二区| 国产成人免费| 九九综合九九综合| 亚洲va久久久噜噜噜无码久久| 亚洲一区二区三区视频在线播放 | caopon在线免费视频| 日韩欧美国产一区在线观看| 日本三级理论片| 国产日产欧美精品一区二区三区| 一本久道中文字幕精品亚洲嫩| 国产美女18xxxx免费视频| 伊人久久成人| 亚洲午夜精品久久久久久浪潮| 成午夜精品一区二区三区软件| 国产成人精品一区二区| 色黄网站在线观看| 中文字幕久精品免费视频| 色婷婷视频在线| 8v天堂国产在线一区二区| 日韩不卡视频在线| 亚洲精品videosex极品| 国产又黄又粗的视频| www.亚洲免费av| 成人三级做爰av| 麻豆成人久久精品二区三区红| 91好吊色国产欧美日韩在线| 综合五月婷婷| 桥本有菜av在线| 国产欧美高清视频在线| 国产在线精品二区| 亚洲国产欧美在线观看| 国产欧美亚洲视频| 成人全视频在线观看在线播放高清| 欧美亚洲视频一区二区| 黄页网站在线| 欧美精品在线极品| 免费在线看a| 中文字幕日韩有码| 精品一二三区视频| 亚洲欧美国产另类| 性xxxx视频| 亚洲国产精品99久久| 亚洲精品一区二区三区区别 | 久久久久久久久网站| aaa大片在线观看| 自拍偷拍亚洲欧美| 99青草视频在线播放视| 国产亚洲激情视频在线| 男人的天堂在线免费视频| 亚洲精品国产成人| 天堂在线中文网| 亚洲国产一区二区三区四区| 亚洲国产剧情在线观看| 日韩精品一区二| www.成人在线观看| 日韩精品中文字幕一区| www.激情五月| 精品国产一区久久| 国产18精品乱码免费看| 亚洲高清色综合| 色在线免费视频| 亚洲女人被黑人巨大进入| 色av男人的天堂免费在线| 亚洲欧美国产va在线影院| 国产中文字幕在线看| 国产亚洲激情在线| 黄色在线观看网站| 欧美精品在线极品| 白浆视频在线观看| 日本亚洲欧洲色| 欧美亚洲黄色| 成人欧美视频在线| 欧美激情极品| 日韩av不卡播放| 久久久久亚洲| 国产在线视频在线| 一级成人国产| 国产一级做a爰片久久| 麻豆精品在线看| 日韩精品视频网址| 97se亚洲国产综合自在线不卡| 偷拍夫妻性生活| 国产精品福利一区| 欧美日韩国产精品综合| 欧美日韩精品在线播放| 国产一级一级国产| 欧美日韩大陆一区二区| 嫩草影院一区二区| 亚洲人在线观看| av免费网站在线观看| 97精品一区二区视频在线观看| 日韩成人亚洲| 99热在线播放| 精品国产一区二区三区久久久樱花 | 国产亚洲一卡2卡3卡4卡新区 | 亚洲va欧美va在线观看| 美腿丝袜亚洲图片| 色综合久久av| 国产精品hd| 日韩av片网站| 成人午夜激情影院| 日韩精品电影一区二区三区| 亚洲综合久久久| 黄色网址中文字幕| 日韩免费成人网| av影片免费在线观看| 久久免费少妇高潮久久精品99| 成人激情视屏| 精品国产一区二区三区麻豆免费观看完整版| 欧美日韩在线二区| 日韩精品在线观看av| 美洲天堂一区二卡三卡四卡视频 | 欧美国产激情一区二区三区蜜月| 欧美日韩国产精品综合| 欧美性生活一区| 欧美熟妇另类久久久久久不卡| 色天天综合狠狠色| 欧美大片高清| 成人综合色站| 亚洲成人国产| 国产三级三级看三级| 97se狠狠狠综合亚洲狠狠| 国产成人av免费在线观看| 日本精品免费观看高清观看| 朝桐光av在线一区二区三区| 在线电影中文日韩| 蜜桃av在线| 国产不卡一区二区三区在线观看| 欧美日韩一区二区三区视频播放| 黄色一级视频在线播放| 国产成人av电影在线播放| 少妇愉情理伦三级| 91久久精品一区二区三| 免费看av毛片| 色综合久久悠悠| 国产精品99久久免费| 杨幂一区欧美专区| 首页欧美精品中文字幕| 亚洲av无码国产精品久久| 亚洲国产精品一区二区久久| 国产色在线视频| 久热99视频在线观看| 亚洲我射av| 伊人久久大香线蕉av一区| 蜜桃久久久久久| 男人天堂资源网| 欧美日本一区二区三区| 欧洲不卡av| 国产在线日韩在线| 国产精品久久久久久久免费观看 | 日韩精品 欧美| 成人av午夜电影| 豆国产97在线 | 亚洲| 欧美变态口味重另类| 男女免费观看在线爽爽爽视频| 91在线直播亚洲| 在线一区电影| 免费啪视频在线观看| 亚洲一区二区av电影| 黄色aaa大片| 91精品国产高清自在线| 性欧美lx╳lx╳| 欧美一级片中文字幕| 中文一区在线播放| 一级aaaa毛片| 久久天天躁狠狠躁老女人| 欧美视频二区欧美影视| 欧美一级爱爱视频| av午夜精品一区二区三区| 亚洲 欧美 成人| 综合网日日天干夜夜久久| 色噜噜成人av在线| 奇米777四色影视在线看| 不卡av在线免费观看| 六月丁香激情综合| 在线日韩欧美视频| 999精品嫩草久久久久久99| www国产免费| 成人av手机在线观看| 中文字幕一区在线播放| 日日噜噜噜夜夜爽亚洲精品| 精品国产一级| 777777av| 国产精品美女久久久久aⅴ国产馆| 99久久精品免费看国产交换| 久久久久久亚洲精品中文字幕| 日韩欧美黄色| 免费看涩涩视频| 亚洲高清久久久| 成年人在线观看| 亚洲aaa激情| 亚洲欧美bt| a在线视频播放观看免费观看| 亚洲精品大尺度| 日韩在线你懂得| 国产精品一区二区免费在线观看| 国产欧美日韩视频在线观看| 国产成人免费看一级大黄| 4p变态网欧美系列| 羞羞色午夜精品一区二区三区| 国产精品久久AV无码| 欧美日韩国产小视频| 91九色porn在线资源| 亚洲精品第一区二区三区| 粉嫩欧美一区二区三区高清影视| 青青草视频在线观看免费| 欧美xxxx14xxxxx性爽| 亚洲区小说区图片区qvod| 成人免费播放视频| 日本高清成人免费播放| 久草在线资源站资源站|