Golang单元测试:你是使用合理值的模拟对象还是随机字段的模拟对象?

Golang单元测试:你是使用合理值的模拟对象还是随机字段的模拟对象? 在测试用户保存操作时,我的模拟用户对象类似这样:

mock := models.User{
    name: "a",
    email: "b",
    comment: "c",
    ID: 1,
    role: 2,
}

与创建一个具有实际合理名称“John Doe”、合理邮箱“jonhdoe@yahoo.com”、合理ID(345)等的模拟用户相比,哪种方式更好?

我喜欢使用非合理用户,因为这似乎能消除一些偏见,并提醒查看该测试的任何人:这些字段只是字符串或数字,可以具有任何值,我们必须适应各种奇怪的输入。

另一方面,合理的用户是否能让测试对人类读者来说更美观?您怎么看?您在生成代码中使用哪个版本?


更多关于Golang单元测试:你是使用合理值的模拟对象还是随机字段的模拟对象?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

是否有必要告知读者,字符串可以包含任意值,而不仅仅是看起来像真实姓名的值?我认为没有必要。使用能向读者说明其用途的测试数据,John Doe 可以做到这一点,而 a 则不行。

如果你的代码确实对值施加了限制,请为这些限制编写测试。

更多关于Golang单元测试:你是使用合理值的模拟对象还是随机字段的模拟对象?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在单元测试中,我倾向于使用合理值的模拟对象。原因如下:

  1. 可读性和维护性:合理值使测试意图更清晰。当测试失败时,开发者能快速理解测试场景。
  2. 边界条件测试:特殊边界值(如空字符串、极值)应单独测试,而不是混入常规测试中。
  3. 测试确定性:合理值确保测试可重复,避免随机值导致的间歇性失败。

示例代码:

// 使用合理值的测试
func TestUserSave_ValidUser(t *testing.T) {
    mockUser := models.User{
        Name:    "John Doe",
        Email:   "johndoe@example.com",
        Comment: "Regular user",
        ID:      345,
        Role:    2,
    }
    
    // 测试逻辑
    err := SaveUser(mockUser)
    if err != nil {
        t.Errorf("SaveUser failed: %v", err)
    }
}

// 边界条件单独测试
func TestUserSave_EmptyName(t *testing.T) {
    mockUser := models.User{
        Name:    "", // 明确测试空名称
        Email:   "test@example.com",
        ID:      346,
        Role:    2,
    }
    
    err := SaveUser(mockUser)
    if err == nil {
        t.Error("Expected error for empty name")
    }
}

对于随机数据测试,我会在以下情况使用:

  • 模糊测试(fuzzing)
  • 性能测试中的随机负载
  • 需要大量测试数据的场景

但在常规单元测试中,明确、合理的测试数据更能保证测试质量和可维护性。

回到顶部