单元测试的艺术是什么呢?

2023-11-13 16:06:39 浏览数 (2)

01

单元测试的艺术

一个单元测试是一段自动化的代码,这段代码是调用被测试的动作单元,之后对这个单元的单个最终结果的某些假设进行校验。单元测试几乎都是用单元测试框架编写的;只要产品代码不发生变化,单元测试的结果是稳定的。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等。

02

单元测试怎么写呢?

遵守三A原则:Arrange, Act, Assert

Arrange(准备): 创建和配置必要的对象、设置输入数据等。

Act(执行):执行要测试的代码或功能,通常是调用函数或方法,并提供必要的输入数据。

Assert(断言):检查执行的代码是否产生了预期的结果。

写一个demo,看看如何写单元测试呢?

03

一些概念介绍

值测试

  • 关注点:验证方法的返回值或输出是否等于预期的值。
  • 示例:通过比较方法返回的值与期望的值来确认方法是否按预期工作。

状态测试

  • 关注点:验证方法执行后对象或系统的内部状态是否处于预期的状态。
  • 示例:检查对象的属性、变量或状态是否发生了正确的变化。

行为测试

  • 关注点:验证方法是否按照预期进行了调用和交互,而不关心方法的返回值或内部状态。
  • 示例:检查方法是否正确调用了其依赖项、是否发生了期望的交互。

如果不进行行为测试,可能会出现以下问题:

  1. 验证未正确测试:无法确定用户输入验证是否正确。如果验证出现问题,无效的用户可能会被注册。
  2. 数据库交互问题:无法验证是否正确地将用户信息保存到数据库中。如果保存失败,可能导致数据不一致。
  3. 邮件发送问题:无法验证是否正确地发送了欢迎邮件。如果邮件发送失败,用户可能不会收到通知。
代码语言:javascript复制
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;

public class CartServiceTest {

    @Test
    public void testAddProductToCart() {
        // 创建购物车对象
        ShoppingCart cart = new ShoppingCart();

        // 创建一个模拟的商品对象
        Product product = Mockito.mock(Product.class);
        when(product.getPrice()).thenReturn(10.0);

        // 创建购物车服务对象
        CartService cartService = new CartService();

        // 调用购物车服务的添加商品方法
        cartService.addProductToCart(cart, product);

        // 使用状态验证检查购物车的总金额是否正确
        assertEquals(10.0, cart.getTotalAmount());
    }

    @Test
    public void testRemoveProductFromCart() {
        // 创建购物车对象
        ShoppingCart cart = new ShoppingCart();

        // 创建两个模拟的商品对象
        Product product1 = Mockito.mock(Product.class);
        when(product1.getPrice()).thenReturn(10.0);

        Product product2 = Mockito.mock(Product.class);
        when(product2.getPrice()).thenReturn(5.0);

        // 创建购物车服务对象
        CartService cartService = new CartService();

        // 添加商品到购物车
        cartService.addProductToCart(cart, product1);
        cartService.addProductToCart(cart, product2);

        // 调用购物车服务的移除商品方法
        cartService.removeProductFromCart(cart, product1);

        // 使用状态验证检查购物车的总金额是否正确
        assertEquals(5.0, cart.getTotalAmount());
    }
}

在这个示例中,我们测试了购物车服务的两个行为:

1.testAddProductToCart

测试了将商品添加到购物车的行为。我们使用了模拟的商品对象,并使用行为验证来验证购物车的总金额是否正确计算。

2.testRemoveProductFromCart

测试了从购物车中移除商品的行为。我们首先将两个商品添加到购物车中,然后使用行为验证来验证购物车的总金额是否在移除商品后正确更新。这些行为测试确保购物车和购物车服务的不同组件之间正确地进行了交互,以及系统的行为是否符合预期。

测试顺序参考

0 人点赞