Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 我是否应该使用不应在函数中传递的数据进行单元测试(无效输入)?_Unit Testing_Testing_Tdd - Fatal编程技术网

Unit testing 我是否应该使用不应在函数中传递的数据进行单元测试(无效输入)?

Unit testing 我是否应该使用不应在函数中传递的数据进行单元测试(无效输入)?,unit-testing,testing,tdd,Unit Testing,Testing,Tdd,我正在尝试将TDD用于我的编码实践。我想问的是,我是否应该使用一个函数中不应该出现的数据进行测试,但该数据可能会破坏您的程序 下面是一个简单的例子来说明我的问题: 具有一个INT参数的ROBOT函数。在这个函数中,我知道有效范围仅为0-100。如果使用-1101,该函数将被中断 function ROBOT (int num){ ... ... ... return result; } 所以我为这个功能决定了一些自动测试用例 1. function ROBOT with input argum

我正在尝试将TDD用于我的编码实践。我想问的是,我是否应该使用一个函数中不应该出现的数据进行测试,但该数据可能会破坏您的程序

下面是一个简单的例子来说明我的问题:

具有一个INT参数的ROBOT函数。在这个函数中,我知道有效范围仅为0-100。如果使用-1101,该函数将被中断

function ROBOT (int num){
...
...
...
return result;
}
所以我为这个功能决定了一些自动测试用例

1. function ROBOT with input argument 0
2. function ROBOT with input argument 1
3. function ROBOT with input argument 10
4. function ROBOT with input argument 100
但是,如果我想在调用函数ROBOT的其他函数中保护它,我应该为这个ROBOT函数编写带有输入参数-1或101的测试用例吗

5. function ROBOT with input argument -1
6. function ROBOT with input argument 101
我不知道这是否必要,因为我认为测试-1和101是冗余的。如果真的需要涵盖所有情况,我必须编写更多的代码来保护-1和101


所以在TDD的常见实践中,您是否也会在-1和101上编写测试用例?

您说过,如果参数无效,您的方法将引发异常


因此,您应该这样做,因为您应该测试是否引发异常。

如果预期的结果是抛出带有无效输入值的异常,那么正确抛出异常的测试将是合适的

编辑:

正如我在下面的评论中所指出的,如果这些情况会破坏你的应用程序,你应该抛出一个异常。如果这些情况在逻辑上确实不可能发生,那么我会说不,您不需要抛出异常,也不需要测试用例来覆盖它


请注意,如果您的系统是组件化的,并且该函数是一个组件,那么现在在逻辑上不可能的事实并不意味着它在逻辑上总是不可能的。将来可能会有不同的用法。

如果其他代码防止错误地调用该方法,并且没有其他人会编写代码来调用该方法,那么我看不出有理由使用无效值进行测试。对我来说,这似乎是浪费时间。

是的,你应该测试那些无效的输入。但是,如果您的语言具有可访问性修饰符并且
ROBOT()
是私有的,那么您不应该测试它;您应该只测试公共函数/方法


功能测试技术称为边值分析

如果范围为0-100,则边界值为0和100。您至少应该测试:

  • 低于边界值
  • 边值
  • 高于边界值
在这种情况下:

-1,0,1,
99100101

假设-1到无穷大以下的所有对象行为相同,1-99之间的所有对象行为相同,101以上的所有对象行为相同。这称为等价分区。边界值之外和边界值之间的范围称为分区,您假设它们具有等效的行为


您应该始终考虑使用-1作为测试用例,以确保在参数不强类型的情况下,没有任何有趣的情况发生在负数和文本串上。同时尽可能早地验证数据

答案取决于您是否控制传递给Robot的输入。如果Robot是一个内部类(C#);值仅从RobotClientX流入,RobotClientX是一种公共类型。然后我会在RobotClientX中设置警卫检查,为其编写测试。我不会为Robot编写测试,因为无效值不能在两者之间具体化。 e、 g.如果我将验证放在GUI中,以便在源代码处过滤掉所有无效值,那么我不会检查GUI下所有类中的无效值(除非我还公开了绕过GUI的公共API)


另一方面,如果Robot是公开可见的,即任何人都可以用他们喜欢的任何值调用Robot,那么我需要测试来记录给定特定类型输入的Robot行为。。我是其中之一。e、 g.如果你传递一个超出范围的值,它会抛出一个ArgumentException。

我的答案是,不,你不想要异常,你不想让
ROBOT()
检查超出范围的输入。客户端应该表现良好,不会传入垃圾值

您可能想记录这一点——只需说客户机必须小心它们传递的值

此外,您将从何处获取无效值?用户输入或将字符串转换为数字。但在这些情况下,应该由转换例程执行检查并提供有关值是否有效的反馈。在这些值接近ROBOT()之前,应该保证它们在很长时间内都是有效的

契约式编程的设计和实现风格提请注意一个事实,即单个函数(方法)应该只负责某些事情,而不是所有事情。它调用(委托)和调用它的其他功能也有责任。这种职责划分是将编程任务划分为可单独执行的较小任务的核心。契约式编程的契约部分是函数的规范说明了当且仅当函数的调用方履行了该规范赋予调用方的职责时函数必须做什么。输入整数在[0100]范围内的要求就是这种要求

现在,单元测试不应该测试实现细节。他们应该测试功能是否符合其规范。这使得实现可以在不中断测试的情况下进行更改。它使重构成为可能

结合这两种思想,我们如何为给定某些特定无效输入的函数编写测试?我们应该检查函数是否按照特定的ATI运行