【问题标题】:What to unit test - simple validation class单元测试什么 - 简单的验证类
【发布时间】:2015-08-08 06:53:23
【问题描述】:

我正在学习 Android 中的单元测试(以及一般性)。

为了练习,我构建了一个简单的输入验证器类,用于检查电子邮件和密码输入的有效性。

它有两种方法:

  • isEmailValid(String email) - 检查电子邮件不为空、不为空并且是有效的电子邮件。
  • isPasswordValid(String password) - 检查密码不为空或为空

所以我想创建以下测试:

  • email = "" - 返回 false
  • email = null - 返回 false
  • email = "aaa" - 返回 false
  • email = "a@valid.email" - 返回 true
  • password = "" - 返回 false
  • 密码 = null - 返回 false
  • password = "pass" - 返回 true

我做对了吗?或者这是“测试过度”?

【问题讨论】:

标签: android unit-testing


【解决方案1】:

我会说这并不过分。这取决于它们是如何用 JUnit 代码编写的,以及代码最初是如何编写的。每个测试都会检查不同的逻辑路径,并且由于 Android 以用户为中心,因此检查这些场景很重要,因为用户会做出令人惊讶的事情。

例如,每个测试应该只做一个断言通常是一种很好的做法,以确保它正在测试一个单元。 您是否测试过代码的错误处理部分?和任何可能的分支?

还可以考虑使用ECLEmma 检查您的代码覆盖率,以检查它是否充分覆盖了代码并提供一个指标。这似乎仅在将 JUnit 与标准启动器一起使用时才有效,这取决于您使用的环境,以及您是否只是在没有 android 代码的情况下进行 JUnit 测试。从使用 Roboelectric 的评论中,可以找到 here 的代码覆盖率的替代方法和教程。

您可能还想看看使用Robotium 来执行系统级(用户界面)测试,以测试用户交互。

我也想说阅读一般的单元测试。测试应该是隔离的,使用 Mock 对象将有助于这一点,并将改善代码中的依赖注入。例如JMockitMockito。在使用例如 SQLite 进行测试时,这些将使您的生活更轻松。使单元测试专注于测试单个类将改进依赖注入和您的整体设计。

测试还应将干净的代码标准作为您的应用程序代码,以便将来的用户可以阅读以理解它们。

【讨论】:

  • 感谢您的详细解答!这个简单的项目 IMO 不需要模拟。另外,我使用 RobolectricTestRunner,这样我就可以在我的 junit 测试中使用 TextUtils 等类
  • @dors 没问题。我添加了代码覆盖率和 Roboelectric 的链接。
猜你喜欢
  • 2015-10-01
  • 1970-01-01
  • 2017-05-23
  • 2019-12-18
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多