若天明 发表于 2015-1-18 11:43:09

IOS编程之Android中的单位测试仓酷云

关于iOS开发的学习打个比方就像把汽车分解最底层的原料有塑料钢铁再用这些底层的工具造出来发动机座椅最后再加上写螺丝胶水等把汽车就拼起来了iOS基本都是英文的资料跟着Agile的提高,和开辟职员对测试主要性的熟悉慢慢加深,单位测试已成了愈来愈多软件项目开辟中不成短少的一部分。不管项目是否是接纳TDD的情势来举行开辟,单位测试都可以为项目标修正和重构供应必定的保证。
Android作为次要的挪动平台之一,吸引了有数的开辟职员。但面临Android平台和情况的各种限定,良多开辟职员常常故意有力,很难为其项目增加周全无效的单位测试。
Android平台的开辟情况中集成了一个测试框架(InstrumentedTest),用于撑持其单位测试和验收测试。Robotium一样供应一个相似于Selenium的测试框架,使得开辟职员能够对使用的功效举行考证。这两种体例供应的测试情况都相似于集成测试,它们的测试用例都必要运转在摹拟器上,经由过程对摹拟器的操纵大概mock,来触发函数挪用,进而对其了局举行考证。这类办法一般粒度较年夜,测试的编写和保护较为坚苦,而最为主要的是,因为测试必要运转于摹拟器或测试呆板上,我们在运转前必要将测试和使用打包,举行部署安装,并终极运转在摹拟器或测试呆板的Delvik假造机上,其运转速率较一般的单位测试要慢很多,假如利用TDD来举行开辟,基本没法到达疾速开辟的请求。
之以是这些框架的测试用例都必要在摹拟器中运转,是由于我们平常在开辟时所利用的Andorid.jar是被精简过的,只是用于一样平常开辟的,它只是一个placeholder,使得我们在开辟时可以不出编译毛病,它完整是一个stub包,个中一切的类都只是Android平台接口的一个stub,假如在代码中运转这个Android.jar,它们一切的办法都只会抛出一个java.lang.RuntimeException(“Stub!”)非常。以是,一旦测试代码必要真正挪用Android平台相干的类或接口,它们就必需运转于真正完成了Android的情况,如摹拟器大概是测试呆板。
我们的别的一个选择是只对POJO举行单位测试,假如碰到Android相干的代码,就利用Mock框架对其举行摹拟。这类体例必定水平上能够办理我们的成绩,但这意味着我们必要大批的在测试情况中利用mock和stub。别的,固然Android中界面的结构一般利用XML来完成,但项目标代码中仍是会存在各类对界面的操纵和更新,UI和逻辑的耦合使测试加倍不容易。
并且即便如许,因为Android平台的庞大性(static办法,final办法和类,Context和Resources的办理),我们也很难对Android相干的代码举行测试,以包管测试率。
那末怎样可以在不增添开辟本钱的情形下,有一个不乱疾速的单位测试情况呢?
我们今朝的选择是利用MVP形式和Robolectric

Android的系统布局十分合适于利用MVP形式举行开辟,与MVC形式分歧,Android中的Activity并非一个尺度的Controller,它的主要职责是加载使用的结构和初始化用户界面,并承受并处置来自用户的操纵哀求,进而作出呼应。跟着界面及其逻辑的庞大度不休提拔,Activity类的职责不休增添,乃至变得复杂痴肥。当我们将个中庞大的逻辑处置移至别的的一个类(Presneter)中时,Activity实在就是MVP形式中View,它卖力UI元素的初始化,创建UI元素与Presenter的联系关系(Listener之类),同时本人也会处置一些复杂的逻辑(庞大的逻辑交由Presenter处置)。如图所示:

<br>
经由过程这类职责的分别,一方面代码的可读性失掉了进步,另外一方面我们能够更加便利地经由过程mockActivity的体例对各类逻辑(Presenter中的办法)举行测试。
关于测试情况的搭建和测试Android相干的代码,我们则借助于Robolectric的匡助。
Robolectric在其所供应的测试框架中,完整摹拟了AndroidSDK的jar文件(不会再有末路人的stub非常),它使得我们的测试能够运转于JVM之上(速率失掉年夜幅度的提拔),因而我们能够用它对Android使用举行测试驱动开辟。Roblectric同时完成了Android中对XML的剖析,摹拟了View,Layout,和资本的加载,它使得Android的情况关于开辟职员来讲更像是一个黑盒,从而使开辟职员不必大批利用mock,就能够便利的对资本形态和Android相干的代码举行测试。
Robolectric是怎样做到这点的呢?
Robolectric利用了javassist在运转时静态修正Android.jar中类的bytecode,Robolectric会在JVM加载Android.jar包的时分,重写个中类的办法。Roblectroic会让这些办法有前往值(null或是0)而不是抛出非常,大概将这些办法挪用转向ShadowObjects来摹拟AndroidSDK的完成。ShadowObjects是Robolectric在运转时拔出到Android.jar包响应的类中的,它们会实践处置办法的挪用,并纪录响应的形态,以备在assert的时分举行查询。如图所示。Robolectric供应了大批的ShadowObjects,掩盖了测试开辟过程当中尽年夜多半逻辑功效的必要。

<br>
Robolectric的利用

基于Robolectric的测试必要利用其特定的testrunner(RobolectricTestRunner)来运转,我们能够经由过程扩大RobolectricTestRunner来创立一个本人的testrunner,并在其机关函数中设定必要加载的AndroidManifest.xml和resource目次。如:
publicclassMyTestRunnerextendsRobolectricTestRunner{publicMyTestRunner(Class<?>testClass)throwsInitializationError{super(testClass,newRobolectricConfig(newFile("my_app/AndroidManifest.xml"),newFile("my_app/res")));}}有了本人的testrunner,我们能够来写一个复杂的Robolectric测试了
1@RunWith(MyTestRunner.class)publicclassSignInScreenTest{@Testpublicvoidshould_start_intent_when_click_registration_button(){2Activityactivity=newActivity();SignInScreensignInScreen=newSignInSceen(activity);3TextViewtextView=(TextView)signInScreen.findViewById(R.id.sign_in_registration);textView.performClick();4ShadowActivityshadowActivity=Robolectric.shadowOf(activity);IntentnextStartedActivity=shadowActivity.getNextStartedActivity();ShadowIntentshadowIntent=Robolectric.shadowOf(nextStartedActivity);assertThat((Class<WebPageActivity>)shadowIntent.getIntentClass(),equalTo(WebPageActivity.class));}}在这段测试代码中:


[*](1)声了然测试运转的testrunner;就像一般的单位测试,它也分为了setup,methodinvoke,和assert三个阶段。
[*]在(2)中,测试初始化了一个Activity用于供应Context,并利用这个Activity对象天生了一个SignInScreen实例;
[*]第二个阶段,也是就(3)中,代码在天生的登录界面中找到注册按钮,并举行点击。最为成心思的第三个阶段必要考证注册按钮的点击触发了我们希冀的事务,即便用ImplicitIntent来翻开WebPageActivity。
[*]为了举行这个考证,(4)中起首经由过程Robolectric的静态办法shadowOf来猎取activity对象响应的ShadowObject,而经由过程这个ShadowObject,代码取得了activity对象的所开启的Intent对象。最初经由过程Intent对象的ShadowObject,我们能够取得其intentclass并举行考证。
经由过程这个测试我们能够看到,有了Robolectric的匡助,我们能够轻松的天生Activity实例,加载xml结构文件,举行组件上的办法挪用。经由过程shadow对象,我们则能够猎取Android相干类的对象形态信息,来对测试的了局举行考证。实践上除Intent,我们还能够对经由过程利用Robolectric对代码中的Dialog,HTTP哀求,数据库操纵等各个方面举行测试。
Robolectric并没无为AndroidSDK中的一切类都界说shadow对象,你能够经由过程挪用Robolectric.getDefaultShadowClasses()办法来检察你所必要的类是不是已被注册到了必要被shadow的类列表中。假如没有你大概就必要对其举行定制和扩大。关于怎样增加ShadowObjects而增添Robolectric的功效,在Robolectric的网站文档中有具体的形貌。
因为Robolectric的测试是能够离开Android的SDK运转于JVM上,我们就能够像运转一般的jUnit测试一样在IDE中大概在终端利用构建剧本运转我们的测试。
因为Robolectric的更新并非很频仍,我们在平常也碰到了一些必要定制的情形,如撑持Android4.0,利用sonar举行项目质量剖析等等。以是我们在github上fork了Robolectric的工程,并以gitsubmodule的体例将其到场到我们的工程办理中来,如许,我们就能够依据本人的必要来对Robolectric举行修正和扩大。因为我们对Robolectric的修正频次十分的低,在每次修正后,能够将其编译打包成一个jar文件,将这个jar文件到场到我们的工程办理中,让我们的测试代码仍旧依附于这个jar文件,如许能够免除在运转测试中不用要的对Robolectric的反复编译,加速测试代码的运转速率。
我们在以后的项目中也举行了必定的关于验收测试方面的实验,因为测试剧本是开辟职员与BA和QA举行相同的一种主要路子,也是开辟职员和QA举行野生测试的基准,因而我们仍旧选用了cucumber作为我们编写剧本的工具,再利用cuke4duke和jRuby对其举行剖析和实行。但今朝这类测试体例仿佛其实不成熟,我们在这类实验和理论的过程当中碰到了各种的成绩,次要在于测试编写和保护上的坚苦,这也招致了我们验收测试的掩盖率其实不高。我们也会在这一偏向长进行更多的实验,假如人人有更好的关于验收测试主动化方面的理论,也但愿可以失掉你们的匡助和斧正。
关于作者

张磊,ThoughtWorks程序员,在J2EE,RoR,Android和iOS平台有开辟履历,喜好大度的代码息争决计划

如果你对iPhoneDevelopment有兴趣,以下是入门门槛供参考:首先你要有一台Mac电脑(因为iPhoneApp使用Mac平台内建的Xcode开发工具),网上也有在Windows下搭设开发环境的教程,请大家自行谷歌一下,

莫相离 发表于 2015-1-21 13:08:15

其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。

若相依 发表于 2015-1-28 05:25:12

这个办法就是在WindowsXP或Win7的电脑上,使用vmware虚拟机来搭建一个真实的Mac OS X环境。

简单生活 发表于 2015-1-30 17:39:26

开始的时候甚至想放弃,不过想想自己的未来,只能咬牙坚持,课下就不停的缠着老师。放学就补基础,这些基础的东西没有速成的,只有刻苦努力。我是后来发现的,转变自己的心态,不要读书看资料当成一种痛苦

灵魂腐蚀 发表于 2015-2-6 14:34:18

iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。

变相怪杰 发表于 2015-2-9 03:35:49

还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。

活着的死人 发表于 2015-2-17 18:38:33

还有开发工具是用Xcode,是在Mac系统的,你多摸索一下就可以开发简单的应用了,建议你买一本iphone开发秘籍第二版看看,希望可以帮到你,谢谢。

仓酷云 发表于 2015-2-19 06:10:28

down下code4app网站的每个分类的代码挨着看

蒙在股里 发表于 2015-3-8 15:34:21

特别是在校的学生,都存在一个小小的尴尬——虽然学习iOS开发的热情高涨,但由于没有多余的银子购买昂贵的Mac电脑而踟蹰不前。其实,针对初学者,如果想进入iOS开发的天地

第二个灵魂 发表于 2015-3-10 23:42:06

iPhone文件系统NSFileManager讲解是本文要介绍的内容,主要是通过iphone文件系统来学习NSFileManager的使用方法,具体内容来看本文详解。

深爱那片海 发表于 2015-3-17 16:08:08

中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者,

因胸联盟 发表于 2015-3-17 16:09:35

到大三时,学院与我去培训的机构成立了实习基地,并让我们寒假去实习了一段时间,感觉还不错,于是在大四的时候去培训了

admin 发表于 2015-3-24 11:15:57

自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉

小魔女 发表于 2015-4-14 20:16:52

看完这个你就可以有多种选择来踏入做应用的阶段

谁可相欹 发表于 2015-5-11 03:10:15

这个办法就是在WindowsXP或Win7的电脑上,使用vmware虚拟机来搭建一个真实的Mac OS X环境。

精灵巫婆 发表于 2015-6-14 00:01:54

在百度搜索你想要了解的类名(苹果的cocoa和cocoatouch框架的类名很有特点很容易搜到,前缀都是NS or UI),看别人写的博客详解

老尸 发表于 2015-6-25 21:18:04

到大三时,学院与我去培训的机构成立了实习基地,并让我们寒假去实习了一段时间,感觉还不错,于是在大四的时候去培训了

小妖女 发表于 2015-6-27 01:18:58

培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。

再见西城 发表于 2015-7-8 06:28:44

到大三时,学院与我去培训的机构成立了实习基地,并让我们寒假去实习了一段时间,感觉还不错,于是在大四的时候去培训了

冷月葬花魂 发表于 2015-7-12 22:50:57

好处就是运行速度会变快,ios6针对系统的优化进一步加强了,很多网友测试ios6,第一感觉就是速度快,而且ios69会有一些新功能,新浪微博,facetime支持3G网等等。。弊端就是,现在的ios6只能算是正式版本的第一个版本,bug很多,不少人刷完ios6都出现了很多毛病,开不开机,缺少图标等等。。最好现在不要升级,等官网放出下一个版本的时候,再选择升级。。。
页: [1]
查看完整版本: IOS编程之Android中的单位测试仓酷云