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
在单元测试中,我倾向于使用合理值的模拟对象。原因如下:
- 可读性和维护性:合理值使测试意图更清晰。当测试失败时,开发者能快速理解测试场景。
- 边界条件测试:特殊边界值(如空字符串、极值)应单独测试,而不是混入常规测试中。
- 测试确定性:合理值确保测试可重复,避免随机值导致的间歇性失败。
示例代码:
// 使用合理值的测试
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)
- 性能测试中的随机负载
- 需要大量测试数据的场景
但在常规单元测试中,明确、合理的测试数据更能保证测试质量和可维护性。

