±³¾°
²âÊÔ×÷ΪÖÊÁ¿±£Ö¤¼«ÆäÖØÒªµÄÒ»»·£¬ÔÚÒÆ¶¯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ÎÓë²âÊÔ£¬Ìå»á²âÊÔ£¬Ð´³ö¸üÓÅÐãµÄ´úÂë¡£
|