Unit testing 数据库单元测试

Unit testing 数据库单元测试,unit-testing,go,Unit Testing,Go,我希望得到一些关于单元测试的建议,我正在编写单元测试来测试一些db条目 如果找不到记录,我正在测试的函数将为数据库种子 func Seed(db *gorm.DB) { var data []Data db.Find(&data) if len(data) == 0 { // do seed default data } } 我似乎不太想去做的是如果len测试的话。我正在使用一个测试数据库,所以我可以在任何时候使用它,所以如果我只需要在函

我希望得到一些关于单元测试的建议,我正在编写单元测试来测试一些db条目

如果找不到记录,我正在测试的函数将为数据库种子

func Seed(db *gorm.DB) {
    var data []Data
    db.Find(&data)

    if len(data) == 0 {
      // do seed default data
    }

}
我似乎不太想去做的是如果len测试的话。我正在使用一个测试数据库,所以我可以在任何时候使用它,所以如果我只需要在函数上强制使用一个空数据库,这就不是问题

这个函数本身是有效的,我只是想确保我能做到这一点

任何建议都很好


谢谢

这要视情况而定,根据您的风险水平和您想投入多少时间来缓解这些风险,有很多方法可以解决这一问题

  • 您可以编写一个单元测试,断言您能够在没有任何数据库的情况下检测用户逻辑并对其进行操作(即空时播种,满时忽略)
  • 如果您想测试逻辑以及您的程序通过
    gorm
    库与mysql正确对话的能力,您可以:
    • 在数据库中没有用户的情况下调用
      Seed
      进行测试,调用后,测试可以从
      users
      中进行选择,并确保有从
      len(users)==0创建的预期条目
    • 进行一个测试,其中该测试创建一个条目并调用
      Seed
      ,然后断言基础表为空


它可能会变得更复杂。如果
Seed
选择了数据子集,则测试可能会插入两个用户,一个合格,一个不合格,并确保没有新用户被
Seed
定义。

用户在哪里?不要在测试中使用数据库。使用一个模拟。就是我用的那个。其他任何东西实际上都不是单元测试。谢谢Flimzy,我将看看sqlmock。谢谢你的建议。我明天会试试的。听起来是个不错的选择。因为每当测试运行时,dB只是在容器中旋转,所以数据并不重要。谢谢我会告诉你事情的进展。