Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
»ùÓÚ KIF µÄ iOS UI ×Ô¶¯»¯²âÊԺͳÖÐø¼¯³É
 
À´Ô´£ºÃÀÍŵãÆÀ¼¼ÊõÍÅ¶Ó ·¢²¼ÓÚ£º 2017-5-2
  2663  次浏览      27
 

¿Í»§¶Ë UI ×Ô¶¯»¯²âÊÔÊÇ´ó¶àÊý²âÊÔÍŶӵÄÑо¿Öص㣬±¾ÎĽéÉÜèÑÛ²âÊÔÍŶÓÔÚèÑÛ iOS ¿Í»§¶Ëʵ¼ùµÄ»ùÓÚ KIF µÄ UI ×Ô¶¯»¯²âÊԺͳÖÐø¼¯³É¹ý³Ì¡£

Ò»¡¢²âÊÔ¿ò¼ÜµÄÑ¡Ôñ

iOS UI ×Ô¶¯»¯²âÊÔ¿ò¼ÜÓв»ÉÙ£¬ÆäÖÐ UI Automation ÊÇ Apple ÔçÆÚÌṩµÄ UI ×Ô¶¯»¯²âÊÔ½â¾ö·½·¨£¬Óà JavaScript ±àд²âÊԽű¾£¬Í¨¹ý±êÇ©ºÍÖµµÄ¿É·ÃÎÊÐÔ»ñµÃ UI ÔªËØ£¬À´Íê³ÉÏàÓ¦µÄ½»»¥²Ù×÷¡£

һЩµÚÈý·½ UI ½â¾ö·½°¸ÒÔ UI Automation Ϊ»ù´¡£¬¶ÔÆä½øÐв¹³äºÍÓÅ»¯£¬°üÀ¨À©Õ¹ÐÍ UI Automation ºÍÇý¶¯ÐÍ UI Automation¡£

À©Õ¹ÐÍ UI Automation ²ÉÓà JavaScript À©Õ¹¿â·½·¨Ìá¸ß UI Automation µÄÒ×ÓÃÐÔ£¬³£¼ûµÄ¿ò¼ÜÓÐ TuneupJs¡¢ynm3k¡£

Çý¶¯ÐÍ UI Automation ÔÚ×Ô¶¯»¯²âÊԵײãʹÓÃÁË UI Automation ¿â£¬Í¨¹ý TCP µÈͨÐÅ·½Ê½Çý¶¯ UI Automation À´Íê³É×Ô¶¯»¯²âÊÔ¡£ÕâÖÖ·½Ê½Ï£¬±à¼­½Å±¾µÄÓïÑÔ²»ÔÙ¾ÖÏÞÓÚ JavaScript ¡£³£¼ûµÄ¿ò¼ÜÓÐ iOSDriver¡¢Appium¡£

»¹ÓÐһЩÆäËûµÄµÚÈý·½½â¾ö·½°¸£¬³£¼ûµÄ¿ò¼ÜÀàÐÍÓÐ˽ÓÐ API ÐͺÍ×¢Èë±àÒëÐÍ¡£

˽ÓÐ API ÐÍ¿ò¼ÜÖ±½ÓʹÓà Apple ˽ÓÐ API ¶Ô UI ½çÃæ½øÐвÙ×÷¡£³£¼ûµÄ¿ò¼ÜÖ÷ÒªÓÐ KIF¡£

×¢Èë±àÒëÐÍ¿ò¼ÜÔÚ±àÒëʱעÈëÒ»¸ö Server µ½ App ÄÚ²¿£¬Í¨¹ý Server ¶ÔÍâͨÐÅÍê³É UI ²Ù×÷Ö¸ÁîµÄÖ´ÐС£³£¼ûµÄ¿ò¼ÜÓÐ Frank¡¢Calabash¡£

Xcode 7·¢²¼ºó£¬Apple ÌṩÁËÒ»ÖÖÐ嵀 UI ×Ô¶¯»¯²âÊÔ½â¾ö·½·¨¡ª¡ªUI Testing£¬Ëü»ùÓÚ XCTest ²âÊÔ¿ò¼Ü£¬Í¨¹ý¿Ø¼þµÄ¿É·ÃÎÊÐÔÀ´¶¨Î»ºÍ»ñÈ¡¿Ø¼þ£¬²¢ÌṩÁ˶àÖÖ UI ²Ù×÷ API£¬Ê¹ÓÃÔ´ÂëÓïÑÔ£¬ÄÜ·½±ãµØ½øÐе÷ÊÔ¡£

ÎÒÃÇÔÚÒÔÉÏ·ÖÀàÖÐÌôÑ¡¾ßÓдú±íÐÔµÄ×Ô¶¯»¯¿ò¼Ü£ºUI Automation¡¢Appium¡¢KIF¡¢Frank¡¢UI Testing ½øÐжԱȣ¬Ï±íÊÇÕ⼸ÖÖ²âÊÔ¿ò¼ÜµÄÌØµã¶Ô±È£º

¿¼ÂÇÑ¡Ôñ²âÊÔ¿ò¼ÜµÄ¼¸ÖÖÓ°ÏìÒòËØ¡£Ê×ÏÈ£¬Ê¹ÓõÄÓïÑԺͿò¼Ü¾ö¶¨Á˲âÊÔÈËÔ±µÄ³ÖÐøÐÔѧϰ³É±¾£¬iOS ²âÊÔÈËÔ±¶Ô Objective¡ªC ºÍ XCTest ÊìϤºÍÕÆÎճ̶ȸߣ¬²»ÐèÒªÏûºÄ¶îÍâµÄѧϰ³É±¾£¬ÈËÔ±¸üÌæÊ±µÄ½ÓÊֳɱ¾Ò²Ïà¶Ô½ÏµÍ£»Æä´Î£¬²âÊÔ¿ò¼ÜÖ§³ÖµÄ UI ²Ù×÷µÄ·á¸»ÐÔ¾ö¶¨Á˲âÊÔÓÃÀýµÄ¸²¸ÇÍêÕû¶È£¬Ê¹ÓÃ˽ÓÐ API µÄ²âÊÔ¿ò¼ÜÖ§³ÖµÄ UI ²Ù×÷½ÏÎªÈ«Ãæ£¬¶øÍ¬Ê±Ö§³Ö UIWebView µÄ²âÊÔ¿ò¼ÜÔò¸üÕ¼ÓÅÊÆ£»ÁíÍ⣬App ³ÌÐò UI ±ä»¯¿ì£¬Ê¹Óÿª·¢Ð§Âʸߡ¢µ÷ÊÔ·½±ãµÄ²âÊÔ¿ò¼ÜÄÜʹÎÒÃÇÔÚÊÊӦРUI ±ä»¯¡¢ÐÂÐèÇóʱ»ñµÃ¸üСµÄͶÈë²ú³ö±È¡£

×ÛºÏÒÔÉÏ¿¼ÂÇ£¬KIF ¿ò¼ÜÒѾ­Õ¹ÏÖÁËËûµÄÓÅÊÆ£¬²¢ÇÒ KIF ʹÓà XCTest ¿ò¼Ü£¬Ê¹µÃÆä²âÊÔÁ÷³Ì iOS ³ÌÐòµÄµ¥²âÎÞÒ죬¿ÉÍêÈ«¸´Óõ¥²âµÄ³ÖÐø¼¯³ÉÁ÷³Ì£¬Î¬»¤³ÖÐø¼¯³ÉµÄ³É±¾Ïà¶Ô½µµÍ£»ÁíÍ⣬KIF ÊÇÒ»¸ö»îÔ¾µÄ¿ªÔ´²âÊÔ¿ò¼Ü£¬¿ÉÀ©Õ¹ÐԺã¬Éý¼¶¸üп죬ÓлîÔ¾ÉçÇøÀ´Ì½Ìֺͽâ¾öʹÓùý³ÌÖÐÓöµ½µÄÎÊÌâ¡£¼øÓÚÉÏÊöÓÅÊÆ£¬ÎÒÃÇÑ¡ÔñÁË KIF ×÷Ϊ iOS µÄ UI ×Ô¶¯»¯²âÊÔ¿ò¼Ü¡£

¶þ¡¢KIF ×Ô¶¯»¯ÊµÊ©

KIF ÀûÓà Apple ¸øËùÓпؼþÌṩµÄ¸¨ÖúÊôÐÔ accessibility attributes À´¶¨Î»ºÍ»ñÈ¡ÔªËØ£¬Íê³É½çÃæµÄ½»»¥²Ù×÷£»½áºÏʹÓà Xcode µÄ XCTest ²âÊÔ¿ò¼Ü£¬ÓµÓÐ XCTest ²âÊÔ¿ò¼ÜµÄÌØÐÔ£¬Ê¹µÃ²âÊÔÓÃÀýÄÜÒÔ command line build ¹¤¾ßÔËÐв¢»ñÈ¡²âÊÔ±¨¸æ¡£

ÏÂÃæ½éÉÜÈçºÎ½øÐÐ KIF ×Ô¶¯»¯ÊµÊ©¡£

1. KIF ´î½¨

KIF ÒÔµÚÈý·½¿âµÄÐÎʽ±àÒëÔËÐÐÓÚ¹¤³ÌÖУ¬´î½¨ KIF ֮ǰ£¬Ó¦¸ÃÈ·±£¹¤³ÌÔÚ Xcode ÉϱàÒëÔËÐÐͨ¹ý¡£

KIF »ùÓÚ XCTest ¿ò¼Ü£¬¼Ì³ÐÁË XCTest µÄËùÓÐÌØÐÔ¡£ºÍ XCTest Ò»Ñù£¬ÎÒÃÇÊ×ÏÈÓ¦¸ÃÔÚ¹¤³ÌÏîÄ¿Öд´½¨»ùÓÚ Cocoa Touch Testing Bundle Ä£°åµÄ Target £¬²¢È·±£´´½¨µÄ Target µÄÊôÐÔÓÐÈçÏÂÉèÖãº

¡°Build Phases¡±£ºÉèÖà Target Dependencies £¬ UI ×Ô¶¯»¯²âÊÔ¹ÌȻҪÒÀÀµÓ¦ÓóÌÐòµÄ App ²úÎËùÒÔÐè±£Ö¤Ó¦ÓóÌÐò Target ±»Ìí¼ÓÔÚ Test Target µÄ Target Dependencies ÖС£

¡°Build Settings¡±:

ÉèÖà ¡°Bundle loader¡± Ϊ£º$(BUILT_PRODUCTS_DIR)/MyApp.app/MyApp£»

ÉèÖà ¡°Test Host¡± Ϊ£º$(BUILT_PRODUCTS_DIR)£»

ÉèÖà ¡°Wrapper Extensions¡± Ϊ£ºxctest¡£

ÏîÄ¿µÄÉèÖÃ×¼±¸ºÃºó£¬ÐèÒª°²×° KIF ¿âÔ´Âëµ½ÏîÄ¿¡£¼´¿É¿ªÊ¼ KIF ±àдÓÃÀýÖ®Âá£

KIF ͨ¹ýÊôÐÔÖµ£¨AccessibilityLabel, AccessibilityIdentifier, AccessibilityTraits,Value...£©ÔÚ½çÃæÖж¨Î»ÔªËØ¡£ÎªÁË»ñÈ¡µ½Ä¿±êÔªËØ£¬ÎÒÃDZØÐëÏÈÉèÖÃÔªËØµÄ accessibility ÊôÐÔ¡£ÈçÏ£¬ÏëÒª»ñÈ¡³ÌÐòÖÐÒ»¸öÁбíµÄ cell ÔªËØ£¬ÎÒÃǸøÁбíµÄ cell ¿Ø¼þÉèÖà accessibility ÊôÐÔ£¨Èç×óͼËùʾ£©£¬ÉèÖÃΪ¡°Section XX Row XX¡±£¬±àÒëÔËÐУ¬¼´¿É»ñµÃÀúÊ·ÁбíµÄ cell ÔªËØ£»ÓÃÄ£ÄâÆ÷µÄ Accessibility Inspector ץȡµ½ÁËÕâ¸öÀúÊ·ÁбíÔªËØ£¨ÈçÓÒͼËùʾ£©£º

KIF ΪÎÒÃÇÌṩÁ˶ÔÓÐ accessibility ÊôÐԿؼþµÄ²Ù×÷½Ó¿Ú£¬ÈçÏÂ×î¼òµ¥µÄÁ½¸ö²Ù×÷½Ó¿Ú£º

µã»÷Ò»¸öÔªËØ£º- (void)tapViewWithAccessibilityLabel:(NSString *)label£»

µÈ´ýÒ»¸öÔªËØµÄ³öÏÖ£º- (UIView *)waitForViewWithAccessibilityLabel:(NSString *)label¡£

ÔÚн¨µÄ Target ͬÃûĿ¼ÏÂÔö¼ÓÒ»¸ö¼Ì³Ð×Ô KIFTestCase µÄÀ࣬ÀàÖбàдÎÒÃǵÄÓÃÀý£¬Íê³É¶Ô½çÃæµÄµã»÷ºÍÑéÖ¤£¬ÈçÏ£º

ÒÔÉϲ½Öè¶¼Íê³Éºó£¬ »ùÓÚKIFµÄ¼òµ¥ÓÃÀý±ã´î½¨Íê³É£¬µã»÷ Product->Test »òÕß¿ì½Ý¼ü (?U) ¼´¿É¿´µ½ÎÒÃǵÄÓÃÀý×Ô¶¯ÔËÐÐÆðÀ´ÁË¡£

2. ÓÃÀý±àдÓë×éÖ¯

£¨1£©accessibility ÊôÐÔÉèÖÃ

accessibility ÊôÐÔÊÇ Apple ¸øÊÓ¾õÕϰ­ÈËȺÌṩÍêÈ«ÎÞÕϰ­Ê¹ÓõĻù±¾ÊôÐÔ£¬¸ÃÊôÐÔ±íÃ÷ÁË UI ÔªËØµÄ¿É·ÃÎÊÐÔ¡¢ÊÇʲô¡¢×öʲôÒÔ¼°»á´¥·¢Ê²Ã´ÑùµÄ²Ù×÷¡£Ô­ÉúµÄ UIKit ¿Ø¼þĬÈÏÌṩÁËÕâЩÐÅÏ¢£¬È»¶ø£¬×Ô¶¨ÒåµÄ¿Ø¼þÔòÐèÒª¶Ô¸ÃÊôÐÔ½øÐÐÉèÖã¬ÉèÖ÷½Ê½¿É²Î¿¼ÏÂÃæ¼¸µã£º

ÉèÖ÷½Ê½£ºÕÒµ½Ò³ÃæÔªËØËùÊôµÄ´úÂëÎļþ£¬ÔÙµ½´úÂëÖÐÕÒµ½¸ÃÀàµÄʵÏÖ£¬ÔÚÏàÓ¦´úÂë´¦Ìí¼ÓÆäÊôÐÔ¡£

²é¿´·½Ê½£ºÉèÖúú󣬿ªÆôÄ£ÄâÆ÷µÄ Accessibility Inspector ¹¦ÄÜ£¬¼´¿É¿´µ½¿Ø¼þµÄ accessibility ÊôÐÔ¡£

ÉèÖý¨Ò飺ÉèÖÃµÄ AccessibilityLabel ÊôÐÔÖµÒªÓÐʵ¼ÊÒâÒ壨Óû§¿ÉÀí½â£©£¬ÒòΪÉèÖÃÕâ¸öÊôÐÔºóÓû§¿ÉÒÔͨ¹ý VoiceOver ·ÃÎÊ£»Óû§²»¿É·ÃÎʵĿؼþ£¬±ÈÈçijЩ·ÅÖÿؼþµÄÈÝÆ÷µÈÓ¦¸ÃÉèÖÃΪ AccessibilityIdentifier ¡£

£¨2£©ÓÃÀý³£ÓòÙ×÷½Ó¿Ú£º

UI½»»¥²Ù×÷( KIFUITestActor.h ÖпɲéÔÄ)£º

  tapThisView:                - (void)tapViewWithAccessibilityLabel:(NSString *)label;
waitForView: - (UIView *)waitForViewWithAccessibilityLabel:(NSString *)label;
×¢Ò⣺º¯Êý·µ»ØÁ˶ÔÓ¦ViewµÄÖ¸Õ룬¿ÉÒÔ¶Ô·µ»ØÖµÈ¡Êý¾Ý£¬´Ó¶ø½øÐÐһЩÅжÏ
enterTextIntoView: - (void)enterText:(NSString *)text intoViewWithAccessibilityLabel:(NSString *)label;
tapRowOnTableView: - (void)tapRowAtIndexPath:(NSIndexPath *)indexPath inTableViewWithAccessibilityIdentifier:
(NSString *)identifier NS_AVAILABLE_IOS(5_0);
dismisses a system alert: - (void)acknowledgeSystemAlert;

À©Õ¹£ºÎÒÃÇ»¹¿ÉÒÔ¶Ô KIFUITestActor Àà½øÐÐÀ©Õ¹£¬ÀûÓà KIFUITestActor ÖеÄ˽Óк¯Êý£¬Ê¹ AccessibilityIdentifier ´úÌæ Label ʶ±ðÔªËØ£¬Íê³É tapThisView ¡¢waitForView µÈ²Ù×÷¡£

ÓÃÀý¼¯²Ù×÷( KIFTestCase.h ÖпɲéÔÄ)£º

   - (void)beforeAll; ÔÚ±¾ÀàÖеÚÒ»¸ö test caseÖ´ÐÐǰִÐÐÒ»´Î
Óô¦£ºÖ´Ðб¾ÀàÖи÷¸ö²âÊÔº¯ÊýµÄ¹«¹²²Ù×÷
×¢Ò⣺ÒòΪ²»Äܱ£Ö¤Õâ¸ö·½·¨Óë test case ÊÇͬһ¸öÀàʵÀý£¬ËùÒÔ²»ÄÜÓÃÀ´ÉèÖÃʵÀý±äÁ¿µÄÖµ£¬µ«ÊÇ¿ÉÒÔÉèÖþ²Ì¬±äÁ¿
- (void)beforeEach; ÔÚÿһ¸ö test case Ö´ÐÐǰִÐÐÒ»´Î
Óô¦£ºÖ´Ðи÷¸öº¯ÊýÐèÒªµÄ²âÊÔ»·¾³
×¢Ò⣺ÒòΪȷ±£Õâ¸ö·½·¨Óë test case ÊÇͬһ¸öÀàʵÀý£¬ËùÒÔ¿ÉÒÔÓÃÀ´ÉèÖÃʵÀý±äÁ¿
- (void)afterEach; ÔÚÿһ¸ö test caseÖ´ÐкóÖ´ÐÐÒ»´Î
Óô¦£ºÓÃÀ´½« App »Ö¸´ÖÁ test case ֮ǰµÄ״̬£¬¿ÉÒÔ°üº¬Ò»Ð©Ìõ¼þÅжÏÂß¼­£¬´Óʧ°ÜµÄ test case Öлָ´£¬ÒÔÈ·±£²»Ó°ÏìÖ®ºóµÄ²âÊÔ
- (void)afterAll; Ö´ÐÐÍê²âÊÔÀàµÄ×îºóÒ»¸ö test case ºóÖ´ÐÐÒ»´Î
Óô¦£ºÓÃÓÚ½« App »Ö¸´ÖÁ²âÊԵijõʼ״̬

ϵͳµÄ¹¦ÄÜʵÏÖ( KIFSystemTestActor.h ÖпɲéÔÄ£©£º

Ä£ÄâÓû§ÐýתÉ豸£º          - (void)simulateDeviceRotationToOrientation:(UIDeviceOrientation)orientation;
¶Ôµ±Ç°ÆÁÄ»½ØÍ¼²¢´æ´¢µ½Ó²ÅÌÖУº- (void)captureScreenshotWithDescription:(NSString *)description;

£¨3£©ÓÃÀý×éÖ¯

Éè¼ÆÊµÏÖµ¥¸ö²âÊÔÓÃÀý²½ÖèÈçÏÂ:

a. ÉèÖòâÊÔËùÐèÒªµÄ»·¾³£»

b. ²âÊÔÓÃÀýµÄ²âÊÔÂß¼­£»

c. »Ö¸´AppÖÁ´Ë´Î²âÊÔǰ״̬¡£

a¡¢c²½Öè¿ÉÓà beforeEach¡¢afterEach À´ÊµÏÖ£¬ÕâÑù±£Ö¤ÁËÿ¸öÓÃÀýÖ®¼äµÄ¶ÀÁ¢ÐÔºÍÓÃÀýÔËÐеÄÎȶ¨ÐÔ¡£

Ò»°ãÀ´Ëµ£¬¿É½«ÓÃÀý°´¹¦ÄÜ·Ö³ÉÈô¸É¸öÓÃÀý¼¯£¬Ã¿¸öÓÃÀý¼¯°´Ð£Ñéµã»òÕß¹¦Äܵã·Ö³ÉÈô¸É¸öÓÃÀý£¬ÕâÑù·½±ã²âÊÔÓÃÀýµÄ¹ÜÀíºÍά»¤¡£ ijЩº¬ÓкķÑʱ¼ä¶à¡¢ºÄ·Ñ×ÊÔ´¶àµÄ¹«¹²²Ù×÷µÄÓÃÀý¿ÉÒÔ¼¯ºÏ³ÉÒ»¸öÓÃÀý¼¯£¬ÔÚÓÃÀý¼¯ÔËÐÐǰͳһִÐС£Éè¼ÆÊµÏÖÓÃÀý¼¯²½ÖèÈçÏ£º

a. ÉèÖÃÓÃÀý¼¯ÐèÒªµÄ»·¾³¡¢¹«¹²²Ù×÷£»

b. Éè¼Æ¸÷¸öÓÃÀý£»

c. »Ö¸´ App ÖÁÓÃÀý¼¯²âÊԵijõʼ״̬¡£

a¡¢c²½Öè¿ÉÓà beforeAll¡¢afterAll À´ÊµÏÖ£¬ÏÂͼչʾÁËÒ»¸öÓÃÀý¼¯µÄÊéдʾÀý£º

#import "TimerTests.h"
#import "KIFUITestActor+AccessibilityLabelAddition.h"
#import "KIFUITestActor+IdentifierAdditions.h"
#import "KIFUITestActor+TimerAdditions.h"
@implementation TimerTests
- (void)beforeAll
{
[tester setDebugModel];
}
- (void)afterAll
{
[tester resetDebugModel];
[tester clearHistory];
}
- (void)beforeEach
{
[tester setDebugModel];
}
- (void)afterEach
{
[tester clearParams];
}
- (void)testNameedTask
{
[tester enterText:@"myTask" intoViewWithAccessibilityLabel:@"Task Name Input"];
[tester enterWorktime:10 Breaktime:4 Repetitions:5];
[tester tapViewWithAccessibilityLabel:@"Start Working"];
[tester waitForViewWithAccessibilityLabel:@"myTask"];
[tester waitForViewWithAccessibilityLabel:@"Start Working"];
}
- (void)testnoNameTask
{
[tester enterWorktime:10 Breaktime:4 Repetitions:5];
[tester tapViewWithAccessibilityLabel:@"Start Working"];
[tester waitForViewWithAccessibilityLabel:@"myTask"];
[tester waitForViewWithAccessibilityLabel:@"Start Working"];
}
- (void)testPresetTask
{
[tester tapViewWithAccessibilityLabel:@"Presets"];
[tester tapRowAtIndexPath:@"Classic" inTableViewWithAccessibilityIdentifier:@"Presets List"];
[tester tapViewWithAccessibilityLabel:@"Start Working"];
[tester waitForViewWithAccessibilityLabel:@"myTask"];
[tester waitForViewWithAccessibilityLabel:@"Start Working"];
}
@end

ÉÏÊö´úÂëÖУ¬ÎÒÃÇ¿´µ½Ðí¶à·â×°º¯Êý¡£Îª±£Ö¤ÓÃÀý½á¹¹ÇåÎúÃ÷ÀÊ£¬ÎÒÃÇ½è¼ø selenium pageObject µÄÉè¼Æ·½Ê½£¬ ×ñÑ­ÈçϹæÔò£º

a. ½«Ò³ÃæÉϵĶÔÔªËØµÄ·¢ÏÖ¡¢²Ù×÷´¦Àí³éÏóΪÏàÓ¦µÄÀ࣬·µ»Ø²Ù×÷½á¹û£»

b. ·â×°¾¡¿ÉÄܶàµÄ¹¤¾ßÀࣻ

c. ²âÊÔÓÃÀýÖ»¹Ø×¢ÓÃÀýÂß¼­£¬²½Ö辡Á¿¼ò½à¡£

ÈçÏÂͼËùʾ£¬ÔÚÓÃÀý¼¯ test suite ÖУ¬ÎÒÃÇÖ»±£³ÖÇåÎúµÄÓÃÀýÂß¼­£»·ÇÓÃÀýÂß¼­µÄ¶¯×÷·â×°³ÉÏàÓ¦µØÓÃÀý¼¯µÄÀà test suite additions £»ÒòΪ KIF µÄ¿ªÔ´ÐÔ£¬ÎÒÃÇ»¹¿ÉÒÔÀûÓà KIF µÄ˽ÓÐ API ·â×°ÎÒÃÇÐèÒªµÄ¹¤¾ß Tools Àà¡£

£¨4£©ÓÃÀýµÄÔËÐжÀÁ¢ºÍ retry »úÖÆ

ʧ°ÜÓÃÀýÊDz»¿É±ÜÃâµÄ£¬ÉÏÊöÓÃÀýµÄ×éÖ¯·½Ê½£¬½µµÍÁËÓÃÀý¼äµÄÒÀÀµÐÔ£¬µ«ÊDz¢²»ÄÜÍêÈ«Ïû³ýʧ°ÜÓÃÀý¶ÔºóÐøÓÃÀýÖ´ÐеÄÓ°Ïì¡£Èç¹ûÄÜÈÃÿ¸öÓÃÀý¶ÀÁ¢Æô¶¯ App Ö´ÐÐ case£¬ÔòÄܱ£Ö¤ºóÖ´ÐÐÓÃÀý²»ÊÜÏÈÖ´ÐÐʧ°ÜÓÃÀýµÄÓ°Ïì¡£Èç¹ûÔÚ case ÔËÐÐʧ°Üºó£¬»¹¿ÉÒÔ½øÐÐ retry ÖØÊÔ£¬ÔòÄÜÌá¸ßÓÃÀýÔËÐеÄÎȶ¨ÐÔ¡£xctool ¹¤¾ßÄܸøÎÒÃÇ´øÀ´ÕâÑùµÄ¹¦ÄÜ£¬ÎÒÃÇÓà xctool ÃüÁîÏÈ build-tests ¹¹½¨ app£¬È»ºóÑ­»·Æô¶¯ app À´ run-tests ÓÃÀý£¬ÓÃÀýʧ°Üºó£¬ÖØÐÂÖ´ÐС£ÏÂÃæÊÇÒ»¸ö xctool ¶ÀÁ¢ÔËÐÐÓÃÀýµÄ¼òµ¥Ê¾Àý£º

xctool build-tests -workspace myApp.xcworkspace -scheme myKIFTestScheme 
-sdk iphonesimulator -configuration Debug -destination platform='iOS Simulator',OS=8.3,name='iPhone 6 Plus'

array=( TimerTests HistoryTests )

for data in ${array[@]}
do
xctool -reporter pretty -reporter junit:tmp/test-report-tmp.xml -workspace myApp.xcworkspace
-scheme myKIFTestScheme run-tests -only myKIFTestTarget:${data} -sdk iphonesimulator
-configuration Debug -destination platform='iOS Simulator',OS=8.3,name='iPhone 6 Plus'
done

Èý¡¢KIF ×Ô¶¯»¯µÄ³ÖÐø¼¯³É

1. ³ÖÐø¼¯³ÉµÄÒâÒåÓë UI ×Ô¶¯»¯²âÊÔµÄÓÃÀýÑ¡Ôñ

³ÖÐø¼¯³ÉÊÇÒ»¸ö×Ô¶¯»¯µÄÖÜÆÚÐԵɲâÊÔ¹ý³Ì£¬´Ó¼ì³ö´úÂë¡¢±àÒë¹¹½¨¡¢ÔËÐвâÊÔ¡¢½á¹û¼Ç¼¡¢²âÊÔͳ¼ÆµÈ¶¼ÊÇ×Ô¶¯Íê³ÉµÄ£¬ÎÞÐèÈ˹¤¸ÉÔ¤¡£ÎÒÃǵÄÏîÄ¿¶¼ÊÇÍŶÓЭ×÷¿ª·¢£¬²ÉÓóÖÐø¼¯³ÉµÄÓÅÊÆÏÔ¶øÒ×¼û£º

¾¡Ô羡¿ìµØ·¢ÏÖ¼¯³É´íÎ󣬱£Ö¤ÍŶӿª·¢ÈËÔ±Ìá½»´úÂëµÄÖÊÁ¿£¬¼õÇáÈí¼þ·¢²¼Ê±µÄѹÁ¦£»

×Ô¶¯Íê³É¼¯³ÉÖеĻ·½Ú£¬ÓÐÀûÓÚ¼õÉÙ¼¯³É¹ý³ÌµÄÖØ¸´¹¤×÷ÒÔ½Úʡʱ¼ä¡¢·ÑÓú͹¤×÷Á¿£»

³ÖÐø¼¯³É×î´óµÄºÃ´¦ÔÚÓÚÄܹ»¾¡Ôç¸ßЧ·¢ÏÖÎÊÌ⣬½µµÍ½â¾öÎÊÌâµÄ³É±¾¡£¶ø·¢ÏÖÎÊÌâµÄÊÖ¶ÎÖ÷Òª¾ÍÊDzâÊÔ¡£

¸ù¾Ý Martin Fowler µÄ²âÊÔÀíÂÛ£¬²âÊÔÓ¦¸Ã×ñÑ­ÈçϲâÊÔ½ð×ÖËþ×éºÏ£¬²âÊÔ½ð×ÖËþ×îµ×²ãÊǵ¥Ôª²âÊÔ£¬È»ºóÊǼ¯³É²âÊÔ£¬¼Ì¶øÊÇÃæÏòÓ¦ÓóÌÐò·þÎñ²ãµÄÖмä²ã²âÊÔ£¬×î¸ß²ãÊÇÃæÏòÓû§µÄÒµÎñÂß¼­²âÊÔ£º

²âÊÔ×Ô¶¯»¯µÄ²âÊԲ㼶Խ¶à£¬³ÖÐø¼¯³Éƽ̨¾ÍÄܲúÉúÔ½´óµÄ¼ÛÖµ¡£

UI ²âÊÔÄ¿±êÊǸ²¸Ç×îºËÐĵĴúÂ룬¾¡¿ÉÄÜÈ¥µôÒÀÀµ£¬Èò»Îȶ¨Òò×Ó½µµ½×îµÍ£¬ÕâÑù¼È±£Ö¤×Ô¶¯»¯²âÊԲ㼶µÄÈ«ÃæÐÔ£¬ÓÖ±£Ö¤³ÖÐø¼¯³ÉµÄÎȶ¨¹¹½¨£¬½µµÍ²âÊÔµÄͶÈë²ú³ö±È¡£Òò´Ë£¬ÔÚÎÒÃÇµÄ UI ×Ô¶¯»¯²âÊÔÖУ¬ÎÒÃÇÑ¡ÔñºËÐŦÄܵÄðÑÌÓÃÀýÀ´Íê³É³ÖÐø¼¯³ÉÖеIJâÊÔ½ð×ÖËþ¡£

2. Jenkins ÉÏÍê³É»ùÓÚ KIF µÄ UI ×Ô¶¯»¯³ÖÐø¼¯³É´î½¨

Jenkins ÊÇÒ»¸ö¿ªÔ´µÄ³ÖÐø¼¯³É¹¤¾ß£¬ÌṩÁËÒ»ÖÖÒ×ÓÚʹÓõijÖÐø¼¯³Éϵͳ£¬Ê¹¿ª·¢Õß´Ó·±ÔӵÉÖнâÍѳöÀ´£¬×¨×¢ÓÚ¸üÎªÖØÒªµÄÒµÎñÂß¼­ÊµÏÖÉÏ¡£

Jenkins ÒÔ Job Ϊµ¥Î»ÔËÐÐÏîÄ¿£¬Ò»¸ö Job µÄ¹¤×÷Á÷³ÌΪ£ºÔÚÖ¸¶¨µÄʱ»ú£¬Ñ¡ÔñºÏÊ浀 salve ½Úµã£¬´Ó°æ±¾¹ÜÀíϵͳÉÏ»ñÈ¡¶ÔÓ¦µÄÔ´Â룬ʹÓÃÃüÁîÐнű¾»òÕß maven »òÕß ant ½øÐй¹½¨£¬¹¹½¨ºó¹éµµÎļþ£¬´¦Àí±¨¸æ£¬Èç¹û¹¹½¨Ê§°ÜÄÇô¾Íͨ¹ýÓʼþ½øÐз´À¡µÈ¡£

Job µÄ´¥·¢Ê±»úÖ÷ÒªÓÐ3ÖÖÑ¡Ôñ£º

"Build after other project are build"£º±íʾÔÚÆäËûij¸öÏîÄ¿buildºó´¥·¢£¬±ÈÈçÎÒÃÇ¿ÉÒÔÔÚij¸öÌá²âJob¹¹½¨Ö®ºó£¬Á¢¼´¹¹½¨ÎÒÃÇµÄ UI ×Ô¶¯»¯À´ÑéÖ¤Õâ¸öÌá²âµÄ¿ÉÐÐÐÔ£»

"Build periodically"£º±íʾ°´Ê±¼ä´¥·¢£¬ÎÒÃÇ¿ÉÒÔÑ¡ÔñÕâ¸öÈà Job ×ö Daily Build À´½øÐгÖÐø¹¹½¨¹Û²ì£»

"Poll SCM"£º±íʾÔÊÐíÓû§Èà Jenkins ¶¨ÆÚ²éѯijһ¸öÏîÄ¿µÄ´úÂë¿â£¬Èç¹ûÓдúÂë±ä¶¯Ôò´¥·¢Ö´ÐÐÈÎÎñ£¬ÕâÖÖ´¥·¢·Ç³£Êʺϼ¯³É²âÊÔÏîÄ¿£¬ÒÔ´ËÑéÖ¤´úÂë¿â±ä¶¯ÊÇ·ñÄܲâÊÔͨ¹ý¡£

ÎÒÃÇÏ£ÍûÔÚ´úÂë¸Ä¶¯·¢ÉúµÄʱºò¾Í×öµ½¾¡Ôç·¢ÏÖ´úÂë¸Ä¶¯´øÀ´µÄÎÊÌ⣬ËùÒÔʹÓà ¡°Poll SCM¡± ÔÚµ±´úÂë²Ö¿âÓÐÐ嵀 pull request µÄʱºò´¥·¢ÏàÓ¦ Job Íê³É¹¹½¨£¬Job µÄÖ´Ðнá¹û×÷ΪÕâ¸ö pull request ÄÜ·ñºÏÈëµÄºâÁ¿Ö¸±êÖ®Ò»£»Í¬Ê±ÎªÖ§³Ö¿Í»§¶ËÖ§³Ö daily build £¬Job ʹÓà "Build periodically" ÔÚÿÌì daily build ´ò°üǰÍê³ÉÒ»´Î×Ô¶¯¹¹½¨¡£

Job ÐèÒªÖ§³ÖÃüÁîÐй¹½¨²ÅÄÜʵÏÖ³ÖÐø¼¯³É£¬ÈçÉÏÒ»²¿·ÖÌáµ½£¬ÎÒÃÇ¿ÉÒÔ½èÖú xcodebuild/xctool ʵÏÖµ¥ÃüÁîÐй¹½¨¡£Í¬Ê±ÎªÁ˺âÁ¿ Job µÄÖ´Ðнá¹û£¬ÎÒÃÇÐèÒªÔÚ Job Ö´ÐÐÍê³ÉºóÉú³ÉÏàÓ¦µÄ²âÊÔ±¨¸æºÍ´úÂ븲¸ÇÂʱ¨¸æ£¬Ê¹Óà xcodebuild/xctool ÕâÑùµÄÃüÁîÐй¤¾ß£¬Ö»ÐèÒªÅäÖÃÏà¹ØµÄ²ÎÊý¼´¿É»ñÈ¡ÏàÓ¦µÄ XML ²âÊÔ±¨¸æÎļþ¡£

Jenkins ÖÐ JUnit Plugin ²å¼þ¿ÉÒÔ½« XML ÐÎʽµÄ²âÊÔ±¨¸æ×ª»¯³ÉÒ»ÖÖËæÊ±¼äÍÆÒÆµÄ²âÊÔ½á¹ûͼ±í£¬ÏòÎÒÃÇչʾ²âÊԵĽá¹ûºÍ²âÊÔµÄÎȶ¨ÐÔ£» Cobertura plugin ²å¼þ¿ÉÒÔ½« XML ÐÎʽµÄ¸²¸ÇÂÊÎļþת»¯³ÉÒ»ÖÖËæÊ±¼äÍÆÒÆµÄ´úÂ븲¸ÇÂÊͼ±í¡£ÈçÏÂͼÊÇ Job ÖвâÊÔ±¨¸æµÄ´úÂ븲¸ÇÂʺͲâÊÔ½á¹ûµÄʾÀý£¬Í¨¹ýÏÂÃæµÄͼ±í£¬ÎÒÃÇ¿ÉÒÔÇåÎúµØ¿´µ½²âÊÔÊÇ·ñͨ¹ý£¬¼ì²é´úÂëµÄ²âÊÔ¸²¸Ç·¶Î§£¬²¢¶Ô±ÈÀúÊ·µÄ²âÊÔ½á¹ûºÍ´úÂ븲¸ÇÂÊÀ´ÍƶϺͶ¨Î»ÎÊÌâ¡£

3. KIF ×Ô¶¯»¯²âÊÔÔÚ Jenkins ³ÖÐø¼¯³É¹ý³ÌÖÐÓöµ½µÄÎÊÌâ

(1)Éè±¸ÖØÖÃ

ÎÒÃǵIJâÊÔÓÃÀý¸²¸ÇÁ˵ÚÒ»´Î°²×°Æô¶¯µÄ²Ù×÷¡£ÔÚ³õÆÚ£¬Õâ¸öÓÃÀý¾­³£Ê§°Ü¡£¾­¹ýÅŲ鷢ÏÖ£¬³ÖÐø¼¯³ÉϵͳÖеÄÄ£ÄâÆ÷Éè±¸ÖØÖòÙ×÷²¢Ã»Óи²¸ÇËùÓеÄÉ豸£¬UI ²âÊÔ Job ÔËÐÐʱ£¬Job Ñ¡ÔñµÄÄ£ÄâÆ÷É豸ÉÏ¿ÉÄÜÒÅÁôÁËÆäËû Job ¹¹½¨µÄÏàͬµÄ app ²úÎµ¼ÖÂÎÒÃÇµÄ Job ¹¹½¨²úÎï²¢²»ÊǵÚÒ»´Î°²×°Æô¶¯¡£ËùÒÔÔڽű¾ÖÐÎÒÃDZéÀúËùÓÐÄ£ÄâÆ÷É豸£¬½«Æä½øÐÐÖØÖá£

(2)¼üÅÌÇû÷ÑÓ³Ù

ÎÒÃǵIJâÊÔÓÃÀýÔÚÊäÈë¿òÊäÈëÎÄ×Öʱ£¬¾­³£³öÏÖÊäÈ벻ȫ¶øµ¼ÖÂʧ°ÜµÄÎÊÌâ¡£±ÈÈçÔÚÊäÈë¿òÖÐÊäÈë 'beijing' £¬Ê§°ÜºóÌáʾ£ºFailed to get text in field; instead, it was 'beiji' ¡£¾­¹ýÅŲ飬·¢ÏÖ³ÖÐø¼¯³ÉϵͳÖеĻúÆ÷ÐÔÄÜÓиßÓеͣ¬ÔÚµÍÐÔÄÜ»úÆ÷ÖиüÈÝÒ×·¢Éú´ËÎÊÌ⣬ÔÙÑо¿ KIF ¿ò¼ÜÔ´Âë·¢ÏÖ£¬KIF ĬÈÏÉèÖõļüÅÌÇû÷ʱÑÓΪһ¸ö³£Êý£¬¶ÔÓÚµÍÐÔÄÜ»úÆ÷À´ËµÕâ¸öÇû÷ʱÑӽ϶̣¬ÈÝÒשµôÊäÈ룬ËùÒÔÎÒÃÇÔÚ KIFTypist.m Ô´ÂëÎļþÖÐÊʵ±Ôö¼Ó (NSTimeInterval) keystrokeDelay µÄʱ³¤À´±ÜÃâÊäÈ벻ȫµÄÎÊÌâ¡£

(3)¶à¸öϵͳµ¯´°È·ÈÏ

Ç°ÃæÎÒÃÇÌáµ½¹ý£¬KIF Ö§³Ö¶Ôϵͳµ¯´°µÄ´¦Àí£¬¼´½Ó¿Ú acknowledgeSystemAlert £¬ËüÄܰïÎÒÃÇÈ·ÈÏÒ»¸öϵͳµ¯´°¡£µ«ÊÇÎÒÃǵÄÓ¦ÓóÌÐòÔÚÆô¶¯Ê±ÏµÍ³µ¯´°²¢²»Ö¹Ò»¸ö£¬²¢ÇÒÔÚ²»Í¬É豸ÉÏ£¬ÒòϵͳÉèÖò»Í¬£¬ÏµÍ³µ¯´°µÄ¸öÊýÊDz»È·¶¨µÄ¡£ËùÒÔ£¬Ö±½ÓʹÓà acknowledgeSystemAlert ²¢²»ÄܰïÎÒÃǽâ¾öÎÊÌâ¡£ÒòΪ KIF µÄ¿ªÔ´ÐÔ£¬ÎÒÃÇÔÚ KIF ¿ò¼ÜÔ´Âë acknowledgeSystemAlert º¯ÊýÖÐ×öÁËÒ»´Î while Ñ­»·´¦Àí£¬´¦ÀíÁ˳öÏÖµÄÈÎÒâ¶à¸öϵͳµ¯´°µÄÇé¿ö£¬´Ó¶ø½â¾öÁËÎÊÌâ¡£

   
2663 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ


Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ


ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ