【问题标题】:Unit Testing both sides of operation?单元测试双方的操作?
【发布时间】:2011-07-17 08:51:12
【问题描述】:

我刚刚开始进行单元测试。假设我有一个过滤器类来过滤掉盒子。 BoxBoxFilter 的定义如下:

class Box
{
    double GetHeight()
    double GetWidth()
    double GetWeight()
}

class BoxFilter
{
    void SetMaxHeight()
    void SetMaxWidth()
    void SetMaxWeight()
    bool PassesFilter(Box box)
}

因此,如果一个盒子没有超过各种最大阈值,那么它就会通过过滤器。

我的问题是关于为BoxFilter 类的PassesFilter 方法编写单元测试。 我可以在 SetUp() 方法中创建 BoxFilter 并保持 BoxFilter 设置不变并且 然后在每个测试中操作Box 属性以验证它是通过还是失败。例如, 将最大高度、宽度和重量设置为 10,然后将框属性调整为高于或低于 10 并断言预期的结果。

或者,我可以保持 Box 设置不变并且 操纵BoxFilter 设置。

或者,我可以测试这两种情况:BoxFilter 常量 并更改BoxBox 常量并更改BoxFilter

单元测试的正确方法是什么 方法?我还想测试一系列值,而不仅仅是说 10?

【问题讨论】:

    标签: unit-testing


    【解决方案1】:

    单元测试背后的想法是同时涵盖代码和用例。一般而言,您希望尽可能简单和完整地执行此操作,以任何看起来最合理的方式。

    我(个人)的偏好是设置多个具有不同参数的BoxFilters 来测试具有正、零和负参数的过滤器。对于每个BoxFilter,我会测试几个不同的Boxes,同时使用正、零和负参数,以确保您已经捕获了所有无效和边缘情况。然后我会创建(至少)一个带有“正常”参数的BoxFilter 并测试各种Boxes 以确保正确的通过过滤器。

    感谢您尽早考虑单元测试!我想您会发现它让开发变得更快、更轻松、更愉快。

    【讨论】:

    • 实际上这在我脑海中提出了一个问题,如果您将 SetMaxWeight 传递为负权重,这对我来说是无效状态。如果使用小于 0 的权重调用 SetMaxWeight 会抛出异常吗?
    • 这取决于你认为是编程错误还是用户错误。通常,异常会捕获不应该发生的编程错误。您通常会检查并清理所有用户输入,如果无效则生成“友好”错误消息。如果您这样做,并且您决定永远不应使用无效输入调用 SetMaxWeight,那么抛出异常就可以了。
    • 由于不是所有的测试都使用相同的 BoxFilter,我猜你会使用辅助方法来创建盒子过滤器,而不是使用 setup 方法?
    【解决方案2】:

    我想说这只是一个偏好问题,因为您更改值的方式实际上并不影响您正在测试的逻辑。每次调用 PassesFilter() 时,只有框和过滤器的 当前 值很重要 - 值相对于周围测试的变化方式无关紧要。另一方面,如果您正在测试实际处理大小随时间变化的代码,则应该同时测试两种方式。

    最重要的是您测试极端情况 - 但是您是否通过测试固定过滤器来做到这一点,例如8.0 与 7.99999、8.0 和 8.00001 或其他方式的盒子大小无关(不过,我个人会选择固定过滤器和可变盒子,因为常见的用例可能是创建一个过滤器,然后通过它传递许多框)。

    【讨论】:

    • 我喜欢使用固定过滤器和测试许多盒子背后的原因,因为您说得对,这是更常见的用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2013-09-22
    • 1970-01-01
    • 2017-10-14
    • 2014-02-27
    相关资源
    最近更新 更多