我正在学习Android中的单元测试。
作为实践,我构建了一个简单的输入验证器类,用于检查电子邮件和密码输入的有效性。
有两个方法:
- isEmailValid(String email) -检查邮件不是空的,不是空的,是一个有效的邮件。
- isPasswordValid(String password) -检查密码是否为空
所以我想创建以下测试:
- email = " - return false
- email = null - return false
- email = "aaa" - return false
- email = "a@valid.email" -返回true
- password = " - return false
- password = null - return false
- password = "pass" - return true
我写对了吗?或者这是一种"过度测试"?
我认为这并不过分。这取决于它们是如何用JUnit代码编写的,以及代码最初是如何编写的。每个测试都检查不同的逻辑路径,Android以用户为中心,所以检查这些场景非常重要,因为用户会做出令人惊讶的事情。
例如,每个测试应该只执行单个断言,这通常是确保测试单个单元的良好实践。您测试过代码的错误处理部分了吗?有可能的分支吗?还可以使用ECLEmma检查代码覆盖率,以检查它是否充分覆盖了代码并提供了一个度量。这似乎只有在使用JUnit和标准启动器时才有效,这取决于您使用的环境,如果您只是在没有android代码的情况下进行JUnit测试。从使用Roboelectric的评论中可以找到另一种方法和教程,可以在这里找到代码覆盖。
您可能还想考虑使用Robotium执行可以测试用户交互的系统级(用户界面)测试。
我还会说阅读单元测试的一般内容。测试应该是隔离的,使用Mock对象将有助于这一点,并将改进代码中的依赖项注入。例如JMockit或Mockito。这将使您在使用SQLite等工具进行测试时更加轻松。使单元测试专注于测试单个类将改进依赖注入和您的整体设计。
测试还应该保持干净的代码标准作为您的应用程序代码,在那里它们应该是可读的,以便将来的用户理解。