¿Í»§¶Ë 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 Ñ»·´¦Àí£¬´¦ÀíÁ˳öÏÖµÄÈÎÒâ¶à¸öϵͳµ¯´°µÄÇé¿ö£¬´Ó¶ø½â¾öÁËÎÊÌâ¡£ |