美文网首页
从历史角度分析Android为什么难以测试(译)

从历史角度分析Android为什么难以测试(译)

作者: WayOfDevilin | 来源:发表于2017-02-16 19:52 被阅读0次

作为一名专业人员,我们往往对自己的历史一无所知。

                                                  ——David West,Object Thinking

原文:Why Android Testing is so Hard: Historical Edition

大约两年前,我写了一些文章尝试回答“为什么Android应用难以测试”这个问题。在这些文章中,我提出一个观点:是Android应用的标准架构导致测试的困难性。关于这个观点的阐述引出了一个更深层次的历史问题:为什么导致测试困难的架构却成为了构建Android应用的默认方式?

这篇文章中我想要推测这个问题。我认为主要有三个方面的原因导致了Android不太理想的测试境地:

1、对性能的忧虑;

2、对应用组件本意的困惑;

3、在Android最初版本,TDD(测试驱动开发)及自动测试的崭新性。

性能

在某种程度上,可测试代码和高性能代码成反比关系。正如Michael Feathers指出:可测试代码需要抽象层。

遗留代码通常存在这样的问题:没有任何的抽象层;系统中最重要的代码通常处于低级别的API调用。我们已经见识到它们如何使测试变得困难。[1]

Chet Haase指出,抽象层需要性能消耗,这个损耗是Android开发者需要特别注意的。

如果一些代码很少执行,但能得益于清晰的风格,这种情况下适合使用更加传统的抽象层。但如果代码被反复执行且引起频繁的内存抖动,这时就应该考虑那些避免过度分配的策略。[2]

尽管在2017年关于性能问题(“#perfmatters”)有了大量的讨论,但在Android刚起步的时候,性能是一个更大的忧虑,这意味着Android API的设计以及早期Android应用构建的实践/架构都是极度性能敏感。因此很可能在那段时间,通过建立抽象层来支持测试是不实际的。

第一台Android手机G1拥有192MB内存和528MHZ处理器。目前我们已经走过了漫长的道路,并且在多数情况下,我们已经能够支付可测试性所需额外的抽象层开销。

最近我听到一件有趣的事,Ficus Kirkpatrick(Android团队的创始人之一)在最新一集的Android Developers backstage上的发言表明:在Android的设计和早期的开发中,性能忧虑占有多大的权重。

许多事情,例如枚举类型,以及涉及CPU周期和内存的极端节俭哲学,这些都是有趣的镜头去回顾Android早期的决策。我看很多工程师几乎像是处在大萧条时期,并且学会了挖锅底。[3]

后续在播客(podcast)上有一个关于性能与开发速度权衡的大讨论。Chet Haase和Tor Norbye坚定表态性能问题优先,而Ficus Fitzpatrick(目前在Facebook)倾向于牺牲性能以换取开发速度。

谁是对的?或者他们最终是否有未解决的分歧?这些都我们来说都不重要。重要的是他们的对话,他们对枚举变量的讨论,明确表明了Android开发者依旧非常担忧性能问题。这使得他们对推广方便测试的模式不感兴趣,因为这些模式的抽象会带来额外的性能开销。

对Android组件的误解

导致Android测试境地如此不堪的另一个原因可能是,我们从根本上误解了Android组件(即Activity,Service,BroadcaseReceiver和ContentProvider)的本意。很长一段时间我都认为这些类都是为了方便应用开发。而Diane Hackborne告诉我们,事实并非如此。

拥有Java语言API和相当高层次的概念,它们看起来像一个典型的应用框架,用以告诉应用程序应该如何执行它们的工作。但在大多数情况下并非如此。

可能更合适称呼Android核心API为“系统框架”。大多数情况下,我们提供的平台API定义了一个应用如何与操作系统交互。但对于纯粹运行在应用内部的事物来说,这些API通常是不相关的。

同样的观点也被Chet Haase在他的Developing for Android博客中反复提及。

应用组件(activities,services,providers,receivers)是你的应用与操作系统交互的接口,不要把它们作为你部署整个应用的工具推荐。[4]

我认为大家普遍了解这个观点:把逻辑操作放在activities和其他组件类中使得测试变得困难,因为缺少了合适的依赖注入。大多数人认为我们应该围绕这些组件类去构建我们的应用,因此我们过度使用了他们,这导致了测试如此糟糕的境地。

Android和单元测试的兴起

还有一个导致此境地的原因:TDD和Android是同时兴起的。Android第一个发布版本是在2008年9月,而早期一本关于TDD风格单元测试的书籍《TDD by Example》仅仅是在三年前写的。

比起当时,自动测试的重要性目前已被广泛接受。可测试性的重要性很可能成为Android SDK设计决策的考虑因素,以及成为Android社区的愿景,以开发支持测试的实践和架构。

注释

1、Michael Feathers, Working Effectively with Legacy Code, 350-351.

2、Chet Haase, Developing for Android II The Rules: Memory

3、“In the Beginning,” Android Developers Backstage, ~25:00.

4、Haase, Developing for Android VII The Rules: Framework

相关文章

网友评论

      本文标题:从历史角度分析Android为什么难以测试(译)

      本文链接:https://www.haomeiwen.com/subject/oxxqwttx.html