Unit testing 单元测试操作的两面?

Unit testing 单元测试操作的两面?,unit-testing,Unit Testing,我刚刚开始单元测试。假设我有一个过滤器类来过滤掉盒子Box和BoxFilter的定义如下: class Box { double GetHeight() double GetWidth() double GetWeight() } class BoxFilter { void SetMaxHeight() void SetMaxWidth() void SetMaxWeight() bool PassesFilter(Box box) }

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

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设置不变 然后在每个测试中操作
属性,以验证其通过或失败。例如 将“最大高度、宽度和重量”设置为10,然后将长方体属性调整为“高于”或“低于” 10并坚持预期结果

或者,我可以保持
设置不变 操作
BoxFilter
设置

或者,我可以测试这两种情况:
BoxFilter
constant 以及更改
Box
,和
Box
常量和更改
BoxFilter

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

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


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

单元测试背后的理念是涵盖代码和用例。一般来说,您希望以最合理的方式尽可能简单、完整地完成这项工作

我的(个人)首选设置多个具有不同参数的
BoxFilter
s,以测试具有正、零和负参数的过滤器。对于每个
BoxFilter
,我将测试几个不同的
Box
es,也包括正、零和负参数,以确保捕获所有无效和边缘情况。然后d使用“正常”参数创建(至少)一个
Box过滤器
,并测试各种
Box
es,以确保正确的过滤器通过


很感谢您尽早考虑单元测试!我想您会发现它使开发更快、更容易、更愉快。

实际上,这在我脑海中提出了一个问题,如果您将SetMaxWeight传递为负权重,这对我来说是无效状态。如果使用小于0的权重调用SetMaxWeight,您会抛出异常吗结束时,你是否认为这是一个编程错误或用户错误。一般来说,异常捕获编程错误,不应该发生。你通常会检查和消毒所有的用户输入,并产生一个“友好”。如果无效,则会显示错误消息。如果您这样做,并且您决定永远不应使用无效输入调用
SetMaxWeight
,则可以引发异常。由于并非所有测试都使用相同的BoxFilter,我想与其使用设置方法,不如使用帮助器方法来创建框过滤器?我喜欢使用一个固定的过滤器和测试许多盒子,因为,你是对的,这是更常见的用例。