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,我想与其使用设置方法,不如使用帮助器方法来创建框过滤器?我喜欢使用一个固定的过滤器和测试许多盒子,因为,你是对的,这是更常见的用例。