【问题标题】:Regarding unit testing best practices关于单元测试最佳实践
【发布时间】:2015-02-18 17:01:41
【问题描述】:

我的任务是测试现有应用程序,过去我也用自己的应用程序测试过,但我有点不确定我是否使用了正确的方法。

假设我有以下示例:

users 类有一个名为getAll() 的函数,它通过查询数据库返回用户列表。有(据我所知)两种直接的方法来测试这个功能:

  • 在单元测试中独立使用getAll() 函数使用的相同查询代码。然后,执行getAll() 调用并断言结果。

  • 让数据提供者提供具有预期格式的单元测试数据,硬编码为我们知道包含在数据库中的值。例如,我们将传递一个硬编码数组,其中包含 getAll() 函数期望格式的所有用户,并断言结果。

虽然第二种方法看起来更符合测试,但它的附加结果是增加了一层安全风险。任何有权访问测试套件的人也可以明文访问许多潜在的敏感数据。最重要的是,根据数据库大小的查询,像上面这样的查询可能会因为很少的原因使测试变得荒谬可笑。

哪种方法是首选?

【问题讨论】:

  • 如果您需要一些数据库来测试您的代码,那么您所拥有的当然是集成测试而不是单元测试。
  • @unigeek 这根本没有帮助-尽管您在技术上是正确的。在这一点上,存根数据库将是一项巨大的工作(它是一个相对成熟的应用程序),我看不出在这种情况下使用存根或真实连接之间的区别,因为值必须相同。
  • @user991710 如果您不了解区别可能会有所帮助-我确实看到您在问题标题中提到了“单元测试”,因此对我来说您确实并不明显。我喜欢在单元测试中提供帮助——发现这个贴错标签会花费我很多时间。

标签: unit-testing testing automated-tests


【解决方案1】:

在这两种方法中,您建议使用真实数据库并比较结果。我认为正确的单元测试应该能够在不连接到真实资源的情况下验证功能行为。我建议将连接字符串(可能是函数参数)更改为具有类似用户表的某个测试数据库并验证函数行为。这样您就不会遇到任何安全风险,并且单元测试(或测试)将是独立的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多