精品欧美一区二区三区在线观看 _久久久久国色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)

欧美精选午夜久久久乱码6080| 蜜桃视频m3u8在线观看| 欧美日韩福利| 91传媒视频在线播放| 欧美少妇一区| 国产成人美女视频| 亚洲av无码一区二区三区性色| av人人综合网| 日韩av福利| 国产日韩欧美精品综合| 国产精品www色诱视频| 男生草女生视频| 欧美美女被草| 亚洲国产一区二区在线播放| 免费av一区二区三区| 这里只有精品国产| 欧美一区成人| 欧美激情成人| 国产麻豆成人传媒免费观看| 欧美第一淫aaasss性| 黄色国产在线视频| 国产高清不卡| 97se亚洲国产综合自在线 | 久久视频免费观看| 少妇搡bbbb搡bbb搡打电话| 中文字幕在线直播| 国产精品另类一区| 超碰97在线资源| 亚洲欧美偷拍视频| 亚洲欧洲日韩| 51精品视频一区二区三区| 超碰超碰超碰超碰超碰| 精品美女视频在线观看免费软件 | 69精品国产久热在线观看| 国产麻豆午夜三级精品| 亚洲字幕久久| 亚洲精品自拍动漫在线| 国产精品自拍偷拍视频| 久久久久99精品成人片试看| 天堂网av成人| 欧美色爱综合网| av动漫在线免费观看| 国产高清在线| 成人国产精品免费| 国产精品嫩草影院一区二区| 麻豆疯狂做受xxxx高潮视频| 成人在线中文| 五月激情六月综合| 伊人久久在线观看| www.av在线| 91在线观看污| 国产精品二区三区四区| 亚洲 日韩 国产第一| www.cao超碰| 日韩电影免费观看高清完整版| 亚洲综合色成人| 国产精品99久久久久久大便| 亚洲一级片在线播放| 中文字幕成人| 欧美午夜宅男影院| 日韩精品久久一区二区| 天天操天天射天天| 高清成人在线观看| 亚洲最大的网站| 日韩和一区二区| 国产精品99一区二区| 最新69国产成人精品视频免费| 99久久久无码国产精品性| 成人自拍在线| 欧美乱妇15p| 伊人网在线综合| 欧美影视资讯| 国产精品伦理在线| 久久久久99| 日本一区二区不卡在线| 久精品国产欧美| 精品精品欲导航| a亚洲天堂av| 欧美视频在线视频精品| www.欧美国产| 天天操狠狠操夜夜操| 国精产品99永久一区一区| 日韩亚洲一区二区| 亚洲人成影院在线观看| 欧美日韩精品免费观看视欧美高清免费大片| 午夜剧场免费在线观看| 成人国产1314www色视频| 中文字幕中文字幕在线一区 | 九九在线高清精品视频| 免费看黄色aaaaaa 片| 欧美亚洲国产视频| 亚洲免费观看高清完整版在线观看| 亚洲欧美偷拍另类| 日韩一区二区三区av| 日本一区二区动态图| 人妻丰满熟妇av无码区hd| 久久久成人精品一区二区三区| 亚洲国产成人精品久久久国产成人一区| 日本视频一区二区三区| 国产小视频在线看| 日本a级片电影一区二区| 亚洲激情网址| 国产精品粉嫩| 久久精品日产第一区二区三区精品版 | 最新亚洲精品| 亚洲一二区视频| 成人一级片网站| 久久久久久亚洲精品| 亚洲综合视频在线| 亚洲日本黄色| av岛国在线| 国产精品白丝喷水在线观看| 蜜桃导航-精品导航| 日韩一区二区免费在线观看| 日韩成人一区二区| 91在线超碰| 欧美色图17p| 91情侣偷在线精品国产| 色老汉一区二区三区| 亚洲视屏一区| 在线日本欧美| 亚洲图片在线播放| 亚洲欧美天堂在线| 国产欧美一区二区白浆黑人| 日本道精品一区二区三区| 成人精品电影在线观看| 婷婷激情一区| 91精品视频免费在线观看| 日本不卡一区二区在线观看| 国产精品久久久久高潮| 精品调教chinesegay| 福利一区二区在线观看| 日韩高清在线| 天天干天天插天天射| 国产精品一区二区入口九绯色| 久久av二区| 伊人av综合网| 中文字幕乱码日本亚洲一区二区| 日韩欧美黄色| 国产大片在线免费观看| 天天做夜夜爱爱爱| 青草网在线观看| 97国产精品视频人人做人人爱| 色综合久久中文字幕| 亚洲精品一二| 国产麻豆精品| av女优在线| 日韩av在线播| 中文字幕精品一区二区三区在线| 成人黄色片视频网站| 欧美一区二区在线看| 国产精品久久久久影院色老大 | 国产精品成人免费一区久久羞羞| 国产经品一区二区| 美女久久久久久久| 五月婷婷久久综合| 毛片一区二区三区| 激情亚洲小说| 国产三区在线观看| 超碰在线观看99| 亚洲区一区二区三| 亚洲xxxx2d动漫1| 免费在线观看91| 欧美专区在线播放| 亚洲第一页中文字幕| 亚洲自拍欧美精品| 国产99久久久国产精品潘金网站| 九九在线精品| www.成人影院| 在线观看亚洲国产| 九九九九九国产| 蜜桃导航-精品导航| 中日韩午夜理伦电影免费 | 欧美性猛片xxxx免费看久爱| 成人av综合在线| 亚洲视频一区| 亚洲动漫在线观看| 精品亚洲美女网站| 黄色在线视频网站| 人妻中文字幕一区| 日韩av无码中文字幕| 中文字幕一区二区三区人妻电影| 91美女片黄在线观看游戏| 欧洲成人免费aa| 色婷婷久久av| 久久精品夜色噜噜亚洲aⅴ| 国产成人自拍在线| 亚洲一区日韩在线| 精品国产一区二区三区av片| 看黄网站在线观看| 午夜三级在线观看| 日本新janpanese乱熟| 欧美a级免费视频| 欧美激情国产日韩| 亚洲已满18点击进入在线看片 | 成人在线视频网站| 国产mv久久久| 欧美激情精品久久久久久久变态| 欧美性少妇18aaaa视频| 国产精品久久久久aaaa樱花| 成人精品电影在线观看| 91色|porny| 另类中文字幕网| 久久91精品国产91久久小草| 可以免费看不卡的av网站| 亚洲片区在线| 欧美日韩福利| 久久成人国产| 亚洲国产91| 男女av一区三区二区色多| 久久国产综合精品| 美腿丝袜亚洲三区| 久久精品日韩欧美| 国产自产高清不卡| 轻轻草成人在线| 久久婷婷丁香| 99re8在线精品视频免费播放| 美女网站在线免费欧美精品| 成人av网站在线观看| 中文字幕中文字幕在线一区 | 国产精品一区二区精品| 免费一级欧美在线观看视频| a看欧美黄色女同性恋| 久久婷婷国产| 久久一区二区中文字幕| 国产视频一区欧美| 成人免费电影视频| 欧美午夜片欧美片在线观看| 日韩一区二区影院| 日韩精品极品视频| 亚洲天堂第二页| 久久久国产精品x99av | av毛片精品| 国色天香一区二区| 久久精品91| 99国内精品久久| 日韩欧美亚洲范冰冰与中字| 亚洲午夜av久久乱码| 欧美成人免费全部观看天天性色| 国产精品视频精品视频| 免费精品视频一区二区三区| 一区二区三区四区五区视频| www.久久久精品| 波多野在线播放| 国产后入清纯学生妹| 999国产在线视频| av免费不卡| 精品视频在线播放一区二区三区 | 黄视频在线播放| av网站免费在线观看| 日韩av中字| 2022成人影院| 日韩片欧美片| 欧美综合久久| 伊人久久亚洲影院| 91亚洲精华国产精华精华液| 99久久免费精品| 国产精品欧美极品| 亚洲免费观看在线视频| 亚洲欧美日韩在线高清直播| 国产小视频91| 欧美乱大交xxxxx| 国产视频一区二区不卡| 五月婷婷深爱五月| 国产情侣av自拍| 久草国产在线观看| 国产九色在线| 97色婷婷成人综合在线观看| 9l视频自拍九色9l视频成人| 在线精品视频在线观看高清| 精品国产精品国产偷麻豆| 麻豆精品新av中文字幕| 久久久精品tv| 亚洲一区二区三区四区五区中文| 国产亚洲xxx| 日本一区不卡| 国产999免费视频| 国产精品久久久久久人| 国产乱码在线| 深爱激情综合| 久久久久中文| 中文字幕在线一区| 亚洲人成电影网站色www| 免费av一区二区| 91一区二区三区| 男人亚洲天堂网| 亚洲av成人精品一区二区三区 | 操一操视频一区| 国产日产欧美一区二区| 国产精品九九九| 亚洲黄色网址在线观看| 黄色a一级视频| 精品久久无码中文字幕| 国产一区影院| 久久一区亚洲| 亚洲午夜久久久久中文字幕久| 久久精品国产久精国产一老狼| 亚洲成色www久久网站| 欧美极品jizzhd欧美18| 青青青免费视频在线2| 伦一区二区三区中文字幕v亚洲| 亚洲承认在线| 国产mv日韩mv欧美| 欧美国产97人人爽人人喊| 亚洲精品电影网| 懂色av一区二区三区在线播放| 亚洲熟女乱综合一区二区| 国产在线观看黄| 哺乳挤奶一区二区三区免费看| 尤物在线精品| 久久99精品久久久| 91久久精品日日躁夜夜躁欧美| 欧美精品videos| 国产一区二区三区小说| 91丝袜在线观看| 狠狠狠综合7777久夜色撩人| 1204国产成人精品视频| 久久国产欧美日韩精品| 91久久香蕉国产日韩欧美9色| 欧美激情女人20p| 丁香花在线影院观看在线播放| xxxxxx国产| 中文字幕在线视频久| 99久久国产综合精品色伊| 精品性高朝久久久久久久| www.99riav| 日韩精品乱码久久久久久| 筱崎爱全乳无删减在线观看| 水蜜桃久久夜色精品一区的特点 | 性xxxxbbbb| 国产欧美日韩视频在线| 国产精品无圣光一区二区| 日韩国产欧美精品在线| 亚洲精品成人久久久998| www.久久91| 超碰人人人人人人| 亚洲一区二区小说| 蜜桃视频在线一区| 亚洲国产视频一区| 国产精品国内视频| 免费av不卡在线| 欧美自拍偷拍第一页| 蜜桃精品噜噜噜成人av| 一本在线高清不卡dvd| 亚洲国产精品综合| 欧美极品视频在线观看| 亚洲插插视频| 国产99久久久久| 国语对白做受69| 中文字幕一区二区三区四区五区六区 | 国模娜娜一区二区三区| 91精品欧美久久久久久动漫| 91精品久久久久久久久中文字幕| 亚洲精品乱码久久久久久9色| 国产18精品乱码免费看| 一区二区三区在线免费看 | 日韩欧美在线1卡| 777av视频| 成人免费一级视频| 免费日韩视频| 日韩午夜在线视频| 天堂av.com| 亚洲精品久久久久久动漫器材一区| 99re91这里只有精品| 久久精品视频一区二区三区| 久久久久久久久久亚洲| 亚洲国产果冻传媒av在线观看| 老司机2019福利精品视频导航| 不卡一区中文字幕| 国内久久久精品| 日批免费观看视频| 三上悠亚激情av一区二区三区 | 国内毛片久久| 亚洲欧美国产毛片在线| 欧美一区二区在线视频观看| 国产精品不卡av| 亚洲综合专区| 亚洲美女精品一区| 精品久久久久久一区| 国产又粗又猛又爽又黄av| 中文字幕av一区二区三区四区| 天天爽夜夜爽夜夜爽精品视频| 韩国成人动漫在线观看| 在线观看国产区| 亚洲欧美日本国产专区一区| 欧美成人在线网站| 成人片黄网站色大片免费毛片| 青青草原av在线| 北条麻妃国产九九精品视频| 久久久久久久影院| 国产老熟女伦老熟妇露脸| 加勒比色老久久爱综合网| 欧美国产一区二区| 91久久国产精品91久久性色| 精品成人av一区二区在线播放| 亚洲女同一区| 欧美人成在线视频| 女尊高h男高潮呻吟| 久久久精品一区二区毛片免费看| 色诱视频网站一区|