Skip to content

程序测试

测试系统功能是为了确保系统或软件的各个部分都能按照设计和需求正常工作的一个过程。

这个过程可以帮助开发人员和测试人员发现和修复系统中的缺陷、错误或其他问题,确保其稳定性、性能和可靠性。此外,它也确保软件能够满足用户的需求和预期。

下图对于各种类型最佳测试方式的总结:

  1. 单元测试:确保代码的各个单元能够独立地正常工作。
  2. 集成测试:确保系统的各个部分能够和谐地协同工作。
  3. 系统测试:全面检测系统是否满足用户的需求和期望的性能。
  4. 负载测试:检测系统在高负载情况下的表现,并找出性能问题。
  5. 错误测试:观察软件如何处理非法输入和出现的错误情况。
  6. 自动化测试:为了提高效率、确保测试的重复性并减少出错,自动执行测试流程。

单元测试

摘录维基百科:在计算机编程中,单元测试又称为模块测试,是针对程序模块来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类、抽象类、或者派生类中的方法。

单元测试(Unit Testing)顾名思义就是测试一个单元,这里的单元通常指一个函数或类,区别于集成测试中的模块和系统。集成测试的测试过程通常存在跨系统模块的调用,是一种端到端的测试;而单元测试关注对象的颗粒度较小,用来保障一个类或者函数是否按照预期正确的执行。

简单来说,在 Java 中,一个类就是一个单元。开发者编写的一小段代码,用来检验某个类中的某个方法是否正确执行。可以让符合条件的方法独立运行(不依赖 main 方法)。

单元测试框架

Java 中存在很多单元测试框架,每种框架有着自己独特的特点,根据不同的需求和团队要求,所使用的框架不尽相同,目前主流的测试框架有且不仅有以下几种:

JUnit

JUnit 是 Java 中最常用的单元测试框架。该框架提供了丰富的测试与断言方法,例如:assertNull、assertTrue、assertEquals 等,使用方法比较简单。JUnit 目前已经更新到 JUnit5 版本,该版本提供了更多的新特性,例如:动态测试,依赖注入等,使得该框架更为健壮。

官网介绍:https://junit.org/junit5/

TestNG

TestNG 是 Java 中的另一种测试框架,使用的较为小众。该框架的设计是受了 JUnit 的启发,初衷是为了更好地支持从单元测试到集成测试的各个方面,用来完成一些 JUnit 所不能完成的测试任务。该框架较 JUnit 相比,功能更加强大,提供了更多的高级特性,例如:测试套件、数据驱动测试、依赖测试、并行测试等。在更复杂的测试场景(如参数化测试、依赖测试等)中,TestNG 的表现更加优异。

官网介绍:https://testng.org/

Spock

Spock 是基于 Groovy语言编写的测试框架,该框架可以用来测试 Java 和 Groovy 的代码程序。Spock 用来写测试代码的语言十分优美、表达力强,这一优点大大提高了测试代码的可读性和可维护性。Spock 框架融合了 JUnit、jMock、RSpec、Groovy、Scala 和 Vulcans 等多种框架和语言的优点,旨在提供一套强大的测试平台。

官网介绍:https://spockframework.org/

Mockito

Mockito 不是一个完整的单元测试框架,而是专注于 mock 对象的创建、验证。它通常与 JUnit 或 TestNG 结合使用来简化对复杂依赖的测试。是目前最主流的测试框架。

官网介绍:http://site.mockito.org/

EasyMock

EasyMock 是一套通过简单方法对于给定的接口生成 mock 对象的类库,通过使用 Java 代理机制动态生成模拟对象。该框架提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序等,还可以令 mock 对象返回指定的值或抛出指定异常。开发者通过 EasyMock 可以方便的构造 mock 对象而忽略对象背后真正的业务逻辑。一般情况下,EasyMock 与 JUnit 或 TestNG 配合使用。

官网介绍:https://easymock.org/

PowerMock

PowerMock 是一种用于 Java 单元测试的框架,它扩展了其他 mocking 框架的能力,比如 EasyMock 和 Mockito。PowerMock 的主要特点是它可以 mock 静态方法、私有方法、final 方法、构造函数,甚至系统类(如 System、String 等),这些通常是传统 mocking 框架所做不到的。有了这些功能,PowerMock 在一些复杂场景下进行单元测试更加方便。虽然 PowerMock 提供了强大的功能,但由于它修改了类加载器和字节码操作,可能会导致一些测试方法与 JVM 或第三方库之间的兼容性问题。所以在使用 PowerMock 时需要权衡其提供的功能和可能带来的复杂性。

ps:由于 PowerMock 的执行速度问题(每个测试类都需要重启 spring 的 TestContext),我们团队内部不建议使用该框架。

官网介绍:https://github.com/powermock/powermock

JMock

JMock 是一种用于Java单元测试的框架,属于一种轻量级框架,该框架采用了行为驱动开发(BDD)的测试风格。用来在单元测试中 mock 接口或类的依赖项,对代码进行隔离测试,而无需关心整个系统的其他部分。JMock 支持通过声明式的方式来指定对象间的交互行为。

官网介绍:http://jmock.org/

I know where dry desert ends, green grass grows · MooN