单元测试策略,理想代码覆盖基线

时间:2016-01-30 20:35:51

标签: ios xcode swift unit-testing code-coverage

从单元测试和代码覆盖的角度来看,关于XCode7和Swift 2.0实际体验的信息仍然不多。

虽然有大量的教程和基本的操作指南可供使用,但我想知道不同iOS团队的经验和典型覆盖率统计数据实际上是否试图为他们发布的iOS / Swift应用程序实现合理的覆盖范围。我特别想知道这个:

1)虽然代码覆盖百分比不代表代码库的整体质量,但这是否被用作团队的基本指标?如果没有,评估代码库质量的另一种可衡量的方法是什么?

2)对于更强大的应用程序,您目前的代码覆盖百分比是多少? (只是fyi,我们现在的代码库很难超过50%)

3)你如何测试如下:

  • 应用程序生命周期,AppDelegate方法
  • 与推送/本地通知相关的任何代码,深层链接
  • 防御性编程实践,各种心态(几乎不可复制)的安全防护,异常处理等。
  • 动画,过渡,自定义控件(CG)的渲染等。
  • 可能包含任何其他逻辑的弹出窗口或提醒

我理解上面的一些内容更多是实际UI测试的主题,但它让我想知道:

  • 是否有合理的方法从UTs角度进行上述测试?我们是否应该尝试使用UT来满足整个代码库的任意最小代码覆盖百分比,还是应该根据应用程序的代码库来定义合理可实现的覆盖率?
  • 为了获得更高的覆盖率,使代码库更加不灵活是否合理? (我不是在谈论一个医疗应用程序,这里的生命将受到威胁)
  • 除了UI测试之外,是否有任何关于测试上述所有内容的良好实践?

期待富有成效的讨论。

1 个答案:

答案 0 :(得分:0)

你确实提出了一个非常大而且好的问题。虽然您的问题包括:

  

我想知道不同iOS团队的经验和典型报道统计数据......

我认为这个问题与语言/操作系统无关。当然,某些语言和平台比其他语言和平台更易于测试。因此,对于单元测试而言,有些成本更高(与其他形式的自动/编码测试相反)。我认为您正在寻找成本/收益等式以最大限度地提高生产率。啊软件开发过程的乐趣啊。

跳到最后,给你快速的声音抓取答案:

  

您应该对要使用的所有代码进行单元测试,并且该代码适用于单元测试

现在为什么全部以及为什么强调单元测试 ......

什么是单元测试?

开发社区中的语言已损坏,请耐心等待。单元测试只是一种自动化测试。其他是自动验收测试,应用测试,集成测试和组件测试。这些都测试不同的东西。他们有不同的目的。

然而,当我听到单元测试时,会想到两件事:

  1. 什么是单元测试?
  2. 作为TDD(测试驱动开发)的一部分?
  3. TDD是在编写代码之前编写测试。这是一个非常低级的编码实践/过程(XP - 极限编程),因为你编写一个测试来编写一个语句然后另一个测试。非常多的编码实践,但不是应用程序/需求实践,因为它是关于编写符合您的意图的代码,而不是产品要求是什么(哦,天哪,我觉得这些点丢失了)。

    编写代码然后进行单元测试......根据我的经验......有趣,短期的团队建设,但效率不高。当然发现了一些缺陷,但并不多。 TDD导致更好的健康"代码。

    我的观点是单元测试是:

    1. 自动/编码测试的子集。
    2. 是编码过程的一部分。
    3. 关于代码健康(可维护性)。
    4. 注意是否证明您的应用有效(落点声音)。
    5. 为什么全部?

      如果您的团队提供零缺陷软件(ZDFD是真实且可实现的......但这是一个平坦的地球讨论),而且没有单元测试,那么这是无稽之谈,您不会在这里提出任何问题。

      团队将单元测试作为编码过程的一部分,唯一合理的原因是提高生产力。如果所有团队成员都致力于团队生产力,那么唯一的问题就是确定哪些代码从单元测试中获利。这是 all 的上下文。

      我认为最简单的方法是列出我不进行单元测试的类型:

      • 工厂 - 他们只是实例化类型。
      • 建设者/写作(IoC) - 与工厂相同 - 没有域逻辑。
      • 第三方图书馆 - 我们称之为第三方图书馆。如果要测试这些,请使用集成/组件测试。
      • 一个环的复杂性 - 每种类型的方法都有一个CC为1.也就是说,没有条件。单元测试会告诉你没有用,同行评审会更有用。

      实际答案

      我的团队已经预计所有应该进行单元测试的新代码的100%单元测试覆盖率。这是通过归因于不符合单元测试标准的代码来实现的。所有代码都必须经过代码审查,并且属性必须特定于上面列出的选项。 - 简单。

      答案很长,也许不容易消化,也不是人们想听到的。但是,从长期经验来看,我知道这是能够带来最佳盈利能力的最佳答案。

      发表评论

      我的回答是针对问题的单元测试方面。至于防御性编程和其他实践,TDD是一个通过使更难做错事件来减轻这种情况的过程。但构建系统静态代码分析工具可以帮助您在进行同行评审之前捕获它们(它们可能无法构建新问题)。看看其他像SonarQube,Resharper,CppDepend,NDepend(依赖于语言)。