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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
¿Í»§¶Ë×Ô¶¯»¯²âÊÔÑо¿
 
À´Ô´£ºÃÀÍż¼ÊõµãÆÀÖÐÐÄ ·¢²¼ÓÚ£º 2017-9-1
  2967  次浏览      27
 

±³¾°

²âÊÔ×÷ΪÖÊÁ¿±£Ö¤¼«ÆäÖØÒªµÄÒ»»·£¬ÔÚÒÆ¶¯App¿ª·¢Á÷³ÌÖÐÆðµ½·Ç³£¹Ø¼üµÄ×÷Óᣴӿª·¢¹¤³Ìʦµ½²âÊÔ¹¤³Ìʦ£¬ÈËÈ˶¼Ó¦¾ß±¸Á¼ºÃµÄ²âÊÔÒâʶ£¬½«Òþ»¼ºÍ·çÏÕÔÚÉÏÏß֮ǰÕÒ³ö²¢½â¾ö£¬¿ÉÒÔÓÐЧµÄ¼õÉÙÏßÉÏʹʡ£

ÃÀÍźʹóÖÚµãÆÀApp×÷ΪÃÀÍŵãÆÀƽ̨µÄÖ÷ÒªÈë¿Ú£¬Ö§³Ö³ÐÔØ×ÅÃÀÍŵãÆÀ¸÷´óÒµÎñ¡£ÆäÖÐÃÀÍŵãÆÀ¾³Íâ¶È¼ÙÒµÎñÖ÷Òª°üÀ¨Á˳ö¾³ÓÎÏà¹ØÒµÎñÒÔ¼°ËùÓеľ³Íâ³ÇÊÐÕ¾£¬Ò²ÊÇÃÀÍŵãÆÀ·Ç³£¿´ÖغʹóÁ¦·¢Õ¹µÄÒµÎñÏß¡£ÎªÁ˱£Ö¤ÖÊÁ¿£¬ÐèÒª½øÐи÷Ïî²âÊÔ£ºÃ°Ñ̲âÊÔ[1]¡¢¹¦ÄܲâÊÔ¡¢¼¯³É²âÊÔ¡¢×¨ÏîÐÔÄܲâÊÔ£¬»Ø¹é²âÊÔ[2]¡£ÆäÖÐðÑ̲âÊԺͻعé²âÊÔ´ó¶àÓÉ¿ª·¢×Ô¼ºÊÖ¶¯Ö´ÐУ¬ÓнϴóµÄÓÅ»¯¿Õ¼ä¡£Ò»·½Ã棬²âÊÔµÄÈËÁ¦³É±¾½Ï¸ß£»ÁíÒ»·½Ã棬ÔÚ֮ǰµÄ²âÊÔ¹ý³ÌÖз¢Éú¹ý©²âµÈÎÊÌ⣬ÕâЩÎÊÌâÔÚ²âÊԽ׶α»QA·¢ÏÖ£¬ÓÖ»áÔٴηµ¹¤£¬·Ñʱ·ÑÁ¦¡£

¼øÓÚÕâÁ½²¿·Ö²âÊÔÓÃÀýÏà¶ÔÎȶ¨£¬²»»áƵ·±·¢Éú½Ï´óµÄ±ä»¯£¬ÎÒÃÇ´òË㽫Æä×Ô¶¯»¯£¬½µµÍÈËÁ¦³É±¾Í¶È룬½«²âÊÔ½á¹û±¨±í»¯£¬±ÜÃâÈËΪÊè©Ôì³ÉµÄһϵÁÐÎÊÌâ¡£

[1]ðÑ̲âÊÔ£¨smoke testing£©£¬¾ÍÊÇ¿ª·¢ÈËÔ±ÔÚ¸öÈ˰汾µÄÈí¼þÉÏÖ´ÐÐĿǰµÄðÑ̲âÊÔÏîÄ¿£¬È·¶¨ÐµijÌÐò´úÂë²»³ö¹ÊÕÏ¡£Ã°Ñ̲âÊԵĶÔÏóÊÇÿһ¸öбàÒëµÄÐèÒªÕýʽ²âÊÔµÄÈí¼þ°æ±¾£¬Ä¿µÄÊÇÈ·ÈÏÈí¼þ»ù±¾¹¦ÄÜÕý³££¬¿ÉÒÔ½øÐкóÐøµÄÕýʽ²âÊÔ¹¤×÷¡£Ã°Ñ̲âÊÔµÄÖ´ÐÐÕßÊǰ汾±àÒëÈËÔ±¡£

[2]»Ø¹é²âÊÔÊÇÈí¼þ²âÊÔµÄÒ»ÖÖ£¬Ö¼ÔÚ¼ìÑéÈí¼þÔ­Óй¦ÄÜÔÚÐ޸ĺóÊÇ·ñ±£³ÖÍêÕû¡£

·½°¸Ñ¡ÐÍ

Ŀǰҵ½ç²âÊÔ·½°¸·Ç³£¶à£¬AndroidºÍiOS˫ƽ̨µÄ·½°¸¼ÓÆðÀ´´óÔ¼ÓÐÊ®Æß°ËÖÖ¡£Ó¦¸ÃÈçºÎÑ¡ÔñÊʺÏÍŶӵIJâÊÔ·½°¸ÄØ£¿ÎÒÃÇÖ÷Òª¿¼ÂÇÒÔϼ¸¸ö·½Ã棺

ƽ̨֧³Ö¡£

Îȶ¨ÐÔ¡£

ά»¤³É±¾¡£

¿ÉÀ©Õ¹ÐÔ¡£

ÆäÖÐά»¤³É±¾ÎÒÃÇÓÈΪ¿´ÖØ¡£Ä¿Ç°ÍŶӵĿª·¢ºÍ²âÊÔͬѧÈÎÎñ¶¼±È½Ï±¥ºÍ£¬ÒµÎñ´¦ÓÚ¸ßËÙ·¢Õ¹ÆÚ£¬Ã»·¨³é³öÌ«¶àµÄʱ¼ä¿ª·¢/ά»¤²âÊԽű¾£¬Õâ¾ÍÐèÒªÔÚÕâ·½Ãæ×öµ½ÔÚͶÈë½ÏÉÙʱ¼äµÄǰÌáϲ»Ó°Ïì×Ô¶¯»¯²âÊԵĽá¹û²ú³ö¡£³£¹æµÄTDD[3]ÊǺ¯Êý¼¶±ð½øÐвâÊÔÇý¶¯¿ª·¢£¬Í¨³£ÐèÒªÔÚ´úÂë¼¶±ð×öºÜ¶à¹¤×÷£¬ÐèÒª²âÊÔÍŶÓͶÈë½Ï´óµÄ¿ª·¢³É±¾¡£¼øÓÚÔڳɱ¾·½ÃæµÄ¿¼ÂÇ£¬ÎÒÃÇ´òËãʹÓÃBDD[4]À´½â¾öÕâ¸öÎÊÌâ¡£Ö÷ÒªÔÚÐÐΪ²ãÃæ½øÐвâÊÔͶÈ룬ÔÚ´úÂë²ã¼¶·½ÃæÍ¶Èë½ÏС£¬Ó÷dz£ÓбæÊ¶Á¦µÄÐÐΪ½øÐвâÊÔ¡£

ÔÚÆ½Ì¨Ö§³Ö·½Ã棬ÓÉÓÚÊǿͻ§¶ËÍŶӣ¬ËùÒÔÎÒÃÇÏ£ÍûдºÃµÄÓÃÀý¿ÉÒÔͬʱÅÜÔÚAndroidºÍiOSÁ½¸öƽ̨ÉÏ£¬»¹Ï£ÍûÓÃÀý¿ÉÒÔÒ»²¿·Ö½øÐÐÃÀÍźʹóÖÚµãÆÀÁ½¸öAppµÄ¸´Óã¬ËùÒÔÐèÒªÒ»¸ö¿ÉÒÔ¿çÆ½Ì¨µÄ·½°¸¡£

[3]²âÊÔÇý¶¯¿ª·¢£¨Test-driven development£¬ËõдΪTDD£©ÊÇÒ»ÖÖÈí¼þ¿ª·¢¹ý³ÌÖеÄÓ¦Ó÷½·¨£¬³«µ¼ÏÈд²âÊÔ³ÌÐò£¬È»ºó±àÂëʵÏ֯书ÄܵÃÃû¡£²âÊÔÇý¶¯¿ª·¢ÊÇ´÷Á½¶¥Ã±×Ó˼¿¼µÄ¿ª·¢·½Ê½£ºÏÈ´÷ÉÏʵÏÖ¹¦ÄܵÄñ×Ó£¬ÔÚ²âÊԵĸ¨ÖúÏ£¬¿ìËÙʵÏ֯书ÄÜ£»ÔÙ´÷ÉÏÖØ¹¹µÄñ×Ó£¬ÔÚ²âÊԵı£»¤Ï£¬Í¨¹ýÈ¥³ýÈßÓàµÄ´úÂ룬Ìá¸ß´úÂëÖÊÁ¿¡£

[4]ÐÐΪÇý¶¯¿ª·¢£¨Behavior-driven development£¬ËõдBDD£©ÊÇÒ»ÖÖÃô½ÝÈí¼þ¿ª·¢µÄ¼¼Êõ¡£Ëüͨ¹ýÓÃ×ÔÈ»ÓïÑÔÊéд·Ç³ÌÐòÔ±¿É¶ÁµÄ²âÊÔÓÃÀýÀ©Õ¹Á˲âÊÔÇý¶¯¿ª·¢·½·¨¡£

´ÓÈëÃŵ½·ÅÆú

È¥ÄêÄêµ×µÄʱºòÎÒÃÇÍŶӾÍ×Ô¶¯»¯²âÊÔ·½Ãæ½øÐÐÁË̽Ë÷¡£·¢ÏÖCalabashÂú×ãBDDºÍ¿çƽ̨£¬ÓÚÊǽøÐÐÁËС·¶Î§ÊÔÓá£Ôڽű¾¿ª·¢ºÍά»¤·½Ã棬³É±¾È·ÊµµÍÓÚº¯Êý¼¶±ðµÄ²âÊÔ¿ª·¢£¬Ëü¿ÉÒÔÓÃÒ»ÖÖÀàËÆ×ÔÈ»ÓïÑԵķ½Ê½±àд²âÊÔÓÃÀý£¬ÕâÊÇÒ»¸ö¼òµ¥µÄtest caseʾÀý£º

Scenario: Ê×Ò³
Then I press "ÉϺ£"
When I press view with id "city"
Then I see "º£Íâ"
When I press "º£Íâ"
And I press view with id "start_search"
When I enter "¶«¾©" into input field number 1
Then I press list item number 1
Then I see "¶«¾©"
When I press "ÃÀʳ"
...

Õâ¸öʾÀýÏàÐÅ¿ª·¢¹¤³ÌʦÃÇÉõÖÁûд¹ý´úÂëµÄÈËÒ²¿´µÃ¶®£¬Æäʵ¾ÍÊÇÓ󣹿µÄÐÐΪ˼άģʽȥ±àд²âÊÔÓÃÀý¡£ÆäÖÐFeature¡¢Scenario¡¢StepÊÇBDDµÄÈý¸öºËÐĸÅÄ

Feature£º¾ÍÊÇ×ÖÃæÒâ˼£¬Ö÷ÒªÊÇÃèÊö¹¦ÄÜÌØÐÔ¡£

Scenario£º³¡¾°£¬ÔÚÕâÀï¿ÉÒÔ¼òµ¥µÄÀí½âΪһ¸ö¸öµÄϸ·Öcase£¬Í¨³£Çé¿öÏÂÐèÒª¶à¸ö³¡¾°Æ´½ÓÀ´Íê³ÉÒ»¸ö¾ßÌåµÄtest case¡£

Step£ºÊµÏÖ³¡¾°µÄ²½Öè´úÂë¡£

µ«ÊÇCalabashÔÚÒµÄÚÏà¶ÔСÖÚ£¬Óöµ½ÎÊÌâ¾Í²»Ì«ºÃ½â¾ö¡£±ÈÈçÔÚijЩÈýÐÇÊÖ»úÉϾÍÓöµ½ÁËijЩ¿Ø¼þ¸ù¾ÝIDÕÒ²»µ½µÄÎÊÌ⣬»áÓ°ÏìUIÔªËØµÄ¶¨Î»¡£ÔÚ±àд×Ô¶¯»¯½Å±¾Ê±£¬ÔªËض¨Î»µÄΨһÐÔÊÇÒ»¸ö¿´ËƼòµ¥Êµ¼ÊÉÏ»áÓкܶà¿ÓµÄÎÊÌ⣬½Å±¾µÄÎȶ¨ÐÔÒ»¶¨³Ì¶ÈÉÏÒÀÀµÁËÈçºÎ½øÐÐÔªËØ¶¨Î»¡£

Æä´Î£¬ÔÚAndroidÍŶÓÏëÒª°Ñ·½°¸Íƹ㵽iOSƽ̨µÄʱºò£¬ÎÒÃÇ·¢ÏÖÁËÒ»¸öºÜ´óµÄÎÊÌ⣺iOS½ÓÈëCalabashµÄ³É±¾Ì«¸ß¡£AndroidµÄ½ÓÈë³É±¾ºÜµÍ£¬Ö»ÐèÒªÒ»¸öÖØÇ©ÃûµÄapkÎļþ¾Í¿ÉÒÔÁË£¬²¢²»ÒÀÀµÔ´Â룬¶øiOSµÄ½ÓÈëÐèÒªÒÀÀµÔ´Âë×öһЩ¹¤×÷£¬Õâ¾Í¸øiOSͬѧÔì³ÉÁ˺ܶàÀ§ÄÑ¡£ÃÀÍźʹóÖÚµãÆÀÊÇÁ½¸ö¾Þ´óµÄApp£¬ÔÚÔ´Âë½ÓÈë·½ÃæµÄ¹¤×÷Á¿²¢²»Ð¡£¬¶øÇҺܶàÒþ»¼ÎÞ·¨Ô¤ÁÏ£¬¾ÍËãÒÀÀµÔ´Âë½ÓÈëÖ®ºó£¬»¹ÓÐÒ»¸öÎÊÌâÐèÒª½â¾ö£ºiOSµÄIDϵͳ¡£Í¨³£iOSÒµÎñ¿ª·¢´úÂëÖв»ÊÇͨ¹ýIDÀ´»ñÈ¡Ò³ÃæÔªËØ£¬²»¹ÜÊÇÊÖд²¼¾Ö´úÂ뻹ÊÇÓÃxib²¼¾Ö£¬¿ª·¢ÕßÒ»°ã²»»á¸ø½çÃæÔªËØ¼ÓID£¬ËùÒÔiOSµÄÔªËØ´ó¶à¶¼Ã»ÓÐID£¬¶øCalabash¶ÔÔªËØµÄ¶¨Î»Ö÷ÒªÒÀÀµID£¬ÕâÎÞÒÉÈÃÎÒÃǸе½Ñ©ÉϼÓ˪¡£

ÔÚAndroidÍŶÓÓÃдºÃµÄÓÃÀý½øÐÐÁ˼¸¸ö°æ±¾µÄðÑ̲âÊÔÖ®ºó£¬ÍŶÓÄÚ²¿Android¡¢iOS¡¢QAµÄÍ¬Ñ§×øÏÂÀ´Ò»Æð½øÐÐÁË·½°¸ºóÐøµÄ̽¾¿£¬×îÖÕ¾ö¶¨·ÅÆúCalabash£¬¼ÌÐøÑ°ÕÒ¿ÉÒÔÌæ´úµÄ·½°¸¡£

´Ó·ÅÆúµ½ÔÙ´ÎÓµ±§

ÔÚ¾­Àú¹ýCalabashµÄ´ìÕÛÖ®ºó£¬ÎÒÃÇÔÚÑ¡ÐÍ·½Ãæ¸ü¼ÓÉ÷ÖØ¡£QAͬѧ¶ÔAppiumÓÐÒ»¶¨µÄ¾­Ñ飬ÓÚÊÇÏȲÉÓÃÁËAppium·½°¸½øÐмæÈÝÐÔ²âÊԺͲ¿·Ö»Ø¹é²âÊÔ¡£ÔÚÒµÎñ¿ìËÙ·¢Õ¹µÄ¹ý³ÌÖУ¬Î¬»¤³É±¾ÈÃQAͬѧԽÀ´Ô½Æ£ÓÚÓ¦¸¶£¬ÓÚÊÇÎÒÃÇÓÖ×øÔÚÒ»Æð½øÐÐз½°¸µÄÌÖÂÛºÍ̽Ë÷¡£

CalabashµÄBDDģʽÊÇ´ó¼ÒÈϿɵģ¬Ò²ÊÇ´ó¼ÒÔ¸Òâ½ÓÊܵģ¬ÄǾÍÐèÒªÔÚÐµķ½°¸ÖУ¬¼ÌÐøÊ¹ÓÃÕâÖÖ·½Ê½±àдά»¤²âÊÔÓÃÀý¡£ÎÒÃÇÏë°ÑAppiumºÍCalabashÁ½ÕßµÄÓÅÊÆ½áºÏÆðÀ´£¬»¹Ïë°Ñ֮ǰд¹ýµÄCalabashµÄ²âÊÔÓÃÀýÎÞ·ìÇ¨ÒÆ¼ÌÐøÊ¹Óá£

È¡Æä¾«»ª

CalabashΪʲô¿ÉÒÔʹÓÃÀàËÆ×ÔÈ»ÓïÑԵķ½Ê½±àд²âÊÔÓÃÀý´ïµ½BDDµÄЧ¹ûÄØ£¿¸ù±¾Ô­ÒòÊÇÒòΪCucumber¡£

ÔÚCalabash¹ÙÍøÖÐ×¢Ã÷ÁËËûÃÇʹÓÃÁËCucumber£¨Ò»ÖÖ¼òµ¥µÄ×ÔÈ»ÓïÑÔ·½Ê½µÄBDD¿ªÔ´½â¾ö·½°¸£©£¬ÄÇôÎÒÃÇÄÜ·ñµ×²ãʹÓÃAppiumÖ§³Ö£¬ÉϲãʹÓÃCucumber½øÐвâÊÔÓÃÀýµÄ¿ª·¢ºÍά»¤ÄØ£¿

´ð°¸µ±È»ÊÇ¿ÉÐеġ£ÎÒÃÇÔÚAppiumµÄ¹Ù·½Ê¾Àý´úÂëÖÐÕÒµ½Á˴𰸡£Appium¹Ù·½ÌṩÁËÓëCucumber½áºÏʹÓõÄÀý×Ó×÷Ϊ²Î¿¼£¬ËäÈ»Õⲿ·Ö´úÂëÒѾ­Á½Äêû¸üÐÂÁË£¬µ«ÊÇÒÀÈ»¸øÎÒÃÇÌṩÁ˹ؼü˼·¡£

з½°¸ÐγÉ

¿Í»§¶ËµÄͬѧÓëQAͬѧ½øÐÐÁËÌÖÂÛ£¬È·ÈÏÁËʹÓÃQAͬѧĿǰʹÓõİ´ÕÕApp½øÐÐÓÃÀý²ð·ÖµÄ·½°¸¡£Ö®Ç°CalabashµÄ·½°¸Óкܶà¿ÉÒÔ½è¼ø¹ýÀ´£¬ÓÚÊÇÎÒÃÇÏȽøÐÐÁËÕûÌå½á¹¹µÄµ÷Õû£º

°´ÕÕµãÆÀºÍÃÀÍÅÁ½¸öApp½øÐÐÓÃÀýÇø·Ö£¬¹«¹²²½ÖèµÄ·â×°ÔÚcommon_steps.rbÖС£µãÆÀºÍÃÀÍŵÄĿ¼Ï·ֱðÓÐcucumber.yml½Å±¾£¬ÕâÊÇÓÃÀ´Çø·ÖAndroidºÍiOSƽ̨µÄ£¬ÄÚÈÝ´ó¸ÅÊÇÕâÑù£º

# config/cucumber.yml
##YAML Template
---
ios: IDEVICENAME='ios'
android: IDEVICENAME='android'
...

ÆäÖÐAndroid/configºÍiOS/configÊÇAndroidºÍiOSÁ½¸öƽ̨µÄÌØ¶¨ÅäÖã¬Õⲿ·ÖÅäÖôúÂëÔÚsupport°üÄÚ£¬ÊÇAppiumÆô¶¯ÐèÒª¼ÓÔØµÄÅäÖá£

ƽ̨µÄÇø·ÖÔÚenv.rbÖÐÌåÏÖ³öÀ´£º

class AppiumWorld
end

if ENV['IDEVICENAME']=='android'
caps = Appium.load_appium_txt file: File.expand_path("./../android/appium.txt", __FILE__), verbose: true
elsif ENV['IDEVICENAME']=='ios'
caps = Appium.load_appium_txt file: File.expand_path("./../ios/appium.txt", __FILE__), verbose: true
else
caps = Appium.load_appium_txt file: File.expand_path('./', __FILE__), verbose: true
end
Appium::Driver.new(caps)
Appium.promote_appium_methods AppiumWorld

World do
AppiumWorld.new
end


...

ÕâÑùͨ¹ýcucumber -p android/ios¾ÍÄÜÔËÐÐÏàӦƽ̨µÄÓÃÀýÁË£¬CucumberÆäËû²ÎÊý×ÔÐвéÔÄ£¬ºÍCalabash·Ç³£ÏàËÆ¡£

ÍêÈ«ÒÆ³ýCalabashÖ®ºó£¬ËùÓÐCalabashÄÚÖõÄSteps¾ÍûÓÐÁË£¬ÐèÒªÖØÐ·â×°¡£ÆäÖÐFeature¡¢Scenario¡¢StepµÄ¸ÅÄîûÓз¢Éú±ä»¯£¬ºÍCalabashÍêȫһÖ¡£ÖØÐ·â×°StepsÐèÒªÒÀÀµappium_lib¡£ÎªÁ˽µµÍ·â×°³É±¾£¬Ìṩ¸ü¶à¿ÉÓõÄSteps£¬ÎÒÃÇ»¹ÒýÈëÁËselenium-cucumber×÷Ϊ¸¨ÖúʹÓá£

×îºótestdata.rbÊDZ£´æ²âÊÔÊý¾ÝµÄÎļþ£¬ÀýÈç²âÊÔÕ˺ŵĵǼÓû§ÃûºÍÃÜÂëµÈÊý¾Ý¡£

×îÖÕÐèÒªÒÀÀµµÄ¿â´óÖÂÊÇÕâЩ£º

gem 'appium_lib', '~> 9.4.2'
gem 'rest-client', '~> 2.0.2'
gem 'rspec', '~> 3.5.0'
gem 'cucumber', '~> 2.4.0'
gem 'rspec-expectations', '~> 3.5.0'
gem 'spec', '~> 5.3.4'
gem 'selenium-cucumber', '~> 3.1.5'
...

ÕâÑù¾ÍÍê³ÉÁË×éºÏ·½°¸µÄÕûÌå¿ò¼Ü¡£

з½°¸ÓÅÊÆ

з½°¸ÐγÉÖ®ºó£¬ÎÒÃǵÄÌá²âÁ÷³Ì¾Í¶àÁËÒ»µÀ±£ÕÏ£º

ÓÚÊÇÿ¸ö¿Í»§¶ËRD¶¼¿ÉÒÔÓä¿ìµÄµã»÷½Å±¾Éú³É²âÊÔ±¨¸æ£¬Ìá½»¸øQAͬѧ£¬Ê¡È¥ÁË´ó¼Ò±¾µØÅܲâÊÔµÄʱ¼ä£¬Ò²°ïÖúQAͬѧ½ÚÔ¼ÁËʱ¼ä£¬²»»áÔÙ³öÏÖ·µ¹¤»òÕß²âÊÔÒÅ©µÄÇé¿ö¡£

ÕûÌåÎȶ¨ÐÔÌá¸ß

ÓÉÓڵײãÇл»µ½ÁËAppium£¬Îȶ¨ÐÔÌá¸ßÁË£¬Í¬ÑùµÄ»úÐͲ»ÔÙ³öÏÖÀàËÆCalabashµÄ²»¼æÈÝÎÊÌâÁË£¨¸ù¾ÝIDÎÞ·¨¶¨Î»µ½Ä³¸öÔªËØ£©£¬QAͬѧÔÚAppiumµÄ×Ô¶¯»¯µÀ·ÉÏÒѾ­×ö¹ý²»ÉÙʵ¼ù£¬¾ßÓÐÏà¹Ø¾­Ñé¡£ÔÚWebview·½ÃæÖ§³ÖÒ²ÊDZȽϺõģ¬Ïà±ÈCalabashÖ»ÊǶàÁËÇл»WebviewºÍNativeÉÏÏÂÎĵIJ½Ö裬AppiumµÄÓÅÊÆÍêÈ«ÌåÏÖ³öÀ´ÁË¡£

iOS½ÓÈë³É±¾½µµÍ

Õë¶ÔAndroidºÍiOSµÄ½ÓÈë³É±¾£¬Ò²½µµÍµ½ÁËÒ»Ö¡£AndroidÒÀ¾ÉÊÇÌṩapk£¬iOSÌá¹©ÖØÇ©ÃûµÄipa°ü¼´¿É£¬ÎÞÐèÔ´Â뼯³É£¬Õâ¾Í½â¾öÁËCalabash·½°¸iOS¼¯³É³É±¾´óµÄÎÊÌâ¡£

ÔªËØ¶¨Î»ÊÖ¶ÎÔö¶à

¹«¹²StepsÒ»´Î·â×°´¦´¦¿ÉÓã¬ÔÚ¿çApp¸´ÓõÄÒµÎñÉÏ£¬²âÊÔ´úÂëÒ²¼¸ºõ¿ÉÒÔ¸´Ó㬱àд²âÊԽű¾µÄ³É±¾ÔٴνµµÍ¡£iOS¿Ø¼þȱÉÙID²»ºÃ¶¨Î»µÄÎÊÌâÒ²µÃµ½Á˽â¾ö£¬AppiumÖ§³ÖID¡¢class¡¢name¡¢XPathµÈÔªËØ¶¨Î»·½Ê½£¬Èç¹ûǰÈýÕß¶¼²»¿ÉÓõÄÇé¿öÏ£¬Ê¹ÓÃÏà¶Ô¸´ÔÓµ«¼¸ºõÍòÄܵÄXPath¶¼¿ÉÒԵõ½½â¾ö¡£

ÀýÈçÒ»¸ö¸´ÔÓµÄXPath£º

Then I press view with xpath "//android.widget.LinearLayout[1]
/android.widget.FrameLayout[1] /android.widget.LinearLayout[1]
/android.widget.FrameLayout[1] /android.widget.LinearLayout[2]
/android.widget.FrameLayout[1] /android.widget.ListView[1]
/android.widget.LinearLayout[1] /android.widget.LinearLayout[1]"
...

²»Óõ£ÐÄÕâô¸´ÔÓµÄXPathÓ¦¸ÃÔõôд£¬ÕâÆäʵÊÇ×î¼òµ¥µÄ£¬ÒòΪ¿ÉÒÔͨ¹ýAppium-inspectorץȡµÃµ½¡£µ±È»XPathµÄд·¨ÓкܶàÖÖ£¬¿ÉÒÔÑ¡ÓüæÈÝÐÔ¸üºÃµÄд·¨¡£

Ô­Óнű¾ÎÞ·ìÇ¨ÒÆ

֮ǰÔÚʹÓÃCalabashµÄʱºò±àдµÄ½Å±¾£¬ÔÚ·â×°ºÃ¹«¹²StepsÖ®ºó£¬¼¸ºõÎÞ·ìµÄ½øÐÐÁËÇ¨ÒÆ£¬¶ÔÉϲã±àд²âÊÔÓÃÀýµÄͬѧÀ´Ëµ£¬¼¸ºõûÓб仯£¬ÎÞÐè¹ØÐÄÊÇCalabash»¹ÊÇAppium£¬Ê¹ÓúÍÔ­ÏÈÒ»ÑùµÄBDD·½Ê½¼ÌÐøÓä¿ìµÄдÓÃÀý¾ÍºÃ¡£

Calabash·½°¸Ê±ÆÚµÄhomepage³¡¾°£¨²¿·Ö£©£º

Çл»Ð·½°¸ºóhomepage³¡¾°£¨²¿·Ö£©£º

²¢Ã»ÓÐÌ«´óµÄ²î±ð¡£

Ò×¼¯³ÉJenkins£¬±¨¸æ¿ÉÊÓ»¯

Cucumber¿ÉÒÔ½øÐб¨±íµÄ¿ÉÊÓ»¯Êä³ö£¬Ö»ÒªÔÚÃüÁîºóÃæ×·¼Ó--format html --out reports.html --format pretty£¬ÔÚÖ´ÐÐÍêÈ«²¿½Å±¾Ö®ºó¾Í¿ÉÒÔ¿´µ½Éú³ÉºÃµÄHTML¸ñʽµÄ²âÊÔ±¨¸æ£¬Ò²¿ÉÒÔʹÓÃJSONµÄ¸ñʽ¡£

¼¯³ÉJenkinsµÄ·½Ê½Ò²Ïà¶Ô³£¹æ£¬Ö»Òª°²×°ºÃÐèÒªµÄÒÀÀµ¾Í¿ÉÒÔ¡£

ÔÚ²âÊÔ¹ý³ÌÖУ¬ÎÒÃÇʹÓÃÁ˹«Ë¾ÄÚ²¿µÄÔÆ²â»úÆ÷Ô¶³Ìƽ̨£º

ÀûÓÃÔ¶³Ìƽ̨µÄÕæ»ú½øÐÐÔ¶³Ì½Å±¾²âÊÔ£¬²âÊÔ±¨¸æÊ¾ÀýÈçÏ£º

×Ô¶¯»¯²âÊÔÔËÐÐЧ¹û

ÔÚ¾³ÍâÒµÎñÏ߿ͻ§¶Ë½øÐÐÁË×Ô¶¯»¯²âÊÔʵ¼ù£¬Ä¿Ç°ÓÃÓÚ¹ÌÓÐðÑÌ×Ô¶¯»¯£¬·½°¸Ç°ºó¶Ô±ÈÈçÏ¡£

Calabash·½°¸Ê±ÆÚ¾³ÍâµãÆÀ¹ÌÓÐðÑÌÓÃÀýºÄʱ£º

з½°¸¾³ÍâµãÆÀ¹ÌÓÐðÑÌÓÃÀýºÄʱ£¨Ïà±È֮ǰCalabash·½°¸Ê±ÆÚµÄÓÃÀýÓÐËùÔö¼Ó£©£º

ͨ¹ýÊý¾Ý¶Ô±È¿ÉÒÔ¿´³ö£¬ÓÃÀýÊýÁ¿ÓëÖ´ÐкÄʱ²¢²»ÊÇÑϸñµÄÏßÐÔ¹ØÏµ£¬ÔÚÓÃÀýÊýÁ¿À©´óÒ»±¶µÄÇé¿öÏ£¬ºÄʱ²¢²»»áÏßÐÔµÄÀ©´óÒ»±¶¡£

¿ª·¢³É±¾£ºµ¥¸öÓÃÀýµÄ¿ª·¢³É±¾Ö÷Òª¸ù¾ÝÓÃÀý¹æÄ£Ïà¹Ø£¬¿ª·¢Ò»¸ö°üº¬7¸ö¶¯×÷µÄÓÃÀý´ó¸ÅºÄʱ30·ÖÖÓ×óÓÒ£¬ÆäÖаüÀ¨Á˶¨Î»ÔªËصĺÄʱ¡£¶à¸öÓÃÀýµÄ¿ª·¢³É±¾²»Ö¹ºÍÓÃÀý¹æÄ£Ïà¹Ø£¬»¹ºÍÓÃÀýÖ®¼äÊÇ·ñÓи´Óõij¡¾°Ïà¹Ø£¬Õâ¾ÍÇ£³¶µ½ÁËScenario²ð·ÖÁ£¶ÈµÄÎÊÌ⣬ÏÂÎÄÖÐÓÐÌáµ½¡£

ĿǰִÐÐÓÃÀýÃÀÍÅ+µãÆÀ×ܺÄʱ20·ÖÖÓ×óÓÒ£¬½µµÍÁËÈËÁ¦³É±¾£¬±ÜÃâÁËQAͬѧ·µ¹¤µÄÇé¿ö£¬·½°¸ÐÂÀϽ»ÌæÎÞ·ìÆ½»¬¹ý¶É£¬Î¬»¤³É±¾µÍ¡£Õâ²»½öÊÇÎÒÃÇÍŶӶÔ×Ô¶¯»¯·½°¸µÄÆÚÐí£¬Ò²ÊÇ×Ô¶¯»¯²âÊԵļÛÖµËùÔÚ¡£

ÎÊÌâÓëÕ¹Íû

ÎÊÌâ

scroll or swipe£¿

ÔÚʹÓÃUIAutomationµÄʱºò£¬AndroidÒ³Ãæ»¬¶¯²ÉÈ¡µÄ·½Ê½Êǵ÷ÓÃscroll_uiselector·½·¨£¬ÀýÈ磺

Then /^I scroll to view with text "([^\"]*)"$/ do |value|
text = %Q("#{value}")
args = scroll_uiselector("new UiSelector().textContains(#{text})")
find_element :uiautomator, args
end

µ«ÊÇÕâÖÖ·½Ê½´æÔÚ²»Îȶ¨ÐÔÒòËØ£¬ÔÚijЩÇé¿öÏ£¬»¬¶¯ËÑË÷UIÔªËØ·Ç³£Âý£¨ÉÏÏ»¬¶¯ºÜ¶à´Î£©ÉõÖÁ»¬¶¯¶à´Î×îºóÈÔÈ»ËÑË÷²»µ½£¬½Å±¾»áÖ´ÐÐʧ°Ü¡£ÔڱȽϸ´ÔÓµÄAppÉϺÜÈÝÒ׳öÏÖ£¬ÊÇÕûÌå½Å±¾Îȶ¨ÐԺͳɹ¦ÂÊµÄÆ¿¾±¡£Èç¹û¸ü»»ÎªUIAutomation2£¬¾Í¿ÉÒÔʹÓÃswipeÓï¾ä½øÐÐÏà¶Ô¾«×¼µÄ»¬¶¯£º

swipe start_x: start_x, start_y: start_y, end_x: start_x, end_y: start_y - pixel.to_i

¸ù¾Ý׫д±¾ÎÄʱAppiumµÄ×îа汾v1.6.5½øÐÐʵ¼ù£¬·¢ÏÖÇл»UIAutomation2ºóʹÓÃswipe»¬¶¯£¬¶Ô±ÈscrollµÄ·½Ê½³É¹¦ÂÊÌá¸ßÁËÒ»±¶¶à£¬ºÄʱ¼õ°ë£¬Ð§¹û·Ç³£ÏÔÖø¡£ËäÈ»ÆäËûÓï¾ä»áÂÔ΢ÊÜÒ»µãÓ°Ï죬²»¹ýÕûÌå¸Ä¶¯·ù¶ÈºÜС£¬ÐԼ۱Ⱥܸߣ¬¶øÇÒUIAutomation2»¹Ö§³Ö¶ÔToastµÄʶ±ð£¬ÕûÌåÎȶ¨ÐÔ´ó·ùÌá¸ß£¬½¨ÒéʹÓÃUIAutomation2¡£

Scenario²ð·ÖÁ£¶È

ÔںܶàÇé¿öÏ£¬Ò»¸ötest caseÊÇÓÉÒ»¸ö»ò¶à¸öScenario×é³ÉµÄ£¬²»Í¬µÄtest caseÓÖ»á´æÔÚ²¿·ÖScenario¸´ÓõÄÇé¿ö£¬Ã÷È·ScenarioµÄ²ð·ÖÁ£¶È¿ÉÒÔ°ïÖú¿ª·¢ÈËÔ±½µµÍ²âÊԽű¾µÄ±àд³É±¾£¬´ïµ½Ò»¶¨³Ì¶ÈÉϵÄAppÄÚ²¿¸´ÓÃÉõÖÁ¿çApp¸´Óá£ÓÈÆäÔÚ¶àÈËЭ×÷µÄ»·¾³Ï£¬ÕâÊÇÒ»¸ö·Ç³£ÖµµÃ̽¾¿µÄÎÊÌâ¡£

Õ¹Íû

×Ô¶¯´¥·¢ÔƲâ

Ŀǰ´¥·¢µÄ·½Ê½ÊÇÈ˹¤´¥·¢Jenkins job£¬×îºóÊä³ö±¨¸æ¡£Î´À´Òª×öµÄÊÇÔÚÌØ¶¨µÄʱÆÚ×Ô¶¯´¥·¢job½øÐÐÔÆ¶Ë×Ô¶¯»¯£¬´¥·¢Ê±ÆÚ¿ÉÄÜ»á²Î¿¼AppµÄ¿ª·¢ÖÜÆÚʱ¼ä½Úµã¡£

ÈËÈ˶¼ÊDzâÊÔ¹¤³Ìʦ

ÎÒÃÇÏ£ÍûÍŶÓÄÚÈËÈ˶¼¾ß±¸Á¼ºÃµÄ²âÊÔ˼ά£¬ÄÜÕ¾ÔÚ²âÊԵĽǶÈÏëÎÊÌ⣬ÁìÎò²âÊÔÇý¶¯¿ª·¢µÄÒâÒ塣ͨ¹ý¼òµ¥µÄ·½Ê½ÈÃÍŶÓÄÚµÄͬѧÃDzÎÓë²âÊÔ£¬Ìå»á²âÊÔ£¬Ð´³ö¸üÓÅÐãµÄ´úÂë¡£

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

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù