首页 安卓& Kotlin Books Android测试驱动驱动的教程

2
什么是测试? 由Fernando Sproviero撰写

A 测试 是用于评估如果的手动或自动过程 正在测试的系统 (SUT)表现得正确。

SUT可以是方法,整个类,模块甚至整个应用程序。

从现在开始,当提到与写作测试有关的任何东西时,本书将指的是 自动的 程序形式的测试。

要写测试,您需要了解您实现的组件的功能,规范或要求。该组件可能是一个 活动, 分段, 查看模型 或者其中几个组件一起工作。这些可能以不同的形式出现,例如用户故事,用例或其他类型的文档。

测试是软件开发的重要组成部分。通过将测试与您的代码一起,您可以确保您的代码有效,稍后更改代码不会破坏它。测试可以让您在释放之前快速开发并捕获错误的态度。

基本上,写入测试有两种方法:

  • 写测试 你写了这个功能。
  • 写测试 你写了这个功能。

本书主要侧重于在实现功能后首先写入测试。

你为什么要测试?

写入测试可能需要更多的时间前面,它是您编写的代码,客户端不会“查看”,这就是为什么测试有时由开发人员跳过的原因。然而,测试可以加快沿着道路上的开发,它带来了一些优点。

改变/重构信心

您可能遇到了一个方案,您可以在为应用程序添加新功能之前与应用程序有关的部分。在添加新功能后,要么在 质量保证(QA) 或者在向客户发布之后,您发现此新功能突破了先前的工作部分。那被称为a 回归.

文件

一些公司和开发者,把测试作为一个补充文件,以解释功能的实现是如何工作的。你怎么老有良好的笔试,他们提供一个什么样的代码应该做的精彩描述。通过编写一个测试,它的实现,直到该功能完成重复此步骤,记住,这些测试可以看作是其规格来处理轴承,是怎么要求的旧重构或功能的改进将帮助您和您的团队。

如何编写测试

在写测试时有很多东西可以牢记。通过阅读本书并练习写作测试,您将理解它们。但是,写入测试的最重要方面如下:

fun whenAnsweringCorrectly_shouldIncrementCurrentScore() {
  ...
}
fun whenIncrementingScore_shouldIncrementCurrentScore() {
  val score = Score(0)

  score.increment()

  if (score.current == 1) {
    print("Success")
  } else {
    throw AssertionError("Invalid score")
  }
}
fun whenIncrementingScore_aboveHighScore_shouldAlsoIncrementHighScore() {
  val score = Score(0)

  score.increment()

  if (score.highest == 1) {
    print("Success")
  } else {
    throw AssertionError("Invalid high score")
  }
}

你应该怎么看?

您应该测试与应用程序的逻辑相关的代码。这可能包括您必须写入的代码:

经常打破的代码

如果您有一个没有测试的遗留项目,并且每当修改代码时,它会常常休息,对它们进行测试是有用的,因此下次您进行修改时,您将确保它不会继续断开。

将改变的代码

如果您知道某些代码将在不久的将来重构,则测试将在这里有用,因为如果您为此功能编写了测试,则可以支持它们以重新推荐代码并确保您不会打破任何内容。

你应该什么不测试?

外部依赖性

您应该假设已经测试了所有依赖项(库和框架,包括来自Android SDK的库)。因此,您不应该测试外部库的功能,因为目标是测试您控制的东西,而不是其他人创建的第三方工具。

自动化的代码

您不应该写入自动化代码的测试。在以前的原则之后,它应该是生成代码的库或工具正确测试。

你什么时候不测试?

重新指示/原型代码

通常,在编写最小的可行性产品(MVP)时,您应该专注于只需编写功能,以便客户可以感受到最终产品的内容。

代码您没有时间进行测试

这是一个有争议的话题。通常,开发人员陷入了一个Rut中,其中他们正在战斗火灾而不是主动编写质量代码,并且它们不会有时间解决代码质量。

代码飙升

在无意识的时候,你可能会发现自己与一个新的图书馆工作,或许,你可能会发现你不知道如何实现的东西。这使得它很难写你不足够了解你将如何实现写一个有意义的失败的测试功能的测试第一CONTRE。在这些情况下, 代码斯派克 可以帮助你解决问题。

什么是测试覆盖范围?

您可以测量运行测试时已执行应用程序的代码数量。具有高测试覆盖率百分比的应用程序“建议”它按预期工作并具有较低的含有错误的机会。

标准

要衡量,您可以选择几个覆盖范围。最常见的是:

fun getFullname(firstName: String?, lastName: String?): String {
  var fullname = "Unknown"
  if (firstName != null && lastName != null) {
    fullname = "$firstName $lastName"
  }
  return fullname
}

工具

有工具可以帮助您测量测试覆盖度量。

100%覆盖?

在真实世界的应用中,达到100%的测试覆盖率,无论您使用哪种标准,几乎都无法实现。它通常不会增加所有类别的所有方法的值。

data class Pet(var name: String)
fun whenCreatingPetWithName_shouldTheNameSetFromTheConstructor() {
  val aName = "Rocky"
  val aPet = Pet(aName)

  if (aPet.name == aName) {
    print("Success\n")
  } else {
    throw AssertionError("Invalid pet name")
  }
}

关键点

  • 测试是用于评估方法,整个类,模块甚至整个应用程序是否正确的过程。
  • 本书在实施功能前侧重于写作测试。
  • 您应该在重构时写下测试以确信。
  • 测试也充当应用程序功能的互补文档。
  • 您写的测试应该是短,简单的阅读和易于遵循。
  • 您只能编写与应用程序逻辑相关的测试。
  • 您可以使用测试覆盖工具来查找应测试的未测试代码。

然后去哪儿?

恭喜!现在,您应该了解测试是什么,为什么它和覆盖度量很重要。

有一个技术问题?想报告一个错误吗? 您可以向官方书籍论坛中的书籍作者提出问题和报告错误 这里.

有反馈分享在线阅读体验吗? 如果您有关于UI,UX,突出显示或我们在线阅读器的其他功能的反馈,您可以将其发送到设计团队,其中表格如下所示:

© 2021 Razeware LLC

您可以免费读取,本章的部分显示为 混淆了 文本。解锁这本书,以及我们整个书籍和视频目录,带有Raywenderlich.com的专业订阅。

现在解锁

要突出或记笔记,您需要在订阅中拥有这本书或自行购买。