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 - Fatal编程技术网

Unit testing 这个场景中有多少个测试用例?

Unit testing 这个场景中有多少个测试用例?,unit-testing,Unit Testing,我有一个方法可以做很多事情,这意味着会产生很多副作用。例如,假设对RESTAPI的单个调用返回一个设置了许多字段的JSON对象。在这种情况下,如果我们想要检查每个单独的字段,我们应该有一个包含多个assertEquals的单一测试方法,还是应该有一个包含一个assertEquals的每个字段验证的单一测试方法 类似地,一个方法可能会有许多其他的副作用,例如,保存到数据库、发送电子邮件等。在这种情况下,我应该为每个副作用使用一个单元测试方法吗 此外,如果每个SUT方法有多个测试输入,那么这会影响创

我有一个方法可以做很多事情,这意味着会产生很多副作用。例如,假设对RESTAPI的单个调用返回一个设置了许多字段的JSON对象。在这种情况下,如果我们想要检查每个单独的字段,我们应该有一个包含多个assertEquals的单一测试方法,还是应该有一个包含一个assertEquals的每个字段验证的单一测试方法

类似地,一个方法可能会有许多其他的副作用,例如,保存到数据库、发送电子邮件等。在这种情况下,我应该为每个副作用使用一个单元测试方法吗

此外,如果每个SUT方法有多个测试输入,那么这会影响创建多少测试方法的决策吗

此外,它可能与故事有关,这意味着故事说,这个子功能属于故事,在这种情况下,它们不应该属于相同的测试方法吗?因为如果需求发生变化,那么每侧影响的所有测试方法也需要改变。这是可以管理的吗

在这种情况下,如果我们想要检查每个单独的字段,我们应该有一个包含多个assertEquals的单一测试方法,还是应该有一个包含一个assertEquals的每个字段验证的单一测试方法

担心测试用例中断言的数量就像担心函数中有多少行一样。这是复杂性的一阶近似值,但这并不是你真正应该关心的

您应该关心的是维护该测试有多困难,以及它的诊断有多好。当测试失败时,你能找出原因吗?这在很大程度上取决于您的
assertEquals
对大型数据结构的处理能力

json = call_rest();
want = { ...whatever you expect... };
assertEquals( json.from_json(), want );
如果这只是告诉你他们不平等,那就没什么用了。然后您必须手动进入并查看
json
want
。如果它同时转储了两种数据结构,这也不是很有用,你必须用肉眼去寻找差异

但如果它提供了两种数据结构的有用区别,那么这是有用的。例如,Perl的Test2将生成这样的诊断

use Test2::Bundle::Extended;

is { foo => 23, bar => 42, baz => 99 },
   { foo => 22, bar => 42, zip => 99 };

done_testing;

# +-------+------------------+---------+------------------+
# | PATH  | GOT              | OP      | CHECK            |
# +-------+------------------+---------+------------------+
# | {foo} | 23               | eq      | 22               |
# | {zip} | <DOES NOT EXIST> |         | 99               |
# | {baz} | 99               | !exists | <DOES NOT EXIST> |
# +-------+------------------+---------+------------------+
代码非常少,
want
非常清楚预期的内容

而“多重”变得非常冗长

json = call_rest();
have = json.from_json();
assertEquals( have['thiskey'], 23 );
assertEquals( have['thatkey'], 42 );
assertEquals( have['foo'], 99 );
...and so on...
很难知道哪个断言失败了,您必须通过行号或者(如果您的测试套件支持的话)手动命名每个断言,这需要更多的工作、更多的维护和更多的错误

Oto个人
assertEquals
允许更大的灵活性。例如,如果您只想检查某些字段,该怎么办?如果某个范围内存在可接受的值,该怎么办

# bar just has to contain a number
assert( have['bar'].is_number );
但是一些测试套件通过一个断言来支持这一点

want = {
    thiskey: 23,
    thatkey: 42,
    foo:     99,
    bar:     is_number
}

assertEquals( json.from_json, want );
is_number
是一个特殊的对象,它告诉assert这不是一个正常的质量检查,而只是检查值是否是一个数字。如果您的测试套件支持这种风格,那么它通常优于编写一堆断言。声明式方法意味着要编写、读取和维护的代码更少

json = call_rest();
want = { ...whatever you expect... };
assertEquals( json.from_json(), want );
答案是:这取决于你的测试工具有多好