导航:首页 > 操作系统 > androiduitest

androiduitest

发布时间:2024-06-22 04:20:21

A. 镐庢牱浣跨敤Appium杩涜孉ndroid镊锷ㄥ寲娴嬭瘯

1銆丷obotium钬斺斿畨鍗撴祴璇曞伐鍏 Robotium鏄瀹夊崜绯荤粺链甯哥敤镄勮嚜锷ㄥ寲娴嬭瘯宸ュ叿锛屽苟涓旀槸涓娆惧厤璐圭殑瀹夊崜UI娴嬭瘯宸ュ叿銆傚畠阃傚悎浜庡悇绉崭笉钖岀殑瀹夊崜鐗堟湰鍙婂叾涓嬭岀増链銆傝蒋浠跺紑鍙戣呯粡甯告妸瀹幂О浣滃畨鍗撱俣obotium鍒涘缓镄勬祴璇曚娇鐢↗ava鍐欑殑銆备簨瀹炰笂锛孯obotium鏄涓涓涓浣撴祴璇曟暟鎹搴撱 浣嗘槸Robotium闇瑕佽姳璐瑰緢闀挎椂闂村姫锷涘幓鍒涘缓娴嬭瘯锛屽氨镀忎负浜呜嚜锷ㄥ寲绋嫔簭鍒涘缓镄勬簮浠g爜銆傚畠涓嶉傚悎浜掑姩镄勮蒋浠剁郴缁燂纴涓嶈兘阌佷綇鍜岃В阌佹櫤鑳芥坠链恒俣obotium娌℃湁璁板綍鍜屾挱鏀惧姛鑳斤纴瀹冧笉鏀鎸佹埅灞忋 2銆丮onkeyRunner钬斺斿畨鍗揂pp娴嬭瘯宸ュ叿 MonkeyRunner鏄链娴佽岀殑链夎嚜锷ㄥ寲锷熻兘镄勫畨鍗撹蒋浠舵祴璇曞伐鍏枫侻onkeyRunner姣旇捣Robotium瑕佷绠绔涓浜涖傚畠骞朵笉澶勭悊婧愪唬镰併傛祴璇曞垱寤烘槸鐢≒ython鍐欑殑锛屽叾涓鍙鑳戒娇鐢ㄨ板綍宸ュ叿锛屼负浜嗗垱寤烘祴璇曘侻onkeyRunner鍙浠ュ湪杩炴帴鐘舵佺殑PC鎴栬呮ā𨰾熷櫒涓婅繍琛屾祴璇曘傚畠链変竴涓搴旂敤绋嫔簭鎺ュ彛鍙浠ユ带鍒舵櫤鑳芥坠链烘垨钥呮ā𨰾熷櫒銆备絾镓嬫満APP娴嬭瘯宸ュ叿镄勬渶澶х己闄锋槸姣忎釜璁惧囬兘瑕佺紪鍐栾剼链銆傚彟涓涓缂洪櫡灏辨槸锛屾疮娆℃祴璇旷▼搴忓彂鐢熸敼鍙樻椂閮借佽皟鏁淬 3銆丷anorex钬斺斿畨鍗揂pp娴嬭瘯宸ュ叿 Ranorex鏄涓涓涓嶉敊镄勮嚜锷ㄥ寲娴嬭瘯宸ュ叿锛屼笉浠呮渶鏂扮増链锛孉ndroid 2.2.浠ヤ笂鐗堟湰閮芥槸鍙浠ョ殑銆俣anorex镄勫ソ澶勫湪浜庡畠链夎︾粏镄勬埅灞忔姤锻娿备粬鍙浠ラ氲繃WiFi涓婄绣杩炴帴鏅鸿兘镓嬫満鎴栬呭钩𨱒跨数鑴戙傞氲繃杩欎釜 android 宸ュ叿锛岃嚜锷ㄥ寲镄勬祴璇曞伐绋嫔笀鍙浠ヨ︾粏鎻忚堪鏁版嵁椹卞姩娴嬭瘯锛屼絾涓嶅寘𨰾 XML 鏁版嵁镙煎纺銆俣anorex鍙浠ュ緢杞绘涧鍦板垱寤烘祴璇曪纴镊锷ㄥ寲娴嬭瘯宸ョ▼甯埚彧闇镣瑰嚮榧犳爣銆俣anorex鍏佽搁梼锷犵殑绋嫔簭妯″潡銆傝繖涓妯″潡鍙浠ヨ鐢ㄤ簬寮鍙戞洿涓哄嶆潅镄勬祴璇曞満鏅涓銆俣anorex鏄涓涓鍟嗕笟鍖栫殑绉诲姩搴旂敤绋嫔簭镄勫伐鍏;鍏惰稿彲浠锋牸鏄 1990娆у厓/骞淬俣anorex鎼灭储鐩稿綋鎱;瀹冮渶瑕 30 绉掔殑镞堕棿𨱒ユ墽琛屾搷浣溿傚叾涓涓涓蹇呴’涓篟anorex鏂囦功镄 APK 鏂囦欢𨰾呜愩傚惁鍒椤畠涓嶈兘阃氲繃杩欎釜宸ュ叿杩涜岃嚜锷ㄥ寲娴嬭瘯锛屽畠鍙鑳藉湪APK 鏂囦欢涓嫔伐浣溿 4銆丄ppium钬斺斿畨鍗撹嚜锷ㄥ寲娴嬭瘯宸ュ叿 Appium鏄涓篿OS鍜屽畨鍗撶郴缁熷垱寤虹殑镊锷ㄥ寲娴嬭瘯妗嗘灦锛屾槸涓涓鍏嶈垂宸ュ叿銆傚畠鏀鎸 2.3 鍙婃洿楂樼増链镄 Android 绯荤粺銆侫ppium鍒╃敤WebDriver鐣岄溃杩愯屾祴璇曘傚畠鏀鎸佽稿氱紪绋嬭瑷锛屽 java銆 C#銆丷uby鍜屽叾浠栫殑WebDriver鏁版嵁搴撱傚畠鍙浠ュ湪绉诲姩璁惧囦笂鎺у埗 Safari 鍜孋hrome銆备絾鏄锛屼竴浜涜嚜锷ㄥ寲镄勬祴璇曞伐绋嫔笀鎶辨ㄥ畠鎻愪緵镄勬姤锻娄笉瓒炽傚畠镄勭己镣逛篃鍑忓皯浜嗗逛簬XPath鍦ㄧЩ锷ㄨ惧囦笂镄勬敮鎸併 5銆乁I Automator钬斺斿畨鍗撹嚜锷ㄥ寲娴嬭瘯 璋锋瓕链杩戞帹鍑轰简杩欎竴宸ュ叿銆傚畠鏀鎸佷粠4.1寮濮嬬殑瀹夊崜鐗堟湰銆傛垜浠搴旇ラ夋嫨鍙︿竴涓镟存棭链熺殑瀹夊崜搴旂敤绋嫔簭杩涜岃嚜锷ㄥ寲娴嬭瘯銆俇I Automator鑳藉熶笌钖勭被瀹夊崜绯荤粺鍏煎癸纴鍖呮嫭绯荤粺镄勫簲鐢ㄧ▼搴忋傝繖浣垮缑镞佹瘉UI Automator鍙浠ラ挛瀹氩拰瑙i挛鏅鸿兘镓嬫満鎴栧钩𨱒跨数鑴戙傞氲繃璇ュ伐鍏峰垱寤虹殑鑴氭湰鍙浠ュ湪璁稿氢笉钖岀殑瀹夊崜骞冲彴涓婃墽琛屻傚畠鍏佽稿嶅埗鐢ㄦ埛镄勬搷浣滃嶆潅镄勫簭鍒椼俇I Automator涔熷彲浠ュ埄镞呭惎鏄ョ敤澶栭儴鎸夐挳镄勮呯疆璋冭妭锛屾墦寮鍜屽叧闂璁惧囩殑鎸夐挳銆 UI Automator鍙浠ヤ笌娴嬭瘯妗嗘灦TestNG闆嗘垚銆傚湪杩欑嶆儏鍐典笅锛岀敤鎴风晫闱㈣嚜锷ㄥ彲浠ョ敓鎴愬唴瀹逛赴瀵屽拰璇︾粏镄勬姤锻婏纴绫讳技浜庣敱Ranorex鐢熸垚镄勬姤锻娿傛ゅ伐鍏锋悳绱㈤熷害杩橀潪甯稿揩銆傚湪璁稿氩畨鍗揿钩鍙颁笂娴嬭瘯钖庯纴杞浠舵祴璇曚笓瀹惰や负UI Automator鏄璐ㄩ噺链濂界殑绉诲姩搴旂敤绋嫔簭銆傚畠鏄瀹夊崜锅氩ソ镄勫簲鐢ㄧ▼搴忎箣涓锛屽畠鐢辫胺姝屾帹鍑恒 阃氩父澶х害 80%镄勬柊杞浠剁殑 bug 閮戒细閲岖幇鏀鎸佺殑骞冲彴銆傚叾浣 20%鍑虹幇鍦ㄥ叾浠栧钩鍙颁笂銆傝繖镒忓懗镌锛屽湪澶у氭暟𨱍呭喌涓嬶纴浜嫔厛娴嬭瘯杞浠朵骇鍝佹瘆鐩茬洰浣跨敤镟村ソ銆 鐩鍓嶏纴 Android 4.1 鐗堟湰瀹夎呬简绾 66%镎崭綔绯荤粺镄勮惧囥傝繖灏辨槸涓轰粈涔堣稿氲嚜锷ㄥ寲镄勬祴璇曞伐绋嫔笀缁忓父鍐冲畾UI Automator鏄链钖堥傜殑瑙e喅鏂规堛

B. android app自动化测试工具有哪些

1、Monkey是AndroidSDK自带的测试工具,在测试过程中会向系统发送伪随机的用户事件流,如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试,也有日志输出。实际上该工具只能做程序做一些压力测试,由于测试事件和数据都是随机的,不能自定义,所以有很大的局限性。2、MonkeyRunner也是AndroidSDK提供的测试工具。严格意义上来说MonkeyRunner其实是一个Api工具包,比Monkey强大,可以编写测试脚本来自定义数据、事件。缺点是脚本用python来写,对测试人员来说要求较高,有比较大的学习成本。3、Instrumentation是早期Google提供的Android自动化测试工具类,虽然在那时候JUnit也可以对Android进行测试,但是Instrumentation允许你对应用程序做更为复杂的测试,甚至是框架层面的。通过Instrumentation你可以模拟按键按下、抬起、屏幕点击、滚动等事件。Instrumentation是通过将主程序和测试程序运行在同一个进程来实现这些功能,你可以把Instrumentation看成一个类似Activity或者Service并且不带界面的组件,在程序运行期间监控你的主程序。缺点是对测试人员来说编写代码能力要求较高,需要对Android相关知识有一定了解,还需要配置AndroidManifest.xml文件,不能跨多个App。4、UiAutomator也是Android提供的自动化测试框架,基本上支持所有的Android事件操作,对比Instrumentation它不需要测试人员了解代码实现细节(可以用UiAutomatorviewer抓去App页面上的控件属性而不看源码)。基于Java,测试代码结构简单、编写容易、学习成本,一次编译,所有设备或模拟器都能运行测试,能跨App(比如:很多App有选择相册、打开相机拍照,这就是跨App测试)。缺点是只支持SDK16(Android4.1)及以上,不支持HybirdApp、WebApp。5、Espresso是Google的开源自动化测试框架。相对于Robotium和UIAutomator,它的特点是规模更小、更简洁,API更加精确,编写测试代码简单,容易快速上手。因为是基于Instrumentation的,所以不能跨App。配合AndroidStudio来编写测试的简单例子6、Selendroid:也是基于Instrumentation的测试框架,可以测试NativeApp、HybirdApp、WebApp,但是网上资料较少,社区活跃度也不大。7、Robotium也是基于Instrumentation的测试框架,目前国内外用的比较多,资料比较多,社区也比较活跃。缺点是对测试人员来说要有一定的Java基础,了解Android基本组件,不能跨App。8、Athrun是淘宝出的一个移动测试框架/平台,同时支持iOS和Android。Android部分也是基于Instrumentation,在Android原有的类基础上进行了扩展,提供一整套面向对象的API。这里有详细介绍。9、Appium是最近比较热门的框架,社区也很活跃。这个框架应该是是功能最强大的,它的优点:它的哲理是:它的设计理念:相关限制:总结:在iOS部分是封装了UIAutomation;Android4.2以上是用UiAutomator,Android2.3~4.1用的是Instrumentation,也就说Appium同时封装了UiAutomator和Instrumentation。所以Appium拥有了以上几大框架的所有优点:跨App,支持NativeApp、HybirdApp、WebApp,还支持N种语言来编写你的测试脚本。如果你在Windows使用Appium,你没法使用预编译专用于OSX的.app文件,因为Appium依赖OSX专用的库来支持iOS测试,所以在Windows平台你不能测试iOSApps。这意味着你只能通过在Mac上来运行iOS测试。Client/Server架构,运行的时候Server端会监听Client端发过来的命令,翻译这些命令发送给移动设备或模拟器,然后移动设备或模拟器做出响应的反应。正是因为这种架构,所以Client可以使用Appiumclientlibraries多种语言的测试脚本,而且Server端完全可以部署在服务器上,甚至云服务器。Session,每个Client连接到Server以后都会有一个SessionID,而且Client发送命令到Server端都需要这个SessionID,因为这个seesionid代表了你所打开的浏览器或者是移动设备的模拟器。所以你甚至可以打开N个Session,同时测试不同的设备或模拟器。DesiredCapabilities,其实就是一个键值对,设置一些测试的相关信息来告诉Server端,我们需要测试iOS、还是Android,或者换是WebApp等信息。AppiumServer是Node.js写的,所以可以直接用NPM来进行安装。AppiumClients,MacOS和Win下提供GUI,不需要装Node.js,方便测试人员操作。用Appium自动化测试不需要重新编译App;支持很多语言来编写测试脚本,Java、Javascript、PHP、Python、C#、Ruby等主流语言;不需要为了自动化测试来重造轮子,因为扩展了WebDriver。(WebDriver是测试WebApps的一种简单、快速的自动化测试框架,所以有Web自动化测试经验的测试人员可以直接上手);移动端自动化测试应该是开源的;开源;支持NativeApp、HybirdApp、WebApp;支持Android、iOS、FirefoxOS;Server也是跨平台的,你可以使用MacOSX、Windows或者Linux;

C. 如何设计Android App测试用例

一般安卓开发者在其日常工作中面临的最大挑战之一是:终端设备和[url=]操作系统[/url]版本的范围太广。OpenSignal进行的一项研究表明,2013年7月市场上有超过11,828的不同安卓终端设备,所有设备在类型/大小/屏幕分辨率以及特定配置方面有所不同。考虑到前一年的调查仅记录有3,997款不同设备,这实在是一个越来越大的挑战障碍。

从一个移动APP开发角度出发,定义终端设备有四个基本特征:
1.操作系统:由“API指标”( 1 ~18 )专业定义的安卓操作系统版本( 1.1~ 4.3 ),。
2.显示器:屏幕主要是由屏幕分辨率(以像素为单位),屏幕像素密度( 以DPI为单位),和/或屏幕尺寸(以英寸为单位)定义的。
3.CPU:该“应用程序二进制接口” (ABI )定义CPU的指令集。这里的主要区别是ARM和基于Intel的CPU。
4.内存:一个设备包括内存储器( RAM)和Dalvik 虚拟存储器( VM堆)的预定义的堆内存。
这是前两个特点,操作系统和显示器,都需要特别注意,因为他们是直接由最终用户明显感受,且应该不断严格地被测试覆盖。至于安卓的版本, 2013年7月市场上有八个同时运行导致不可避免的碎片的不同版本。七月,近90%这些设备中的34.1 %正在运行Gingerbread版本( 2.3.3-2.3.7 ),32.3 %正在运行Jelly Bean( 4.1.x版),23.3 %正在运行Ice Cream Sandwich( 4.0.3 - 4.0.4 )。

考虑设备显示器,一项TechCrunch从2013年4月进行的研究显示,绝大多数(79.9%)有效设备正在使用尺寸为3和4.5英寸的“正常”屏幕。这些设备的屏幕密度在“MDPI”(~160 DPI),“hdpi”(~240 DPI)和“xhdpi”(~320 DPI)之间变化。也有例外, 一种只占9.5%的设备屏幕密度低“hdpi”(~120 DPI)且屏幕小。

如果这种多样性在质量保证过程中被忽略了,那么绝对可以预见:bugs会潜入应用程序,然后是bug报告的风暴,最后Google Play Store中出现负面用户评论。因此,目前的问题是:你怎么使用合理水平的测试工作切实解决这一挑战?定义测试用例及一个伴随测试过程是一个应付这一挑战的有效武器。

用例—“在哪测试”、“测试什么”、“怎么测试”、“何时测试”?
“在哪测试”
为了节省你测试工作上所花的昂贵时间,我们建议首先要减少之前所提到的32个安卓版本组合及代表市场上在用的领先设备屏的5-10个版本的显示屏。选择参考设备时,你应该确保覆盖了足够广范围的版本和屏幕类型。作为参考,您可以使用OpenSignal的调查或使用手机检测的信息图[3],来帮助选择使用最广的设备。
为了满足好奇心,可以从安卓文件[5]将屏幕的尺寸和分辨率映射到上面数据的密度(“ldpi”,“mdpi”等)及分辨率(“小的”,“标准的”,等等)上。

有了2013手机检测研究的帮助,很容易就找到了代表性的一系列设备。有一件有趣的琐事:30%印度安卓用户的设备分辨率很低只有240×320像素,如上面列表中看到的,三星Galaxy Y S5360也在其中。另外,480×800分辨率像素现在最常用(上表中三星Galaxy S II中可见)。

“测试什么”
移动APP必须提供最佳用户体验,以及在不同尺寸和分辨率(关键字“响应式设计”)的各种智能手机和平板电脑上被正确显示(UI测试)。与此同时,apps必须是功能性的和兼容的(兼容性测试),有尽可能多的设备规格(内存,CPU,传感器等)。加上先前获得的“直接”碎片化问题(关于安卓的版本和屏幕的特性), “环境相关的”碎片化有着举足轻重的作用。这种作用涉及到多种不同的情况或环境,其中用户正在自己的环境中使用的终端设备。作为一个例子,如果网络连接不稳定,来电中断,屏幕锁定等情况出现,你应该慎重考虑压力测试[4]和探索性测试以确保完美无错。

有必要提前准备覆盖app最常用功能的所有可能的测试场景。早期bug检测和源代码中的简单修改,只能通过不断的测试才能实现。

“怎么测试”
将这种广泛的多样性考虑在内的一种务实方法是, 安卓模拟器 - 提供了一个可调节的工具,该工具几乎可以模仿标准PC上安卓的终端用户设备。简而言之,安卓模拟器是QA流程中用各种设备配置(兼容性测试)进行连续回归测试(用户界面,单元和集成测试)的理想工具。探索性测试中,模拟器可以被配置到一个范围广泛的不同场景中。例如,模拟器可以用一种能模拟连接速度或质量中变化的方式来设定。然而,真实设备上的QA是不可缺少的。实践中,用作参考的虚拟设备依然可以在一些小的(但对于某些应用程序来说非常重要)方面有所不同,比如安卓操作系统中没有提供程序特定的调整或不支持耳机和蓝牙。真实硬件上的性能在评价过程中发挥了自身的显着作用,它还应该在考虑了触摸硬件支持和设备物理形式等方面的所有可能终端设备上进行测试(可用性测试)。

“何时测试”
既然我们已经定义了在哪里(参考设备)测试 ,测试什么(测试场景),以及如何( 安卓模拟器和真实设备)测试,简述一个过程并确定何时执行哪一个测试场景就至关重要了。因此,我们建议下面的两级流程:
1 .用虚拟设备进行的回归测试。
这包括虚拟参考设备上用来在早期识别出基本错误的连续自动化回归测试。这里的理念是快速地、成本高效地识别bugs。
2 .用真实设备进行的验收测试。
这涉及到:“策划推广”期间将之发布到Google Play Store前在真实设备上的密集测试(主要是手动测试),(例如,Google Play[ 5 ]中的 alpha和beta测试组) 。
在第一阶段,测试自动化极大地有助于以经济实惠的方式实现这一策略。在这一阶段,只有能轻易被自动化(即可以每日执行)的测试用例才能包含在内。
在一个app的持续开发过程中,这种自动化测试为开发人员和测试人员提供了一个安全网。日常测试运行确保了核心功能正常工作,app的整体稳定性和质量由测试数据透明地反映出来,认证回归可以轻易地与最近的变化关联。这种测试可以很轻易地被设计并使用SaaS解决方案(如云中的TestObject的UI移动app测试)从测试人员电脑上被记录下来。
当且仅当这个阶段已被成功执行了,这个过程才会在第二阶段继续劳动密集测试。这里的想法是:如果核心功能通过自动测试就只投入测试资源,使测试人员能够专注于先进场景。这个阶段可能包括测试用例,例如性能测试,可用性测试,或兼容性测试。这两种方法相结合产生了一个强大的移动apps质量保证策略[ 7 ] 。

结论 - 做对测试
用正确的方式使用,测试可以在对抗零散的安卓的斗争中成为一个有力的工具。一个有效的测试策略的关键之处在于定义手头app的定制测试用例,并定义一个简化测试的工作流程或过程。测试一个移动app是一个重大的挑战,但它可以用一个结构化的方法和正确的工具集合以及专业知识被有效解决掉。

D. 如何一步步实现AndroidCI

一步步实现Android CI

Android上的CI构建链与其它平台一致,依然包含Compilation, Testing, Inspection,
Deploying阶段,每一个阶段的Feedback的都保持对整个团队透明。

2、添加Function Test


Android为大家提供了一套集成测试框架Android integration testing
framework。但此框架未集成Cucumber,这导致每增加一个Function Test都需要较大的开发和维护工作。这样高成本的实现Function
Test将大大延缓开发进度,最终因为项目进度的原因导致Function Test被丢弃。产生这样的后果那必然是不愿意看到的。


目前Android平台下已经出现多种Functiong Testing测试工具,如Native Driver, Robotium,
Calabash等。在尝试对比后,最终选择了Calabash Android作为解决方案。Calabash
Android是Cucumber在Android平台的实现,使用Ruby书写Function Test,并提供了一组操作Anadroid App元素的API。

3、添加UI Test


Android在新近退出了UI测试工具UIAutomator。此工具仅支持Android4.1及以上平台,鉴于目前市场上2.3和4.0版本仍占主导的情况来看,目前还无法满足大家的需要。另外应用该工具实现UI测试的开发成本还较高,笔者暂不推荐使用此工具,但应该关注其发展。


另外基于录制回放机制的测试方法同样可以进行UI测试。但录制回放的方法在面对功能快速迭代时,维护工作会急剧增加,而这个维护成本可以说是很难承受的,所以在此也不会将这种测试方法集成至CI中。


目前来看Android中UI测试还无令人满意的方法。若对UI成功比较看重,可以投入精力应用UIAutomator进行UI测试。

Best Practice:


*
将测试按照单元测试,组件测试,功能测试和系统测试进行划分。单元测试应该在每次提交时触发执行,其它的测试根据运行时间长短和重要程度可以每次提交触发执行或者定时周期执行。


* 将运行较快的测试优先执行。


* 让功能测试能够重复执行。否则维护成本太高,会被舍弃。若是后台数据导致不可重复,可以将数据抽象成为数据集,在每次运行前进行重置。


* 书写测试时每一个assert只做一种判断,这样可以明确每次测试的目的,并且可以快速定位测试失败愿意。

步骤 3:持续检查持续检查是对于代码本身检测和反馈。检测主要通过对代码静态分析验证代码风格,编程规范,代码复用,代码语言中的Best Practice等多个维度的代码质量。

Sonar作为一个开源的代码质量检测工具,涵盖了7项代码质量检测方式。这充分满足Android平台下对于代码质量的检测分析。Sonar分为两部分一部分是代码分析工具,另一部分是数据分析展示的Server。

Best Practice:


* 将测试覆盖率,代码分析结果透明化


* 持续降低代码复杂度


* 持续的促进设计的演进


* 持续的维护代码结构


* 持续减少代码重复

步骤 4:持续部署


由于Android App采用用户手动从Appstore自行下载安装的方式发布,使得Android
App无法直接部署至用户手机中。另外Appstore需要对于上线的App进行审核,不能持续进行Release。因而Android中持续部署将以持续发布可安装包为目标。


在以上目的下,只需根据自身项目资源找到合适的安装包管理工具即可。如本文采用Dropbox来管理所有安装包。


Dropbox作为一个云存储平台,在Android终端设备上可以轻松下载存放在其中的文件,同时上传安装包也可以交由Dropbox自己完成。

步骤 5:持续反馈


反馈是所有改进的开始,必须要让所有人获取到他们所关心的反馈信息,才能实施改进。持续反馈的目的就是让所有人都掌握项目健康状况。项目所有人事实都是有意愿知道项目当前的健康状况的,那CI就应该将项目的情况做到透明,并将不同的反馈通知到各相关的成员。


CI不同阶段产生了不同维度的反馈,如单元测试报告,测试覆盖率等。本实践中将这些反馈都透明的展示在项目首页中。之所以没有将这些反馈再以邮件的方式通知所有人,是因为团队成员已经养成了查看CI的习惯。


如果说只给所有人发一封邮件说明项目状况,那必然是告诉所有人“CI所有步骤是否都返回正确?”。这样一个反馈,包含了编译正确,所有测试通过,安装包已经准备完毕等重要信息。有必要让所有人都知道这个信息,特别是在CI执行失败的时候。Jenkins自身已经提供一个简单有效的透明化方法,以项目为蓝色表示通过,红色表示有步骤失败。


反馈的通知方式有很多种,不一定要采用邮件通知的方式。可以寻找更加有趣的方式,如果播放音乐和设置警报灯。在每一次Build成功或失败后都播放一段有趣的音乐,打开不同颜色的警报灯,这两种方法都是是一种简单有效的方式,可以让项目所有人都获取到最为关键的信息。

E. 做Android手机软件测试需要掌握哪些工具

请注意测试本身不是靠工具的而是靠设计,这是我的理念,所以我一向觉得,很多人认为做测试做的好就是靠掌握一门好的工具,这个观点是不正确的,所以我可以负责任的告诉你,做Android手机需要掌握的不是工具、而是理念、思维、以及框架,总的来说是本质,而工具只是辅助,那么现在我来介绍一些我了解的工具(仅仅是了解,很多没用过)
开源 Android 软件测试工具包括:Android Test Kit, AndroidJUnit4, Appium, calabash-android, Monkey, MonkeyTalk, NativeDriver, Robolectric, RoboSpock, Robotium, UIAutomator, Selendroid。
Android Test Kit
Android Test Kit 是一组 Google 开源测试工具,用于 Android 平台,包含 Espresso API 可用于编写简洁可靠的 Android UI 测试。
AndroidJUnit4
AndroidJUnit4 是一个让 JUnit 4 可以直接运行在 Android 设备上的开源命令行工具。
Appium
Appium 是一个开源、跨平台的自动化测试工具,用于测试原生和轻量移动应用,支持 iOS, Android 和 FirefoxOS 平台。Appium 驱动苹果的 UIAutomation 库和 Android 的 UiAutomator 框架,使用 Selenium 的 WebDriver JSON 协议。Appinm 的 iOS 支持是基于 Dan Cuellar's 的 iOS Auto. Appium 同时绑定了 Selendroid 用于老的 Android 平台测试。
Calabash-android
calabash-android 是一个基于 Cucumber 的 Android 的功能自动化测试框架。Calabash 允许你写和执行,是开源的自动化移动应用测试工具,支持 Android 和 iOS 原生应用。Calabash 的库允许原生和混合应用的交互测试,交互包括大量的终端用户活动。Calabash 可以媲美 Selenium WebDriver。但是, 需要注意的是 web 应用和桌面环境的交互跟触摸屏应用的交互是不同的。Calabash 专为触摸屏设备的原生应用提供 APIs。
Monkey
Monkey 是 Google 开发的 UI/应用测试工具,也是命令行工具,主要针对压力测试。你可以在任意的模拟器示例或者设备上运行。Monkey 发送一个用户事件的 pseudo-random 流给系统,作为你开发应用的压力测试。
MonkeyTalk
MonkeyTalk 是世界上最强大的移动应用测试工具。MonkeyTalk 自动为 iOS 和 Android 应用进行真实的,功能性交互测试。MonkeyTalk 提供简单的 "smoke tests",复杂数据驱动的测试套件。MonkeyTalk 支持原生,移动和混合应用,真实设备或者模拟器。MonkeyTalk 使得场景捕获非常容易,可以记录高级别,可读的测试脚本。同样的命令可以用在 iOS 和 Android 应用上。你可以记录一个平台的一个测试,并且可以在另外一个平台回放。MonkeyTalk 支持移动触摸和基于手势交互为主的移动体验。点击,拖拽,移动,甚至是手指绘制也可以被记录和回放。
NativeDriver
NativeDriver 是 WebDriver API 的实现,是原生应用 UI 驱动,而不是 web 应用。
Robolectric
Robolectric 是一款Android单元测试框架,使用 Android SDK jar,所以你可以使用测试驱动开发 Android 应用。测试只需几秒就可以在工作站的 JVM 运行。Robolectric 处理视图缩放,资源加载和大量 Android 设备原生的 C 代码实现。Robolectric 允许你做大部分真实设备上可以做的事情,可以在工作站中运行,也可以在常规的 JVM 持续集成环境运行,不需要通过模拟器。
RoboSpock
RoboSpock 是一个开源的 Android 测试框架。提供简单的编写 BDD 行为驱动开发规范的方法,使用Groovy 语音,支持 Google Guice 库。RoboSpock 合并了 Robolectric 和 Spock 的功能。
Robotium
Robotium 是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长 按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。Robotium结合Android官方提供的测试框架达到对应用程序进行自动化的测 试。另外,Robotium 4.0版本已经支持对WebView的操作。Robotium 对Activity,Dialog,Toast,Menu 都是支持的。
UIAutomator
uiautomator 测试框架提高用户界面(UI)的测试效率,通过自动创建功能 UI 测试示例,可以在一个或者多个设备上运行你的应用。
Selendroid
Selendroid 是一个 Android 原生应用的 UI 自动化测试框架。测试使用 Selenium 2 客户端 API 编写。Selendroid 可以在模拟器和实际设备上使用,也可以集成网格节点作为缩放和并行测试。

F. 用android uiautomator做自动化测试,怎么连接真机进行

Google在sdk4.0以后提供了一个自动化解决方案uiautomator:

优点:可以跨应用了;这可是亲生的;

缺点:必须sdk4.0以上版本;要想实现的好,最好有开发配合;java项目编译为jar后需要push到手机才能运行,也就是说必须打印日志暴力调试。

Appium基于Android InstrumentationFramework和UIAutomator,也就是说这个工具是可以跨应用的。说远了,好吧,为了帮大家更容易理解appium的使用,我这里就讲一下uiautomator的使用方法。

你应该有android-sdk吧,升级到4.0以上,进入目录android-sdk ools,你会看到两个文件:

traceview.bat 和 uiautomatorviewer.bat,这俩文件让你想起了monkeyrunner了吧,是的,traceview.bat就对应于hierarchyviewer.bat,用来查看程序的ui界面的,通常也是使用管理员权限启动的。

好了,现在用eclipse创建一个java project,是的,你没看错,是java project不是android project,添加引用:

在project.properties中内容为:

# Project target.

target=android-16

这里的android-16需要和之前的android.jar和uiautomator.jar位置相一致。

然后呢?写代码吧,建立一个类,得,发个给大家参考:

packagecom.uia.example.my;

importorg.apache.http.util.EncodingUtils;

importandroid.graphics.Bitmap;

importandroid.graphics.BitmapFactory;

importandroid.graphics.Rect;

importandroid.os.Environment;

importcom.android.uiautomator.core.UiObject;

importcom.android.uiautomator.core.UiObjectNotFoundException;

importcom.android.uiautomator.core.UiScrollable;

importcom.android.uiautomator.core.UiSelector;

importcom.android.uiautomator.testrunner.UiAutomatorTestCase;

importjava.io.File;

importjava.io.FileOutputStream;

importjava.io.IOException;

{

publicStringsLog;

publicFilefout=null;

=null;

publicvoidwrite2file(String filename,String sData)

{

String sLog="";

//初始化日志文件

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

sLog = Environment.getExternalStorageDirectory().getAbsolutePath();

try{

fout=newFile(sLog,filename);

outStream=newFileOutputStream(fout,true);//此处的true是append

sData=sData +" ";

outStream.write(sData.getBytes());

outStream.flush();

outStream.close();

fout=null;

}

catch(Exception e){

e.printStackTrace();

}

}else{

System.out.println("该手机没有SD卡");

}

}

publicvoidtestDemo() {

//1.启动app

getUiDevice().pressHome();

UiObject allAppsButton =newUiObject(newUiSelector().description("Apps"));

allAppsButton.clickAndWaitForNewWindow();

UiObject appsTab =newUiObject(newUiSelector().text("Apps"));

appsTab.click();

UiScrollable appViews =newUiScrollable(newUiSelector().scrollable(true));

UiObject settingsApp = appViews.getChildByText(newUiSelector().className(android.widget.TextView.class.getName()),"Efilm");

settingsApp.clickAndWaitForNewWindow();

//2.进入主界面

System.out.println("into main view");

System.out.println(getUiDevice().waitForWindowUpdate("com.eshore.efilm", 60000));

System.out.println("intoed main view");

UiObject tv1 =newUiObject(newUiSelector().text("影院"));

tv1.click();

//3.点击影院

UiObject oyy=newUiObject(newUiSelector().description("cinema_row"));

System.out.println("wait yingyuan come out");

oyy.waitForExists(60000);

System.out.println("yingyuan come out");

oyy.clickAndWaitForNewWindow();

System.out.println("click yingyuan");

//4.场次

UiObject occ=newUiObject(newUiSelector().description("LinearLayout10"));

System.out.println("wait changci come out");

oyy.waitForExists(60000);

System.out.println("changci come out");

occ.clickAndWaitForNewWindow();

System.out.println("click changci");

//5.座位

UiObject oseat=newUiObject(newUiSelector().description("cinema_shows_list_item").index(0).childSelector(newUiSelector().description("LinearLayout10")));

System.out.println("wait seat come out");

oseat.waitForExists(5000);

inth=getUiDevice().getDisplayHeight();

intw=getUiDevice().getDisplayWidth();

System.out.println("(h/2,w/2)="+h/2+","+w/2);

getUiDevice().click(h/2,w/2);

//System.out.println("seat count:"+String.valueOf(oseat.getChildCount()));

//System.out.println("seat getText:"+ oseat.getText());

//截座位图

Process process;

try{

process = Runtime.getRuntime().exec("screencap /mnt/sdcard/EfilmFailSnapShot01.png");

try{

process.waitFor();

}catch(InterruptedException e) {//TODOAuto-generated catch block

e.printStackTrace();

}

}catch(IOException e) {

//TODOAuto-generated catch block

e.printStackTrace();

}

//takeScreenShots("EfilmSeatSnapShot");

}

}

这个例子是随便写的,可能不够严谨。大体就这么个情况吧。下一步就是编译执行了,先插上手机usb接口,然后打开cmd,执行:

找到SDKID,也就是android create中的-t参数:

cd C: PROGRAMandroid-sdk ools

android list

找到t参数的值以后:

cd C: PROGRAMandroid-sdk ools

android create uitest-project -n TAppWorkAssistV1 -t 25 -p C:android自动化Tv2.0TestSetting

cd C:android自动化Tv2.0TestSetting

ant build

cd C:android自动化Tv2.0TestSettingin

adb push TAppWorkAssistV1.jar /data/local/tmp/

adb shell uiautomator runtest TAppWorkAssistV1.jar -c com.uia.example.my. TAppWorkAssistV1

看了看,好像没有什么特别值得解释的

-n TAppWorkAssistV1:类名

-p: 项目所在目录

Ant build 把这个类编译成一个jar包:TAppWorkAssistV1.jar

然后把jar包push到手机上,调用执行这个类就可以了

大致是这么个步骤,不过有一个非常重要的细节,就是如果你需要更省心,就最好把界面元素,无论动态的还是布局文件中的,都加上content-description属性,并保证唯一性,根据:

UiSelector:description(String desc)

Set the search criteria to match thecontent-description property for a widget.

那就可以统一只使用这一个引用界面元素的方法就行了,就不用去想方设法利用其它的属性来引用了。

G. android 镐庝箞鍗旷嫭娴嬭瘯ctsuirenderingtestcases

android涓嬩篃鏄鍙浠ョ殑锛屾疮涓宸ョ▼镄勫惎锷ㄩ”閮芥灊鎼沧槸涓涓猘ctivity锛屼綘鍙瑕佹妸activity镄勬帴鍙g暀鍑烘潵(鍏跺疄涓嶉渶瑕佺暀鍑烘潵锛屽洜涓哄惎锷ㄤ竴涓猘ctivity鍙闇瑕乻tartactivity()鏂规硶灏卞彲浠ヤ简)锛氢緥濡备綘𨱍宠佷竴涓绋嫔簭閲岄溃镞㈡湁璁$畻鍣锛屽张链夐槄璇伙纴浣犲彲浠ュ缓绔嬩竴涓猘ctivity锛岃繖涓猘ctivity閲岄溃链変袱涓鎸夐挳锛屼竴涓鏄寮钖璁$畻鍣锛屼竴涓鏄寮钖阒呰伙纴鍒嗗埆鎸囧悜鐩稿簲镄勭▼搴忥纴娲炵粷杩欐牱锛屼綘镄勪竴涓宸ョ▼灏卞惈链夊氢釜鍗旷嫭镄勫簲鐢ㄧ▼搴忎简鍟娿 妤间富锛屼唬镰佹槸姝荤殑锛岀▼搴忔槸缁欎汉鐢ㄧ殑锛屾垜浠闇瑕佸仛镄勬槸镙规嵁姝荤殑浠g爜锅氩嚭娲荤撼鎼濮跨殑涓滆タ𨱒ワ纴锷犳补锛1

H. android如何产生随机数

android产生随机数的方法:此方法通过把当前时刻长整型数传给Random对象,让它产生的值随着时间而变化。

[java] view plain
Strings = "";
Random ran =new Random(System.currentTimeMillis());
for (inti = 0; i < 10; i++) {
s =s + "\n" + ran.nextInt(100);
}
Toast.makeText(UiTestActivity.this,"Random: \n" + s, Toast.LENGTH_LONG).show();

I. 如何使用python做android的自动化测试

开始第一个简单的Android UI自动化测试
1.使用adb命令连接真机或模拟器
2.打开uiautomatorviewer工具
3.使用uiautomatorviewer工具获取应用的元素进行定位
4.简单介绍unittest框架的使用方法
5.使用Python编写猫宁考勤应用注册模块的自动化测试
1.使用adb命令连接真机或模拟器:
手机USB连接电脑,进入开发者模式;
cmd命令:adb devices ,查看手机是否连接
这里写图片描述
显示错误
这是因为adb的端口被占用,我们需要查看是什么应用占用了这个端口(5037为adb默认端口)
cmd命令 : netstat -aon|findstr “5037”
这里写图片描述
可以看到占用5037端口对应的程序的PID号为8388;
cmd命令 : tasklist|findstr “8388”
这里写图片描述
可以看出8388对应的程序为kadb.exe,说明该程序正在使用5037端口;
这时我们需要在任务管理器中结束kadb.exe进程,按快捷键“Ctrl+Shift+Esc”调出Windows任务管理器,找到“kadb.exe”,单击下方的结束进程即可!
这里写图片描述
我们再次运行cmd命令:adb devices
这里写图片描述
这一步成功后我们才能运行sdk自带的uiautomatorviewer;
我们需要用uiautomatorviewer工具来获取元素,用于定位。
cmd命令:uiautomatorviewer,打开uiautomatorviewer界面
这里写图片描述
或者找到sdk目录:sdk\tools中找到uiautomatorviewer.bat文件双击运行
这里写图片描述
2.打开uiautomatorviewer工具
这里写图片描述
我们可以根据text,resource-id,class等元素进行定位
3.使用uiautomatorviewer工具获取应用的元素进行定位
这里我使用python自带的IDLE进行编写测试脚本,打开python文件找到IDLE(python GUI)双击打开,如图:
这里写图片描述
4.简单介绍unittest框架的使用方法
# -*- coding:utf-8 -*-
from uiautomator import device as d
import unittest
class Mytest(unittest.TestCase):
#初始化工作
def setUp(self):
print "--------------初始化工作"
#退出清理工作
def tearDown(self):
print "--------------退出清理工作"
#测试点击猫宁考勤case
def test_login(self):
d(text="猫宁考勤").click()
print "--------------测试1"
#测试2
def test_z(self):
print "--------------测试2" #这里你可以写你的第二个测试用例,
#测试3
def test_w(self):
print "--------------测试3" #这里你可以写你的第三个测试用例。。。。。。。。。。。。。
if __name__ == '__main__':
unittest.main()
结果如下:
Testing started at 21:14 …
————–初始化工作
————–测试1
————–退出清理工作
————–初始化工作
————–测试3
————–退出清理工作
————–初始化工作
————–测试2
————–退出清理工作
Process finished with exit code 0
从结果中我们可以看出unittest框架的运行方式为:
setUp 测试1 tearDown
setUp 测试2 tearDown
setUp 测试3 tearDown
5.使用Python编写猫宁考勤应用注册模块的自动化测试
# -*- coding:utf-8 -*-
from uiautomator import device as d
import time
import unittest
class MyTestSuite(unittest.TestCase):
# 初始化工作
def setUp(self):
print "--------------初始化工作"
# 退出清理工作
def tearDown(self):
print "--------------退出清理工作"
#***************************方法**************************************
# 判断控件是否存在 & text
def check_controls_exists(self, controls_text):
if d(text=controls_text).exists:
return 1
else:
return 0
# 判断按钮是否置灰 & text & clickable
def check_controls_click_text(self, controls_text):
if d(text=controls_text).info.get("clickable") is True:
return 1
else:
return 0
#assertIn(a, b) a in b
def check_ainb(self,resourceid,b):
if d(resourceId=resourceid).info.get("text") in b:
return 1
else:
return 0
#***********************************************************
# 注册模块
def test_Aregister(self):
try:
time.sleep(2)
#猫宁考勤开启全新时代
self.assertEqual(self.check_controls_click_text("注册"),1,u"猫宁考勤开启全新时代")
# 猫宁考勤开启全新时代--》点击注册按钮进入注册猫宁界面
d(text="注册").click()
time.sleep(3)
#注册猫宁界面
self.assertEqual(self.check_text("com.isentech.attendancet:id/regis_phone","请输入手机号码"),
1,u"注册页面-》请输入手机号码")
self.assertEqual(self.check_text("com.isentech.attendancet:id/regis_verifycode","请输入验证码"),
1,u"注册页面-》请输入验证码")
self.assertEqual(self.check_controls_click_text("获取验证码"), 0,u"注册页面-》获取验证码")
self.assertEqual(self.check_controls_click_text("《中科爱讯服务协议》"), 1,u"注册页面-》《中科爱讯服务协议》")
self.assertEqual(self.check_controls_click_text("注册"), 0,u"注册页面-》注册")
time.sleep(2)
#《中科爱讯服务协议》
d(text="《中科爱讯服务协议》").click()
time.sleep(2)
self.assertEqual(self.check_ainb("com.isentech.attendancet:id/title","服务协议"), 1,u"注册页面-》服务协议")
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/title_back").click()
time.sleep(1)
#手机号不输入是否能注册
d(text="注册").click()
time.sleep(3)
# 手机号只输入1个数字是否能注册&只输入1个数字是否能获取验证码
d(resourceId="com.isentech.attendancet:id/regis_phone").set_text("1")
self.assertEqual(self.check_controls_click_text("获取验证码"), 0)
time.sleep(1)
d(text="注册").click()
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/regis_phone").clear_text()
time.sleep(1)
#只输入5个数字是否能获取验证码
d(resourceId="com.isentech.attendancet:id/regis_phone").set_text("11111")
self.assertEqual(self.check_controls_click_text("获取验证码"), 0)
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/regis_phone").clear_text()
time.sleep(1)
#只输入手机号是否能注册
d(resourceId="com.isentech.attendancet:id/regis_phone").set_text(phone_number)
self.assertEqual(self.check_controls_click_text("注册"), 0)
time.sleep(1)
d(text="注册").click()
time.sleep(1)
#输入正确的验证码&获取验证码是否高亮
d(resourceId="com.isentech.attendancet:id/regis_verifycode").set_text("5648")
time.sleep(1)
self.assertEqual(self.check_controls_click_text("获取验证码"), 1)
time.sleep(2)
#密码只输入1个数字是否能注册&注册按钮是否高亮
d(resourceId="com.isentech.attendancet:id/regis_pass").set_text("1")
d(resourceId="com.isentech.attendancet:id/regis_passAgain").set_text("1")
time.sleep(1)
self.assertEqual(self.check_controls_click_text("注册"), 0,u"密码只输入1个数字是否能注册")
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/regis_pass").clear_text()
d(resourceId="com.isentech.attendancet:id/regis_passAgain").clear_text()
time.sleep(1)
#输入不相同的密码是否能注册
d(resourceId="com.isentech.attendancet:id/regis_pass").set_text("123456")
d(resourceId="com.isentech.attendancet:id/regis_passAgain").set_text("12345")
time.sleep(1)
self.assertEqual(self.check_controls_click_text("注册"), 0,u"输入不相同的密码是否能注册")
time.sleep(1)
d(resourceId="com.isentech.attendancet:id/regis_pass").clear_text()
d(resourceId="com.isentech.attendancet:id/regis_passAgain").clear_text()
time.sleep(1)
#输入正确的密码是否能注册&我已同意是否打钩
d(resourceId="com.isentech.attendancet:id/regis_pass").set_text("123456")
d(resourceId="com.isentech.attendancet:id/regis_passAgain").set_text("123456")
time.sleep(1)
self.assertEqual(self.check_controls_click_resourceId("com.isentech.attendancet:id/regis_agree"), 1)
self.assertEqual(self.check_controls_click_text("注册"), 1)
time.sleep(2)
d(text="注册").click()
time.sleep(8)
except Exception, e:
print u"Error: 注册模块有问题\n", e
def test_app():
test_unit = unittest.TestSuite()
test_unit.addTest(MyTestSuite("test_Aregister"))
if __name__ == "__main__":
# 测试app
unittest.main()

阅读全文

与androiduitest相关的资料

热点内容
旋住宿酒店用哪个App最好 浏览:58
三菱编程中怎么创建子程序 浏览:199
在单片机温度输入采集信号有 浏览:680
电脑云服务器同步 浏览:416
方舟生存进化手游版怎么转服务器 浏览:87
哪个app可以听小说 浏览:160
网络发送数据如何加密 浏览:201
教材完全解读pdf 浏览:820
什么是多台服务器 浏览:36
菜鸟音乐编辑app哪个好 浏览:547
人工鱼群算法matlab 浏览:82
算法coursera 浏览:124
潍坊诸城DNS服务器地址联通 浏览:10
共享文件夹不显示任务栏 浏览:251
唱歌给党听是哪个app的活动 浏览:499
bp算法源代码 浏览:648
发票服务器怎么选 浏览:387
哪个app陪伴运动 浏览:882
学编程每天六点起床 浏览:954
乌鸦搜索算法复现 浏览:77