|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
很少去思考,没有去多问几个为什么。这是学习的大忌,我认识到了自己学习方法上的错误。孔子说,学而不思则罔,思而不学则殆。一点也没错,学和思是要结合的,这样才能进步。现在回想一下,我学到了什么?自己也无言以对了。CI在web-basedapplication上已有了十分成熟的完成,由此也堆集了大批的优异理论。但这些理论在Android平台中是不是合用?已知的CI工具是不是可以很好的撑持Android?AndroidCI是不是也能立即的反应AndroidApplication的安康情况?这篇文章中将经由过程理论,向人人展现AndroidCI可用的完成办法,是时分为我们的AndroidApp搭建CI了。
1、AndroidCI带来了甚么?
1)App质量的提拔
现实上CI其实不能间接进步App的质量,可是CI供应了对App的监测和反应,经由过程延续的检测和反应,能够完成对App的延续改善。
在CI的Compilation阶段,若呈现编译失利频次较高,一是由于代码未依照原子提交的准绳举行,二是当地开辟情况不洁净,存在与CI情况纷歧致的中央,招致每次提交时不克不及提交一切文件,老是必要手动选择提交文件。
在CI的Testing阶段,若呈现失利,很有大概申明此次提交已损坏了与之相干联的功效大概模块。App经由过程Testing,就是App可用性的一种反应。
CI的Inspection阶段会对代码做多方面的考查,如Checkstyle,单位测试掩盖率,代码静态bug剖析等,这些都是对代码质量的检测,经由过程这些改良检测了局,代码质量也就会随之失掉进步。
CI将各环节的了局反应给全部团队,团队为改良这些了局支付勉力后,App的质量天然也就失掉了提拔。这也就是为何反应环节在CI是云云的主要,以致于得到它,CI没法发扬任何感化。
2)风险下降
CI将项目以后的安康情况立即的传递给全部团队,使得项目情况变得非常通明。团队成员在取得CI的反应后,会体贴项目标安康情况,慢慢的团队一切人都习气为App质量承当起本人的义务。
Bug的呈现老是不成制止的,那就但愿这些bug尽早的呈现。延续的举行Testing可让bug尽量早的被发明。同时很快就可以定位bug引进工夫,并办理它。在公布前夜,发明App居然存在部署成绩,这必定会让人人变得严重起来。延续的举行Deploy,可让这些成绩尽早的表露出来并办理。
3)反复步骤削减
为了失掉一个可公布的AndroidApp,必要履历编译,测试,考证,部署等浩瀚步骤。为了勤俭出包的工夫,削减对资本的损耗,包管步骤都被准确实行。CI能够帮组构建一个能够反复实行的出包流程,并经由过程不休的优化,延长工夫。如许一个断定的出包步骤可以闪开发职员在当地情况疾速的完成部署。
4)对产物的信念加强
项目在一个通明的情况中运转着,团队成员都存眷这App质量,勉力改良项目安康情况。如许一个同心合力的团队形态,信任全部团队关于项目标信念也会随之增添。
2、AndroidCI面对的坚苦
Android情况存在不不乱。Android的摹拟器在假造机中存在不克不及不乱运转的情况。
主动化框架不敷成熟。特别是主动化测试。
没法完成主动化部署。
Android设备中有些功能较低。必要在这些设备上运转FunctionTest时资本紧缺就加倍分明。
Android正在疾速开展,带来了多个差别较年夜版本。那CI就应当对这些版本都可以兼容。
3、一步步完成AndroidCI
Android上的CI构建链与别的平台分歧,仍然包括Compilation,Testing,Inspection,Deploying阶段,每个阶段的Feedback的都坚持对全部团队通明。
<br>
CI中各个步骤实行前后按次的布置,应当是实行工夫较短的优先实行。实行工夫短的一样平常在提交卸码前便可实行,毛病率也对照低,就应当尽量先实行。如许失利会来得更早一些,每次CI运转失利前考证终了的工具更多。上图中CI的事情流,恰是在如许的一个准绳的基本上构成的。
情况筹办
*在CI服务器上安装Java和Android运转情况
*安装构建工具,本文彩用Ant举行理论
*搭建好CI服务。本文彩用开源的CI服务Jenkins(Hudson)。
*Jenkins在功效上完整可以满意功效上的必要,且复杂易用。
*安装Ruby情况。本文中利用的FunctionalTest测试工具是基于Ruby完成的。
步骤1:延续构建
延续构建的目标是随时可主动化天生最新的可运转的App。固然有这么多限制词来暗示这一步完成的考证前提,但现实上只必要经由三个步骤便可完成。
一是更新代码,Jenkins中已很好的撑持了SVN和Git这两项经常使用的代码办理工具。二是接纳构建剧本构建安装包,Android已很知心的连Ant构建剧本都为我们筹办好了,而且由于Android的包布局的标准,也很年夜水平上打消各开辟职员情况下项目机构的纷歧致。三是延续实行前两步,只要在每次呈现任何代码变化时当即实行前两步才干包管随时都能够供应可运转的安装包。
延续构建完成起来对照简单,可是它所告竣的效果仍是很不错的。对开辟职员来讲,都能够接纳统一个剧本快速的在当地天生安装包,这在很年夜水平上也削减了呈现“这在我呆板上运转的很好”的成绩。关于测试职员,随时都能够猎取最新的测试包,不必要再守候开辟职员腾出工夫来做这件事。关于产物职员,能够使用这些最新包,在开辟职员完成后第一工夫取得反应。乃至能够在完成部分功效的情形下就入手下手体验了。
BestPractice:
*在每次提交后都对全部project举行构建。这里的提交应当包括任何一个巨大的修改。
*一切人遵守不异的构建按次,接纳统一套构建剧本
*每次构建的时分都实行统一套剧本
步骤2:延续测试
延续测试是疾速的经由过程主动化的手腕搜集软件安康情况的办法。延续测试是为了考证构建完成的包功效是不是可用,而不单单可以安装运转。对App的测试能够从UI,Function,Code三个条理来举行,这三者间的权重干系能够参照测试金字塔来计划。
依据前文提到的优先运转最快的准绳,这三个条理的测试,应当依照UnitTest,FunctionalTest,和UITest的前后按次布置在CI实行。
1、增加UnitTest
UnitTest是运转本钱最低的测试,而且关于测试用例掩盖最为周全。勉励尽量使用单位测试掩盖用例。Java中的单位测试首选的仍是利用JUnit,但Androidproject的代码由于对SDK存在着极强的依附,仅仅利用JUnit举行单位测试,可以掩盖的代码其实太少。为懂得除对SDK的依附,天然会思索引进Mockito如许的Mock框架。但即便借助Mockito写单位测试的事情量仍然伟大,由于必要mock的对象其实太多。而且Android的object在JVM中没法创立。
这时候能够接纳Robolectric单位测试框架,这将年夜幅度提拔单位测试掩盖率,且实际上能够到达100%。Robolectric是以JUnit为中心,完成了对AndroidSDK的stub。接纳stub的体例后,Android的组件在JVM中便可创立并运转,无需在Android平台下运转。这也意味着在Android开辟中能够接纳TDD的体例,进一步进步单位测试掩盖率。该框架的利用JUnit完整一样,运转功能也分歧。
因为Robolectric对SDK举行了stub,在写单位测试时完整能够对组件形态举行考证,乃至能够对组件举行操纵。上面这个测试就是对button点击事务的测试,而且考证了Activity的形态。- @Testpublicvoidshould_be_finished_if_clicked_on_cancel_button(){Robolectric.application.onCreate();CustomActivityactivity=newCustomActivity();IntentnewIntent=newIntent();activity.setIntent(newIntent);activity.onCreate(null);ButtoncancelButton=(Button)activity.findViewById(R.id.cancelButton);cancelButton.setVisibility(View.VISIBLE);Robolectric.clickOn(cancelButton);
复制代码 接上去的事情就是将Robolectric集成到CI中,让它反省程序的安康情况。Robolectric实质上仍是JUnit,只是多了一些stub对象罢了。那我们集成Robolectric的办法和JUnit完整分歧。只需创立Anttask,并在Jenkins中实行此task便可。此Anttask以下:- <targetname="unit-test"depends="clean,init,compile"><junitfork="yes"dir="."failureProperty="test.failed"haltonerror="false"haltonfailure="false"printsummary="yes"forkmode="perBatch"showoutput="no"><classpathlocation="${cobertura.instrumented.dir}"/><classpath><pathelementpath="${tested.project.dir}/bin/classes"/></classpath><classpathlocation="${classes.dir}"/><classpathrefid="test.classpath"/><formattertype="brief"usefile="false"/><formattertype="xml"/><batchtesttodir="${reports.xml.dir}"><filesetdir="${src.dir}"><includename="**/*Test.java"/><excludename="**/AllTests.java"/></fileset></batchtest></junit><junitreporttodir="${reports.xml.dir}"><filesetdir="${reports.xml.dir}"><includename="TEST-*.xml"/></fileset><reportformat="frames"todir="${reports.html.dir}"/></junitreport><failif="test.failed"message="Unittest(s)failed."/></target>
复制代码 在将这些测试集成至CI后,最主要的一步搜集了局是不克不及忘的。之前已说过Calabash也可依照单位测试呈报标准输入,加上Robolectric自己就是JUnit框架的扩大,呈报也是依照单位测试呈报标准输入。UnitTest和FunctionTest的呈报便可利用JUnittest搜集。
要想取得单位测试掩盖率呈报,Cobertura是个不错的选择。增加- <targetname="coverage-report"><cobertura-reportsrcdir="${tested.project.src}"destdir="${cobertura.coverage.xml.dir}"format="xml"/></target><targetname="summary-coverage-report"><cobertura-reportsrcdir="${tested.project.src}"destdir="${cobertura.coverage.summaryxml.dir}"format="summaryXml"/></target><targetname="alternate-coverage-report"><cobertura-reportdestdir="${cobertura.coverage.html.dir}"><filesetdir="${tested.project.src}"><includename="**/*.java"/></fileset></cobertura-report></target>
复制代码 从Jenkins上便可取得明晰的单位测试掩盖率的呈报
<br>
2、增加FunctionTest
Android为人人供应了一套集成测试框架Androidintegrationtestingframework。但此框架未集成Cucumber,这招致每增添一个FunctionTest都必要较年夜的开辟和保护事情。如许高本钱的完成FunctionTest将年夜年夜延缓开辟进度,终极由于项目进度的缘故原由招致FunctionTest被抛弃。发生如许的成果那一定是不肯意看到的。
今朝Android平台下已呈现多种FunctiongTesting测试工具,如NativeDriver,Robotium,Calabash等。在实验对照后,终极选择了CalabashAndroid作为办理计划。CalabashAndroid是Cucumber在Android平台的完成,利用Ruby誊写FunctionTest,并供应了一组操纵AnadroidApp元素的API。
CalabashAndroid的次要上风有以下三点:
a.关于BDD的撑持
b.利用Ruby完成FunctionTest加倍的切合天然言语的习气。使得QA也能轻松的完成FunctionTest
使用Calabash供应的对App组件操纵的API,完成启动App并上岸只必要以下短短的几行代码:- Given/^IlaunchandloginTelstraApp$/dostep%Q|Ilaunchtheapp|step%Q|Iwaittosee"MYACCOUNTLOGIN"|step%Q|Ienter"#{$username}"intoinputfieldnumber1|step%Q|Ienter"NotARealPassword"intoinputfieldnumber2|step%Q|Ipress"LogintoMyAccount"|end
复制代码 c.撑持Android和iOS利用不异的API操纵App。使得iOS和Android平台中的Feature能够重用
Jenkins集成CalabashAndroid
运转CalabashAndroid必要Ruby情况,同时也倡议安装RVM。在CIagent上安装Ruby和RVM,并为Jenkins安装RVMplugin后运转情况就筹办好了。
在Jenkins中实行运转CalabashAndroid的shell命令前必要注重指定运转时的gemset
<br>
CalabashAndroid在Jenkins中的实行命令以下:
<br>
Calabash在运转终了以后,能够依照单位测试呈报的标准供应测试呈报
<br>
3、增加UITest
Android在早先加入了UI测试工具UIAutomator。此工具仅撑持Android4.1及以上平台,鉴于今朝市场上2.3和4.0版本仍占主导的情形来看,今朝还没法满意人人的必要。别的使用该工具完成UI测试的开辟本钱还较高,笔者暂不保举利用此工具,但应当存眷其开展。
别的基于录制回放机制的测试办法一样能够举行UI测试。但录制回放的办法在面临功效疾速迭代时,保护事情会急剧增添,而这个保护本钱能够说是很难接受的,以是在此也不会将这类测试办法集成至CI中。
今朝来看Android中UI测试还无使人中意的办法。若对UI乐成对照垂青,能够投进精神使用UIAutomator举行UI测试。
BestPractice:
*将测试依照单位测试,组件测试,功效测试和体系测试举行分别。单位测试应当在每次提交时触发实行,别的的测试依据运转工夫是非和主要水平能够每次提交触发实行大概准时周期实行。
*将运转较快的测试优先实行。
*让功效测试可以反复实行。不然保护本钱太高,会被舍弃。如果背景数据招致不成反复,能够将数据笼统成为数据集,在每次运转行进行重置。
*誊写测试时每个assert只做一种判别,如许能够明白每次测试的目标,而且能够疾速定位测试失利乐意。
步骤3:延续反省
延续反省是关于代码自己检测和反应。检测次要经由过程对代码静态剖析考证代码作风,编程标准,代码复用,代码言语中的BestPractice等多个维度的代码质量。
Sonar作为一个开源的代码质量检测工具,涵盖了7项代码质量检测体例。这充实满意Android平台下关于代码质量的检测剖析。Sonar分为两部分一部分是代码剖析工具,另外一部分是数据剖析展现的Server。
Sonar可举行的剖析维度在其Dashboard中能够瞥见:
<br>
Sonar的剖析工具也有多种运转体例,能够由Antscript,Jenkinsplugin,jar等多种体例运转,为了简化Jenkins的设置,本例子接纳Antscript的体例运转:- <targetname="sonar"><taskdefresource="org/sonar/ant/antlib.xml"><classpathpath="CISetup/sonar-ant-task-2.0.jar"/></taskdef><sonar/></target>
复制代码 BestPractice:
*将测试掩盖率,代码剖析了局通明化
*延续下降代码庞大度
*延续的增进计划的演进
*延续的保护代码布局
*延续削减代码反复
步骤4:延续部署
因为AndroidApp接纳用户手动从Appstore自行下载安装的体例公布,使得AndroidApp没法间接部署至用户手机中。别的Appstore必要关于上线的App举行考核,不克不及延续举行Release。因此Android中延续部署将以延续公布可安装包为方针。
在以上目标下,只需依据本身项目资本找到符合的安装保证理工具便可。如本文彩用Dropbox来办理一切安装包。
Dropbox作为一个云存储平台,在Android终端设备上能够轻松下载寄存在个中的文件,同时上传安装包也能够交由Dropbox本人完成。- <targetname="copy-prod-apk-to-dropbox"><echomessage="copying${basedir}/bin/AndroidApp-prod-${VERSION_NUMBER}.apkto${dropbox.dir}/AndroidApp/R4/${VERSION_NUMBER}/"/><copyfile="${basedir}/bin/AndroidApp-prod-${VERSION_NUMBER}.apk"todir="${dropbox.dir}/AndroidApp/R4/${VERSION_NUMBER}"overwrite="true"/></target>
复制代码 BestPractice:
*包管任什么时候间都可以公布可用的程序
*为每次build打上build号
*实行部署签运转一切的测试
*包管部署失利都能实行回滚
步骤5:延续反应
反应是一切改善的入手下手,必需要让一切人猎取到他们所体贴的反应信息,才干实行改善。延续反应的目标就是让一切人都把握项目安康情况。项目一切人现实都是成心愿晓得项目以后的安康情况的,那CI就应当将项目标情形做到通明,并将分歧的反应关照到各相干的成员。
CI分歧阶段发生了分歧维度的反应,如单位测试呈报,测试掩盖率等。本理论中将这些反应都通明的展现在项目首页中。之以是未将这些反应再以邮件的体例关照一切人,是由于团队成员已养成了检察CI的习气。
假如说只给一切人发一封邮件申明项目情况,那一定是告知一切人“CI一切步骤是不是都前往准确?”。如许一个反应,包括了编译准确,一切测试经由过程,安装包已筹办终了等主要信息。有需要让一切人都晓得这个信息,出格是在CI实行失利的时分。Jenkins本身已供应一个复杂无效的通明化办法,以项目为蓝色暗示经由过程,白色暗示有步骤失利。
如果你现在开始学到编出像样的APPiOS5可能已经普及了可以直接用ARC(另之前对ARC的了解很粗浅现在开发程序完全可以直接ARCiOS4不支持的weak是有办法替代的用unsafe_unretained |
|