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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
android app×Ô¶¯»¯²âÊÔ¿ò¼ÜAppium×ÊÁÏÕûÀí
 
  2960  次浏览      27
 2018-4-23 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔCSDN£¬,±¾ÎĽéÉÜ×Ô¶¯»¯²âÊÔ¿ò¼ÜAppiumÒÔ¼°AppiumµÄ»·¾³´î½¨£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£

1 ×Ô¶¯»¯²âÊÔ

1.1 ×Ô¶¯»¯²âÊÔ¼ò½é

×Ô¶¯»¯²âÊÔÊǰÑÒÔÈËΪÇý¶¯µÄ²âÊÔÐÐΪת»¯Îª»úÆ÷Ö´ÐеÄÒ»ÖÖ¹ý³Ì¡£´Ó¹ãÒåÉÏÀ´½²£¬Ò»ÇÐͨ¹ý¹¤¾ß£¨³ÌÐò£©µÄ·½Ê½À´´úÌæ»ò¸¨ÖúÊÖ¹¤²âÊÔµÄÐÐΪ¶¼¿ÉÒÔ¿´×ö×Ô¶¯»¯²âÊÔ¡£´ÓÏÁÒåÉÏÀ´½²£¬×Ô¶¯»¯²âÊÔ¾ÍÊÇͨ¹ý¹¤¾ß¼Ç¼»ò±àд½Å±¾µÄ·½Ê½Ä£ÄâÊÖ¹¤²âÊԵĹý³Ì£¬Í¨¹ý»Ø·Å»òÔËÐнű¾À´Ö´ÐвâÊÔÓÃÀý£¬´Ó¶ø´úÌæÈ˹¤¶ÔϵͳµÄ¹¦ÄܽøÐÐÑéÖ¤¡£

1.2 ×Ô¶¯»¯²âÊÔµÄÓŵã

1£©Ìá¸ßЧÂÊ£ºÍ¨¹ýÔËÐÐ×Ô¶¯»¯²âÊԽű¾£¬¾Í¿ÉÒÔÔÚÒ¹¼ä¡¢ÎçÐݵÈʱ¼ä½øÐвâÊÔÓÃÀý»Ø¹é£¬ÊµÏÖÎÞÈËÖµÊØ²âÊÔ£¬´ó´óÌá¸ßÁ˲âÊÔЧÂÊ¡£

2£©±ÜÃâÖØ¸´¹¤×÷£ºÃ¿·¢²¼Ò»¸öеİ汾£¬ÆäÖд󲿷ֹ¦ÄܺͽçÃæ¶¼ºÍÉÏÒ»¸ö°æ±¾ÏàËÆ»òÍêÈ«Ïàͬ£¬Õⲿ·Ö¹¦ÄܾͿÉÒÔÓÃ×Ô¶¯»¯²âÊÔ£¬±ÜÃâÈ˹¤Öظ´ÀͶ¯¡£

3£©±ÜÃâÈËΪ³ö´í£ºÀýÈçÍüÁËÖ´ÐÐijЩÓÃÀý£¬ÓÃÀýÖ´Ðв½Öè³ö´í£¬ÊäÈëÊý¾Ý³ö´íµÈ¡£

4£©±£Ö¤Ã¿´Î²âÊÔµÄÒ»ÖÂÐԺͿÉÖØ¸´ÐÔ£ºÓÉÓÚÿ´Î×Ô¶¯»¯²âÊÔÔËÐеĽű¾ÊÇÏàͬµÄ£¬ËùÒÔÿ´ÎÖ´ÐеIJâÊÔ¾ßÓÐÒ»ÖÂÐÔ£¬ÕâÒ»µãÊÖ¹¤²âÊÔÊǺÜÄÑ×öµ½µÄ£»¶øÇÒ£¬ÓÉÓÚ×Ô¶¯»¯²âÊÔµÄÒ»ÖÂÐÔ£¬ºÜÈÝÒ×·¢ÏÖ±»²âÈí¼þµÄÈκθı䡣

5£©½ÚÊ¡ÈËÁ¦×ÊÔ´£º¼õÉÙÈ˹¤£¬½µµÍ³É±¾¡£

6£©¿Ë·þÊÖ¹¤²âÊԵľÖÏÞÐÔ£ºÐí¶àËÀËø¡¢×ÊÔ´³åÍ»¡¢¶àÏ̵߳ÈÓйصÄÎÊÌâ £¬Í¨¹ýÊÖ¹¤²âÊÔºÜÄѲ¶×½µ½£»ÏµÍ³Ñ¹Á¦¡¢ÐÔÄܲâÊÔ£¬ÒÔ¼°ÐèҪģÄâ´óÊý¾Ý»ò´ó²¢·¢Óû§µÈ¸÷ÖÖ²âÊÔ³¡¾°£¬ºÜÄÑͨ¹ýÊÖ¹¤²âÊÔÖ´ÐУ»ÏµÍ³¿É¿¿ÐÔ²âÊÔ£¬ÐèҪģÄâϵͳ³¤Ê±¼äÔËÐУ¬ÒÔÑé֤ϵͳÄÜ·ñÎȶ¨ÔËÐУ¬ÄÑÒÔͨ¹ýÊÖ¹¤²âÊÔÖ´ÐС£

1.3 ÄÄЩ²âÊÔÐèÒªÓÃ×Ô¶¯»¯²âÊÔ½â¾ö

²¢²»ÊÇËùÓÐÏîÄ¿¶¼ÊʺÏ×Ô¶¯»¯²âÊÔ£¬ÊʺÏ×Ô¶¯»¯²âÊÔµÄÏîĿһ°ã¾ßÓÐÈçÏÂÌØµã£ºÊ×ÏÈÏîÄ¿ÖÜÆÚÒª³¤£¬ÐèÇó²»»áÆµ·±±ä¸ü£»Æä´ÎϵͳÖжàÊý¶ÔÏóÒª¿ÉÒÔ±»Ê¶±ð¡£

Äã²»ÄÜÖ¸Íû×Ô¶¯»¯²âÊÔÈ¥°ïÄã·¢ÏÖеÄbug£¬×Ô¶¯»¯²âÊÔ±¾ÉíÊDz»¾ß±¸ÏëÏóÁ¦µÄ£¨Ïà¶ÔÓÚÊÖ¹¤²âÊÔ£©¡£ËüµÄÓÅÊÆÔÚÓÚ·´¸´µü´ú£¬ËüµÄ¼ÛÖµ²ú³öÔÚÓÚ³¤ÆÚµÄ»Ø¹é²âÊÔ£¬ÒÔ±£Ö¤±»²â²úÆ·ÔÚ°æ±¾¸üÐÂʱµÄÎȶ¨ÐÔ¡£

Ò»°ãÀ´Ëµ£¬¾ß±¸ÈçÏÂÌØµãµÄ²âÊÔ¿ÉÒÔ¿¼ÂÇʹÓÃ×Ô¶¯»¯²âÊÔ£º

1.´óÁ¿»úеµÄ¡¢Öظ´ÐԵĻعé²âÊÔ£»

2.½á¹ûµÄÕýÈ·ÐÔ²»ÒÀÀµÖ÷¹ÛÅжϵIJâÊÔ£»

3.ÐèҪģÄâ´óÁ¿Êý¾Ý¡¢´óÁ¿²¢·¢Á¿µÄ²âÊÔ£»

4.ÐèÒª²»¼ä¶ÏÖ´ÐеIJâÊÔ£»

5.ÐèÒª¶Ìʱ¼äÄÚÍê³ÉµÄ´óÁ¿²âÊÔÓÃÀýÖ´ÐУ¨±ÈÈçÍêÕûµÄ¹¦Äܻعé²âÊÔ£©£»

²âÊÔÇ÷ÊÆÓ¦¸Ã¾ÍÊÇÍù×Ô¶¯»¯²âÊÔÈ¥·¢Õ¹£¬Õâ¸ö·½ÏòÊǶԵ쬵«ÏÖʵÖÐÍùÍù»áÒòΪ×Ô¶¯»¯¿ò¼ÜµÄÏÞÖÆµÈÔ­Òò£¬Ôì³ÉÎÊÌâµÄ©²â£¬Òò´ËÊʵ±µÄ½øÐÐÊÖ¹¤²âÊÔÒ²ÊǺÜÓбØÒªµÄ¡£

2 ×Ô¶¯»¯²âÊÔ¹¤¾ß

2.1 ÒÆ¶¯¶Ë×Ô¶¯»¯²âÊÔ¹¤¾ßµÄ±È½Ï

±È½ÏÁ÷ÐеÄÒÆ¶¯Ó¦ÓÃ×Ô¶¯»¯²âÊÔ¹¤¾ßµÄ±È½Ï£º

Native apps£¨Ô­ÉúÓ¦Óã©£º½öʹÓÃAndroid»òiOSµÄ±ê×¼SDK±àдµÄÓ¦Óã»

Web apps£¨Òƶ¯ä¯ÀÀÆ÷Ó¦Óã©£ºÓÃÒÆ¶¯Æ½Ì¨µÄä¯ÀÀÆ÷·ÃÎʵÄÓ¦Óã»

Hybrid apps£¨»ìºÏÓ¦Óã©£º°ÑÒ»¸ö»ùÓÚwebviewʵÏֵŦÄܽøÐаü×°µÄÓ¦Óá£

3 Appium

3.1 Appium¼ò½é

AppiumÊÇÒ»¸ö¿ªÔ´µÄ×Ô¶¯»¯²âÊÔ¹¤¾ß£¬ÆäÖ§³ÖiOSºÍAndroidƽ̨ÉϵÄÔ­ÉúÓ¦ÓᢻùÓÚÒÆ¶¯ä¯ÀÀÆ÷µÄÓ¦ÓÃÒÔ¼°»ìºÏÓ¦ÓõIJâÊÔ¡£

1£©AppiumµÄÉè¼ÆÀíÄî

1. AppiumʹÓõÄÊÇÒÆ¶¯Æ½Ì¨¹©Ó¦ÉÌ£¨iOSµÄUIAutomationºÍAndroidµÄInstrumentation¼°UIAutomator)ÌṩµÄ±ê×¼×Ô¶¯»¯²âÊÔ¿ò¼Ü£¬Õâ¾ÍʹµÃÄã²»ÐèÒªÖØÐ±àÒë»òÕßÐÞ¸ÄÄãµÄapp£»

2. Appium½«²»Í¬µÄÒÆ¶¯Æ½Ì¨¹©Ó¦É̵Ä×Ô¶¯»¯²âÊÔ¿ò¼Ü½øÐÐÒ»´Î¸ü¸ß²ã´ÎµÄ·â×°£¬×ö³ÉÒ»Ì×ͳһµÄAPI£¨WebDriverAPI£©Ìṩ³öÀ´£¬Ê¹µÃÄã²»ÐèҪʹÓÃÒ»ÃÅÌØ¶¨µÄÓïÑÔºÍÒ»¸öÌØ¶¨µÄ¿ò¼ÜȥʵÏÖºÍÔËÐÐÄãµÄ²âÊÔ£»

3. AppiumÊÇ¿ªÔ´µÄ£»

2£©AppiumÔ­Àí¿ò¼Üͼ£¨ÍøÉÏͼƬ£©

´ÓÉÏͼ¿ÉÒÔ¿´³ö£º

AppiumµÄºËÐÄÊÇ»ùÓÚC/S¼Ü¹¹µÄÍøÂç·þÎñÆ÷¡£Ëü½ÓÊܿͻ§¶Ë£¨²âÊÔ

ÓÃÀýʵÏÖ¶Ë£©¹ýÀ´µÄÁ¬½Ó£¬¼àÌý£¨¿Í»§¶Ë·¢Ë͹ýÀ´µÄ£©ÃüÁÔÚÒÆ¶¯É豸ÉÏÔËÐÐÃüÁȻºó°Ñ°üº¬ÃüÁîÔËÐнá¹ûµÄHTTPÏìÓ¦°ü·¢Ëͻؿͻ§¶Ë¡£

AppiumʹÓÃC/SµÄ¼Ü¹¹ÊÂʵÉÏΪÎÒÃÇ´ò¿ªÁ˺ܶà¿ÉÄÜÐÔ£ºÎÒÃÇ¿ÉÒÔÔÚÈκÎÖ§³Öhttp ¿Í»§¶ËAPIµÄÓïÑÔÉÏÃæÊµÏÖÎÒÃǵIJâÊÔ´úÂ룻ÎÒÃÇ¿ÉÒÔ°Ñ·þÎñÆ÷¶Ë·ÅÔÚ¸úÎÒÃǵIJâÊÔÔËÐлúÆ÷ÍêÈ«²»Ò»Ñù»úÆ÷ÉÏ£¨ÀýÈçʵÏÖÔÆ¶Ë²âÊÔ£©¡£

3£©Ïà¹Ø×é¼þ½âÊÍ

1.Appium client£º

ʹÓÃWebDriver¿â»òÕß»ùÓÚWebDriverµÄÀ©Õ¹¿â£¨Í³³ÆAppium¿Í»§¶Ë¿â£©±àдµÄ²âÊÔÓÃÀý¡£

2.Appium server£º

ËüÊǸöhttp·þÎñÆ÷£¬ËüרÃŽÓÊÕ´ÓAppium client·¢Ë͹ýÀ´µÄÃüÁͬʱ£¬ËüÒ²ÊÇbootstrap¿Í»§¶Ë¡£Ëü½ÓÊÕµ½¿Í»§¶ËµÄÃüÁîºó£¬ÐèÒª°ÑÕâЩÃüÁî·¢Ë͸øÄ¿±ê»úÆ÷µÄbootstrap£¬bootrap½ÓÊÕµ½ÃüÁת»»ÎªUIAtuomator¿ÉÒÔÖ´ÐеÄÃüÁî¡£

3.Selenium driver£º

¼´WebDriver£¬WebDriverÊÇÒ»¸öÓÃÀ´½øÐÐweb×Ô¶¯»¯²âÊԵŤ¾ß£¬µ«ÊÇËüûÓкÍÈκβâÊÔ¿ò¼Ü½øÐа󶨡£ËüÌṩÁËһϵÁеÄAPI¶ÔwebÓ¦ÓõÄÖнçÃæÔªËØ½øÐж¨Î»¡¢Ä£ÄâÓû§²Ù×÷µÄAPI£¬µ×²ãÀûÓÃJOSNͨ¹ýHTTPÓë·þÎñÆ÷½øÐн»»¥¡£AppiumÀ©Õ¹ÁËWebDriver API£¬Ê¹Ëü¸üÊÊÓÃÓÚÒÆ¶¯Ó¦ÓóÌÐòµÄ²âÊÔ¡£

4.Bootstrap£º

BootstrapÊÇAppiumÔËÐÐÔÚ°²×¿Ä¿±ê²âÊÔ»úÆ÷ÉϵÄÒ»¸öUiAutomator²âÊԽű¾£¬¸Ã½Å±¾Ëù×öµÄÊÂÇéÊÇÔÚÄ¿±ê»úÆ÷¿ªÆôÒ»¸ösocket·þÎñÆ÷À´°ÑAppium´ÓPC¶Ë¹ýÀ´µÄÃüÁî·¢Ë͸øUiAutomatorÀ´Ö´Ðд¦Àí¡£

3.2 Appium²âÊÔ»·¾³´î½¨£¨Windows£©

Appium²âÊÔ»·¾³µÄ´î½¨²½Ö裺

1£©ÏÂÔØ²¢°²×°nodejs

NodejsµÄµØÖ·£ºhttps://nodejs.org/en/download/

2£©°²×°JDK

°²×°¹ý³ÌÂÔ£¬µ«Çë×¢ÒâÈçÏÂÊÂÏî¡£

1.Èç¹ûÑ¡Ôñ64bitsµÄEclipse£¬Ôò±ØÐë°²×°64bitsµÄJava£¬·ñÔòÔËÐÐEclipse»á³öÏÖÈçÏÂÎÊÌ⣺

2.Èç¹ûµ¼ÈëAndroid¹¤³Ì£¬×¢ÒâJDK°æ±¾µÄÑ¡Ôñ£¬ÓпÉÄܳöÏÖÈçÏ´íÎó£ºAndroid requires compiler compliance level5.0 or 6.0. Found '1.8' instead. Please use Android Tools > Fix ProjectProperties

3£©°²×°Android SDK£¨¿ÉÑ¡£©

4£©°²×°Maven£¨¿ÉÑ¡£©

5£©ÏÂÔØ²¢°²×°Appium

AppiumµÄÏÂÔØµØÖ·£ºhttp://appium.io/£¬µ«ÊÇÒ»°ã²»»á³É¹¦¡£ÍƼö¹úÄÚÏÂÔØµØÖ·£ºhttps://testerhome.com/topics/680

°²×°Íê³ÉÖ®ºó£¬½«Appium°²×°Â·¾¶\node_modules\.binÌí¼Óµ½pathÖУ¬È»ºóÔÚcmdÖÐÔËÐÐappium-doctor£¬Èç¹ûËùÓеÄÒÀÀµ¼ì²é¿ÉÒÔͨ¹ý£¬±íʾAppium°²×°³É¹¦¡£

4 »ùÓÚJavaµÄ²âÊÔ¿ò¼ÜµÄÑ¡Ôñ

¿¼Âǵ½´ó¼ÒʹÓõĿª·¢ÓïÑÔÖ÷ÒªÒÔJavaΪÖ÷£¬Òò´Ë²âÊÔ¿ò¼Ü¿¼ÂÇ»ùÓÚJavaµÄJUnit4ºÍTestNG¡£

¶þÕßÖ®¼äµÄ±È½ÏÇë²Î¿¼£º

ÕâÀïÒýÓøÃÎÄÕµÄ×ܽáÐÔÑÔÂÛ×÷ΪÎÒÃÇÑ¡ÔñTestNGÕâÒ»²âÊÔ¿ò¼ÜµÄÀíÓÉ£º¡°µ±ÎÒÃÇ×öÍêËùÓÐÌØÐԵĶԱÈÒÔºó£¬ÎÒ½¨ÒéʹÓà TestNG ×÷Ϊ Java ÏîÄ¿µÄÖ÷Òªµ¥Ôª²âÊÔ¿ò¼Ü£¬ÒòΪ TestNG ÔÚ²ÎÊý»¯²âÊÔ¡¢ÒÀÀµ²âÊÔÒÔ¼°Ì×¼þ²âÊÔ£¨×飩·½Ã湦Äܸü¼ÓÇ¿´ó¡£TestNG Òâζן߼¶µÄ²âÊԺ͸´ÔӵɲâÊÔ¡£Ëü¸ü¼ÓµÄÁé»î£¬ÌرðÊǶԴóµÄÌ×¼þ²âÊÔ¡£ÁíÍ⣬TestNG Ò²º­¸ÇÁË JUnit4 µÄÈ«²¿¹¦ÄÜ¡£ÄǾÍûÓÐÈκÎÀíÓÉʹÓà JUnitÁË¡£¡±

ÁíÍ⣬ÓÉÓÚTestNGºÍJUnit´æÔڷdz£¶àµÄÏàËÆÐÔ£¬¶þÕߵĴúÂë³£³£²»ÐèÒª¹ý¶àת»»¾Í¿ÉÒÔÒÆÖ²£¬ÊìϤJUnitµÄ¿ª·¢ÈËÔ±Ò²²»±Ø¾À½áÐèÒªÖØÐÂѧϰTestNG£»¶øÇÒ£¬TestNGÖ§³ÖXMLÎļþµÄÅäÖ㬷dz£Áé»î¡£

5 ½Å±¾Â¼ÖÆ

5.1 AppiumµÄ½Å±¾Â¼ÖÆ

´ò¿ªAppium.exe£¬µã»÷Inspector°´Å¥½øÐÐÂ¼ÖÆ£¬Mac°æ±¾ÊǾ߱¸Â¼Öƹ¦Äܵģ¨ÍøÉÏͼƬ£©£º

µ«ÊÇWindow°æ±¾Ã»ÓÐÂ¼ÖÆ¹¤¾ß£¬ÈçÏÂͼ£º

5.2 ÈçºÎ×Ô¼ºÊµÏֽű¾Â¼ÖÆ

¿ÉÒÔÒÔ¿¼ÂÇʹÓÃAccessibilityService£¬¼àÌýÓû§ÊäÈ룬ÔÚonAccessibilityEvent(AccessibilityEvent)·½·¨ÖнâÎöEvent£¬ÀýÈçeventtype£¬className£¬text£¬resourceId£¬indexµÈÐÅÏ¢£¬¸ù¾ÝEventÀàÐÍºÍÆäЯ´øµÄ¿Ø¼þÊôÐÔÉú³É²âÊÔ´úÂ룬ȻºóÔÚÐ޸ijÉAppium»òÕ߯äËü×Ô¶¯»¯²âÊÔ¿ò¼ÜÐèÒªµÄ½Å±¾¡£

6 TestNGµÄ±àÒëºÍʹÓÃ

6.1 ±àÒë

TestNGµÄ¹ÙÍøÉÏûÓÐÏֳɵÄjar°ü¹©ÏÂÔØ£¬µ«ÊÇÌṩÁËÔÚEclipseÉÏʹÓõIJå¼þ£¨¸üеĵØÖ·£ºhttp://beust.com/eclipse£©¡£Èç¹ûÐèÒª»ñÈ¡jar°ü£¬¿ÉÒÔ»ñȡԴ´úÂë²¢±àÒë¡£

¹ØÓÚ±àÒëµÄ²½Ö裬¹ÙÍøÉÏÓÐ˵Ã÷£º

TestNGis also hosted on GitHub, where you can download the source and build thedistribution yourself:

$ gitclone git://github.com/cbeust/testng.git

$ cdtestng

$./build-with-gradle

You willthen find the jar file in the target directory

ÆäÖУ¬build-with-gradle²½ÖèÒ²»áÈ¥ÏÂÔØgradle¹¤¾ß¡£

6.2 »ù±¾Ê¹ÓÃ

н¨Java project£¬µ¼ÈëTestNG°ü£¬±àд²âÊÔÓÃÀýÀ࣬ÔÚ¸ÃÀàÖбàд²âÊÔÓÃÀý£¬±àд·½·¨ÓëʹÓÃJunitÏàËÆ¡£

ÔËÐвâÊÔTestNG²âÊÔÓÃÀý£ºÓÒ»÷project->run as->TestNG Test

ÏêϸµÄʹÓùý³ÌÇë²Î¿¼£º

6.3 TestNG²âÊÔÓÃÀýµÄÃüÁîÐÐÔËÐÐ

TestNGµÄ¹Ù·½ÎĵµÓÐÃüÁîÐÐÔËÐеÄÃèÊö¡£

ÔÚÏîÄ¿ÖÐÔö¼Ótestng.xmlÎļþ£¬±àÒëºó£¬½øÈ빤³ÌĿ¼£¬ÊäÈëÃüÁ

javaorg.testng.TestNG testng.xml

×¢£ºÊ¹ÓÃǰÐ轫testNGµÄjar°ü£¨ÒÔ¼°seleniumºÍselenium serverÐèÒªµÄjar°ü£©ÉèÖÃÔÚclasspathÖУ¬ÉÏÃæÃüÁîÖеÄorg.testng.TestNGÊÇtestNGµÄjar°üÖеÄÒ»¸öÀà¡£

6.4 ʹÓÃtestNG.xmlÎļþ¹ÜÀí²âÊÔÓÃÀý

1.Éú³Étestng.xmlÎļþ

ÓÒ»÷Project->TestNG->Convert to TestNG£¬½øÈëÈçϽçÃæ£º

2.²âÊÔÓÃÀýµÄ¹ÜÀí

1. testng.xmlÎļþ½á¹¹

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE suite SYSTEM"http://testng.org/testng-1.0.dtd">

<suite name="suitename" junit="false"verbose="3" parallel="false" thread-count="5"

configfailurepolicy="skip"annotations="javadoc"

time-out="10000"skipfailedinvocationcounts="true" data-provider-thread-count="5"

object-factory="classname"allow-return-values="true"> <!-- name²ÎÊýΪ±ØÐë -->

<suite-files>

<suite-filepath="/path/to/suitefile1"></suite-file> <!-- path²ÎÊýΪ±ØÐë -->

<suite-filepath="/path/to/suitefile2"></suite-file>

</suite-files>

<parametername="par1" value="value1"></parameter> <!-- name, value²ÎÊýΪ±ØÐë -->

<parametername="par2" value="value2"></parameter>

<method-selectors>

<method-selector>

<selector-classname="classname" priority="1"></selector-class><!-- name²ÎÊýΪ±ØÐë -->

<scriptlanguage="java"></script> <!-- language²ÎÊýΪ±ØÐë -->

</method-selector>

</method-selectors>

<testname="testename" junit="false" verbose="3"parallel="false" thread-count="5"annotations="javadoc"

time-out="10000"enabled="true" skipfailedinvocationcounts="true"

preserve-order="true"allow-return-values="true"> <!-- name²ÎÊýΪ±ØÐë -->

<parametername="par1" value="value1"></parameter> <!-- name, value²ÎÊýΪ±ØÐë -->

<parametername="par2" value="value2"></parameter>

<!-- groups:ǰÌáÊÇÐèÒª´æÔÚclassesµÄ×飬·ñÔòËùÓз½·¨²»±»ÔËÐÐ -->

<groups>

<!--define£º¶¨ÒåеÄ×éÃû -->

<definename="group_name"> <!-- name²ÎÊýΪ±ØÐë -->

<!--group_name1Ϊ²âÊÔÀàÖз½·¨µÄAnnotation¶¨ÒåµÄ×éÃû -->

<includename="group_name1" description=""invocation-numbers="" /> <!-- name²ÎÊýΪ±ØÐë -->

<includename="group_name2" description=""invocation-numbers="" />

</define>

<run>

<!-- group_nameΪ²âÊÔÀàÖж¨ÒåµÄ×éÃû»òÕßxmlÖж¨ÒåµÄ×éÃû -->

<includename="group_name" /> <!-- name²ÎÊýΪ±ØÐë -->

<excludename="" /> <!-- name²ÎÊýΪ±ØÐë -->

</run>

<dependencies>

<groupname="" depends-on=""></group> <!--name,depends-on¾ùΪ²ÎÊýΪ±ØÐë -->

<groupname="" depends-on=""></group>

</dependencies>

</groups>

<!-- classesµÄÓ÷¨£¬classesÖаüº¬ÀàÃû£¬ÀàÃûµ×Ï¿ÉÒÔ°üº¬·½·¨Ãû»òÅųý·½·¨Ãû -->

<classes>

<classname="classname"> <!-- name²ÎÊýΪ±ØÐë -->

<methods>

<parametername="par3" value="value3"></parameter>

<includename="method_name" description=""invocation-numbers=""></include>

<excludename="method_name"></exclude>

</methods>

<methods></methods>

</class>

</classes>

<packages>

<packagename="" /> <!-- name²ÎÊýΪ±ØÐë -->

<packagename="">

<includename="" description=""invocation-numbers=""></include>

<excludename=""></exclude>

</package>

</packages>

<listeners>

<listenerclass-name="classname1" /> <!-- name²ÎÊýΪ±ØÐë -->

<listenerclass-name="classname2" />

</listeners>

</test>

<test>

</test>

</suite>

2. ʹÓÃclasses¡¢class±êÇ©½øÐÐÓÃÀý¹ÜÀí

ÔÚclass±êÇ©ÖÐͨ¹ýnameÊôÐÔÉùÃ÷ʵÏÖÁ˲âÊÔ·½·¨µÄÀ࣬һ¸öclasses±êÇ©¿ÉÒÔ°üº¬¶à¸öclass±êÇ©¡£ÔÚclass±êÇ©ÖУ¬»¹¿ÉÒÔͨ¹ýincludeºÍexcludeÉùÃ÷¸ÃÀàÖеı»°üº¬»òÕß±»ÅųýÔÚ²âÊÔÓÃÀýÖеķ½·¨¡£

3. ʹÓÃgroups½øÐÐÓÃÀý¹ÜÀí

¿ÉÒÔÖ¸¶¨test·½·¨ÊôÓÚÄÄЩgroup£¬Ò»¸ö·½·¨¿ÉÒÔÊôÓÚ¶à¸ö·Ö×é¡£·½·¨ÊôÓÚÄĸö·Ö×é¿ÉÒÔÔÚJava´úÂëÖÐͨ¹ýAnnotationÖ¸¶¨£¬ÀýÈ磺

@Test(groups = {"group_name1","group_name2"})

Public void func()

{

}

Ö¸¶¨test·½·¨ËùÊôµÄ·Ö×éÖ®ºó£¬¾Í¿ÉÒÔÔÚtestng.xmlÎļþÖÐÖ¸¶¨ÒªÔËÐеķÖ×飬testng.xmlÎļþÐÞ¸ÄÈçÏ£º

ÆäÖУ¬define±êÇ©±íʾÔÚtestng.xmlÎļþÖиù¾Ý´æÔڵķÖ×éÖØÐ¶¨Òå·Ö×éÃû³Æ£»run±êÇ©¶¨ÒåÒªÔËÐеķÖ×é¡£

×¢£º

TestNGµÄgroup±êÇ©µ¼ÖµÄ@BeforeMethod·½·¨ÎÞЧ£¬ÕâÑù£¬Èç¹ûgroupÀïÃæµÄ·½·¨¶Ô@BeforeMethod·½·¨ÓÐÒÀÀµ£¬¿ÉÄܻᵼÖ´íÎó¡£

½â¾ö·½·¨£º

½«@BeforeMethodÌæ»»Îª@BeforeMethod(alwaysRun = true)£¬»òÕß½«@BeforeMethod·½·¨Ò²·ÅÔÚgroupÖС£

7 ²âÊÔ±¨¸æ

7.1 TestNGµÄ²âÊÔ±¨¸æ

²Î¿¼£º

7.2 ReportNGµÄ±àÒë

ReportNGµÄ¹ÙÍøÉÏÒѾ­ÉêÃ÷²»ÔÙ½øÐÐά»¤£¬µ±Ç°Îȶ¨°æ±¾Îª1.1.4£¬Ô´´úÂëÒѾ­Íйܵ½Github£¬Òò´Ë¿ÉÒÔ¸ù¾ÝÐèÒª½øÐж¨ÖÆ¡£

¸ÃÏîĿΪMaven¹¤³Ì£¬Ã»Óг¢ÊÔ½øÐбàÒë¡£µ«ÊÇEclipse IDE»·¾³ÒѾ­×Ô´øÁËMaven²å¼þ£¬¿ÉÒÔ½øÐÐÏîÄ¿µÄcreateºÍbuild¡£

×¢£ºMavenÏîÄ¿Öкܶàjar°üÊÇÐèÒª´ÓÍøÂçÏÂÔØµÄ¡£

7.3 ReportNGµÄʹÓÃ

ʹÓò½Ö裺

1. ×÷Ϊjar°ü¼ÓÈ빤³ÌµÄbuild·¾¶£»

2. ÔÚtestng.xmlÖеÄsuite±êÇ©ÖÐÌí¼Ólistener£¬ÈçÏ£º

<listeners>

<listener class-name="org.uncommons.reportng.HTMLReporter"/>

<listener class-name="org.uncommons.reportng.JUnitXMLReporter"/>

</listeners>

×¢£º

1. reportNGÐèÒªguiceµÄÖ§³Ö£¬ÏÂÔØµØÖ·£ºhttp://google-guice.googlecode.com/files/guice-3.0.zip

2. reportNGÏÔʾÖÐÎÄʱ»áÓÐÂÒÂ룬½â¾ö·½·¨²Î¿¼£º

3. ²âÊÔÓÃÀýÅÜÍêÖ®ºó£¬¿ÉÒÔÔÚtest-outputĿ¼µÄhtmlÎļþ¼ÐÕÒµ½index.html²âÊÔ±¨¸æ¡£

ReportNG ĿǰÓкܶàȱµã£¬µ«ÊÇÓÉÓÚÌṩÁËÔ´´úÂ룬¿ÉÒÔ¸ù¾ÝÐèÒª×Ô¼º¶¨ÖÆ¡£ÀýÈ磬ÔÚ²âÊÔ±¨¸æÖУ¬³ö´íµÄÓÃÀýµÄ¸ßÁÁÏÔʾû·¨×ö£¬ÐèÒª×Ô¼ºÈ¥ÐÞ¸ÄReportNGÔ´Âë²ÅÄÜʵÏÖ£»ÁíÍ⣬Äã¿ÉÒÔͨ¹ý´úÂëÐ޸ľ²Ì¬µÄhtmlÄ£°åȥʵÏÖ±¨¸æDIY¶¨ÖÆ¡£

8 ʾÀý

Á˽âÁËAppium¡¢TestNGÖ®ºó£¬¾Í¿ÉÒÔ³¢ÊÔ±àд²âÊÔ³ÌÐòÁË¡£ÎĵµÖвâÊÔ´úÂëÔÚGitHubµÄµØÖ·£ºgit@github.com:GitHub-inthewind/CalculatorTestNG.git£¬ÊÇÒ»¸ö»ùÓÚS2µÄCalculator±àдµÄ²âÊÔÓÃÀý³ÌÐò¡£

8.1 ±àд²âÊÔÓÃÀý

1£©´´½¨Java¹¤³Ì

2£©µ¼ÈëLibs£¬°üÀ¨Selenium client¿â£¬SeleniumServer¿â£¬Appium Client¿â£¨¿ÉÒÔÔÚAppiumµÄ¹ÙÍøÉÏÏÂÔØ£¬µØÖ·£ºhttp://appium.io/£©£¬testNG£¬reportNG¿â£»

3£©ÔÚJava¹¤³ÌĿ¼ÏÂн¨appsĿ¼£¬½«Òª²âÊÔµÄAPK·ÅÔÚ¸ÃĿ¼Ï£»

4£©´´½¨class£¬±àд²âÊÔÓÃÀý

public class AndroidCalculatorTestNG {

privateAppiumDriver<AndroidElement> driver;

@BeforeSuite(alwaysRun = true)

public void setUp() throws Exception {

System.out.println("setUp entry");

// setup appium

File classpathRoot = new File(System.getProperty("user.dir"));

File appDir = new File(classpathRoot, "apps");

File app = new File(appDir, "Calculator.apk");

DesiredCapabilities capabilities= new DesiredCapabilities();

//project can run,even if the settings of this following statement is wrong

capabilities.setCapability("deviceName","0a733f0b");

capabilities.setCapability("platformVersion", "4.4.4");

// setthe APK's path

capabilities.setCapability("app", app.getAbsolutePath());

capabilities.setCapability("appPackage", "com.android.calculator2");

capabilities.setCapability("appActivity", "com.android.calculator2.Calculator");

driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

System.out.println("setUp end");

}

@AfterSuite(alwaysRun = true)

public void tearDown() throws Exception {

System.out.println("tearDown entry");

driver.quit();

System.out.println("tearDown end");

}

@Test(groups = {"funcAdd"}, invocationCount = 1)

public void add(){

WebElement num1 = driver.findElementById("digit_1");

num1.click();

WebElement add = driver.findElementById("op_add");

add.click();

WebElement num2 = driver.findElementById("digit_2");

num2.click();

WebElement eq = driver.findElementById("eq");

eq.click();

}

@Test(groups = {"funcSub"})

public void sub(){

WebElement num1 = driver.findElementById("digit_1");

num1.click();

WebElement add = driver.findElementById("op_sub");

add.click();

WebElement num2 = driver.findElementById("digit_2");

num2.click();

WebElement eq = driver.findElementById("eq");

eq.click();

}

}

5£©´´½¨testng.xmlÎļþ

testng.xmlÎļþµÄ´´½¨²½ÖèÇë²Î¿¼TestNGµÄ±àÒëºÍʹÓÃÕ½ڡ£

Èç¹ûÐèÒªÉú³ÉreportNG¸ñʽµÄ²âÊÔ±¨¸æ£¬ÐèÒª¶Ôtestng.xmlÎļþ½øÐÐÐ޸ģ¬ÈçÏ£º

<?xml version="1.0"encoding="UTF-8"?>

<!DOCTYPE suite SYSTEM "http://testng.org

/testng-1.0.dtd">

<suite name="Suite">

<!¡ªÉú³ÉreportNG¸ñʽµÄ²âÊÔ±¨¸æ-->

<listeners>

<listener class-name="org.uncommons.reportng

.HTMLReporter"/>

<listener class-name="org.uncommons.reportng.

JUnitXMLReporter"/>

</listeners>

<test name="Test">

<!¡ª¶Ô²âÊÔÓÃÀý½øÐйÜÀí-->

<groups>

<define name="group-add">

<include name="funcAdd"></include>

</define>

<run>

<include name="group-add"></include>

<exclude name="funcSub"></exclude>

</run>

</groups>

<classes>

<class name="com.lrm.appium.testng.calculator.AndroidCalculatorTestNG">

</class>

</classes>

</test> <!-- Test -->

</suite> <!-- Suite -->

6£©´´½¨AntµÄ¹¹½¨Îļþbuild.xml

BuildÎļþµÄ´´½¨Çë²Î¿¼AntµÄʹÓÃÕ½ڡ£

8.2 ÔËÐвâÊÔÓÃÀý

½«ÊÖ»úÓëPCͨ¹ýUSBÁ¬½Ó£¬ÔÚcmdÖУ¬ÊäÈëappium£¬Æô¶¯Appium£»È»ºóÑ¡Ôñ²âÊÔÏîÄ¿£¬ÓÒ¼ü->Run As->TestNG Test¡£

8.3 Òì³£½â¾ö

1£©ÓÐʱºò»á³öÏÖAppium²âÊÔÓÃÀý³ÌÐò²»ÄÜÔËÐеÄÇé¿ö£¬ÌáʾִÐа²×°appium settings³ÌÐòʧ°Ü£¬´Ëʱ¿ÉÒÔ¿´¿´Á¬½ÓµÄdevicesÊÇ·ñÔÚÏß

2£©ÔËÐгöÏÖNullPointException

ÎÊÌâÅŲ飺

²é¿´WorkSpaceϵÄ.metadataÎļþ¼ÐϵÄ.logÎļþ£¬·¢ÏÖÓÐorg.eclipse.jdt.junitÏà¹ØµÄ´íÎ󣬼ÌÐøÔÚEclipseϲéÕÒÕâ¸öjdt.junitÏà¹ØµÄ²å¼þ£¬ EclipseÏÂȱÉÙorg.eclipse.jdt.junitÏà¹ØµÄ²å¼þ£¬Ôì³ÉÓÃJUnitÔËÐвâÊÔÓÃÀýµÄʱºò£¬±¨¿ÕÖ¸ÕëµÄ´íÎó¡£µ«ÊÇEclipse×Ô´øµÄJUnit×é¼þȷʵÊǰ²×°Á˵ģ¬ÓпÉÄÜÊÇÏÂÔØµÄAndroid¿ª·¢Ì×¼þɾ³ýÁËijЩ¶«Î÷µ¼Ö£¬ÓÚÊÇ´ÓEclipse¹ÙÍøÉÏÏÂÔØEclipse°æ±¾×Ô¼ºÅäÖû·¾³£¬±àÒëÔËÐÐOK¡£

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

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì