网站首页 > java教程 正文
单元测试是一种测试单个源代码单元以确保它们按预期工作的技术。单元测试帮助我们在bug和回归进入生产环境之前捕捉它们,这节省了时间和金钱。然而,为了确保从Java应用程序代码的单元测试中获得最大的好处,需要遵循某些最佳实践。
在编写代码之前先编写测试
这似乎违反直觉,但开发人员在用Java编写单元测试时可以做的最好的事情之一是在编写任何代码之前编写单元测试。这样,你可以考虑在开始编码之前需要测试什么。这也可以帮助你避免编写不必要的代码。
确定你的测试代码覆盖率
Java单元测试是基于它们的代码覆盖率进行评估的,这表明了它们覆盖的代码量,它是理解单元测试有效性的有用工具,可以帮助程序员改进它们。
为了弄清楚单元测试覆盖了整个应用程序中代码的百分比,你需要考虑两件事:1.你项目中的所有类;2.你或其他人对所有这些类的所有测试。
保持你的单元测试小而集中
在编写单元测试时,要记住的最重要的事情之一是使单元测试尽可能小且集中。开发人员的测试应该一次只测试一个特定的东西。这使得它们更容易编写和维护,而且如果发现bug,也更容易确定哪个测试失败。
将单元测试与外部依赖项隔离开来
当编写单元测试时,程序员最好将他们的测试与外部依赖隔离开来。外部依赖的典型例子是数据库、web服务和代码所依赖的其他软件组件。
当你试图测试你的代码的时候,让所有这些东西都运行起来是一件痛苦的事情。通过隔离单元测试,开发人员可以快速轻松地编写它们,而不必担心启动外部资源。隔离这些外部依赖关系的一种方法是使用mocks和stubs。
实施测试自动化
使用构建工具构建项目,如Maven或者Gradle可以使运行单元测试变得更容易。构建工具也可以用来自动化测试的运行,这可以节省你的时间。你可以利用持续集成服务器在每次代码被检入时自动运行你的单元测试。这确保了你的测试总是最新的,并有助于尽早发现bug。
避免测试实现细节
应该注意,在编写单元测试方法时,开发人员应该避免编写测试实现细节的代码。例如,如果你正在测试一个调用另一个方法的方法,你不应该测试第二个方法是如何实现的细节;这可能会导致测试很脆弱,很难维护。
模拟外部依赖
Mock允许你模拟应用程序中组件的行为,以最小化资源消耗并减少运行测试方法所需的时间。例如:你可能需要一个模拟用户存储库,以便模拟用户与实际不存在的真实用户存储库界面的交互。
程序员还可以使用mock测试web服务——例如,测试应用程序处理通过REST API调用发出的HTTP请求返回的错误的能力。为了隔离你的测试单元(即你尝试测试的对象),你需要模拟出它的所有依赖项,以便它们在测试期间不会实际调用任何外部对象。
例如,如果一个程序员正在为一个使用外部web服务的Java对象编写一个单元测试,那么在他们的测试代码中,他们会希望用一个虚拟的实现来替换那个web服务,以防止任何真正的流量到达实际的服务。这通常是使用Powermock、Mockito等模仿框架来完成的。
使用断言来验证单元测试的预期输出
当编写Java单元测试时,断言用于验证预期的输出。开发人员的代码不应该通过断言来验证;它们应该仅用于验证预期的结果。如果你发现自己在测试用例中使用断言来验证你的代码是正确的,那么这表明你测试应用程序的方式存在缺陷,并且可能意味着测试代码覆盖率很低。程序员应该利用适当的断言来验证预期结果和实际结果是否相同。
为测试方法提供有意义的名称
测试名应该是描述性的,但是不能太长。单元测试方法的名称应该描述测试的目的和期望的结果。这有助于开发人员容易地理解测试方法的意图。
保持单元测试是最新的
当Java代码发生变化时,保持单元测试的最新状态很重要。这可以通过定期运行测试并确保它们都通过来实现。
创建独立的代码测试
创建一套Java单元测试的第一步是确保它们相互独立。程序员应该能够以任何顺序运行他们想要的任何测试,并在合理的时间内让它通过或失败。这允许开发人员创建一组可以随时运行的测试,并且不需要等待其他依赖的单元测试。
这里的目标是让你的测试套件像你的代码库的自动化验收测试一样运行;如果一个单元测试通过了,那么一切都通过了。将单元测试放在它们自己的包中,远离生产代码。一般来说,让它们远离你的生产源代码是一个很好的做法。
只签入已经通过的单元测试
单元测试的第一条规则是:在将Java代码签入存储库或构建系统之前,确保单元测试通过。这是因为如果你不打算定期运行单元测试,那么编写代码并在以后添加单元测试是没有意义的。
当你这样做时,你会发现当你在其他地方进行更改时,你的代码将不可避免地中断——然后当其他人试图用这些中断的测试构建项目时,他们会得到错误提示。
关于Java单元测试的最后思考
遵循良好的编码实践,比如使用有意义的变量名和注释,将使你的Java代码更容易理解和维护。这将使你和其他开发人员在为代码编写单元测试时更加轻松。
如果按照推荐的最佳实践正确地进行单元测试,可以产生很好的结果。通过遵循这些单元测试技巧,程序员可以确保他们的测试保持最新,并在运行时提供有用的结果,从而为你的开发生命周期增加价值,并且不会随着时间的推移而成为维护开销。
猜你喜欢
- 2024-10-05 单元测试-(单元测试能发现约80的软件缺陷)
- 2024-10-05 Junit4入门之单元测试Junit介绍(junit4入门之单元测试junit介绍英文)
- 2024-10-05 五分钟技术趣谈 | Java常用的单元测试框架介绍
- 2024-10-05 「SpringBoot」 单元测试利器-Mockito
- 2024-10-05 如何使用Python进行单元测试(python单元测验答案)
- 2024-10-05 如何用TestNG进行java单元测试?(java中的test检测)
- 2024-10-05 干货篇-错过一次 错过一年!单元测试之Junit
- 2024-10-05 万字长文:一文详解单元测试干了什么
- 2024-10-05 一台不容错过的Java单元测试代码“永动机”
- 2024-10-05 新的单元测试工具已到位,Java程序员还不快来尝尝新?
你 发表评论:
欢迎- 最近发表
-
- 你真的会用 Java 中的线程池吗?多个企业级线程池工具类封装实践
- 线程池的实现原理、优点与风险、以及四种线程池实现
- Java线程池ThreadPoolExecutor实现原理剖析
- 深入分析线程池的实现原理(线程池是干嘛的)
- 一文搞懂JAVA线程池工作原理(java线程池的工作流程)
- Java线程池的工作原理(java线程池的实现原理)
- 5分钟读懂C#中TcpClient、TcpListener和Socket三个类的角色
- JVM对象的创建过程(jvm运行过程中创建的对象一般存放在方法区)
- 对象组成与Java内存模型JMM分析(java对象在内存中存储的结构)
- JVM对象内存分配详细过程(栈上分配->TLAB->老年代->Eden区)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)