Unit testing 如何在BDD下有效地使用case语句进行单元测试?
我对单元测试比较陌生,并且已经开始关注这样一个事实:当我有case语句时,我的测试代码的数量使我的生产代码相形见绌,其中某些对外部函数的调用是重复的,但参数不同,结果也不同。在我提出问题之后,如果一个名为calculateDeltas的公共函数的javascript伪代码格式不正确,请道歉。在下面的代码中,populateDeltas是一个私有函数,我正在通过calculateDeltas的测试间接测试它 我正在努力解决的问题如下: 1.我正在用4种不同的方法测试CalculateDelta,以覆盖4个不同的分支。 2.这样,我有效地测试了3次populateDeltas。对于每个测试的PopulateDelta都有一些断言,这些测试实际上是用不同的参数重复3次。 3.我的一个想法是在隔离状态下测试大众埃尔塔。在这种情况下,我现在不是在测试实现吗?更重要的是,如果我从来没有将整个函数calculateDeltas作为一个整体进行测试,我怎么知道整个函数是如何工作的? 4.即使这是一个好主意,如何简化我的CalculateDelta测试?我想我会以某种方式验证populateDeltas是否被调用。 5.在这种情况下,我如何验证calculateDeltas的输出是否是我在调用它的上下文中实际期望的结果? 6.换句话说,我如何知道calculateDeltas在没有对私有函数运行集成测试的情况下工作? 7.这难道不违反BDD的精神吗?BDD的精神是保护外部行为,而不是内部行为,而populateDeltas代表内部行为,而calculateDeltas代表外部行为 谢谢你的帮助,我有点迷路了。代码如下:Unit testing 如何在BDD下有效地使用case语句进行单元测试?,unit-testing,bdd,Unit Testing,Bdd,我对单元测试比较陌生,并且已经开始关注这样一个事实:当我有case语句时,我的测试代码的数量使我的生产代码相形见绌,其中某些对外部函数的调用是重复的,但参数不同,结果也不同。在我提出问题之后,如果一个名为calculateDeltas的公共函数的javascript伪代码格式不正确,请道歉。在下面的代码中,populateDeltas是一个私有函数,我正在通过calculateDeltas的测试间接测试它 我正在努力解决的问题如下: 1.我正在用4种不同的方法测试CalculateDelta,以
function calculateDeltas(){
var deltas = {status: this.rowStatus};
switch(this.rowStatus){
case 'new':
this.populateDeltas(deltas, 'new');
return deltas;
case 'changed':
deltas.key = this.key();
this.populateDeltas(deltas, 'changed');
return deltas;
case 'unchanged':
deltas.key = this.key();
this.populateDeltas(deltas, 'unchanged');
return deltas;
case 'deleted':
deltas.status = 'deleted';
return deltas;
}
在下面的代码中,populateDeltas是一个私有函数,我正在通过calculateDeltas的测试间接测试它
这常常令人困惑
需要注意的是,私有不是一个必要的工具。公共活动很好。真正地Python人非常高兴没有任何隐私。我们都是成年人
这难道不违反BDD的精神吗?BDD的精神是保护外部行为,而不是内部行为,而populateDeltas代表内部行为,而calculateDeltas代表外部行为
虽然BDD专注于外部行为,但您做出了创建私有共享函数的实现决策
您仍然可以执行BDD并测试这个私有的共享函数。只需测试所有四个案例。外部接口依赖于此内部接口
如果你想测试内部,没关系。这不是BDD,这只是个好主意
在BDD这一好想法的最低基线之上,有可能有好的想法。您可以添加到BDD,因为您可以在此处选择实现
换句话说,我如何知道calculateDeltas在没有对私有函数运行集成测试的情况下工作
这是一个相当愚蠢的问题。想得太多了。只需测试外部接口。如果外部函数使用内部私有函数,则外部测试将在正常事件过程中测试内部函数。编写多个测试以覆盖所有场景没有错
如果您担心的是对核心逻辑的过度测试,那么case语句的一种方法是用策略模式替换条件逻辑。在这个场景中,我将有一个类来处理每个场景的逻辑,然后将它们放在一个查找表中。最后的代码只是根据行状态执行处理程序。您可以轻松地测试此逻辑一次,然后为每个处理程序编写特定的测试 除了对最后一段和你的一般性建议感到困惑外,我什么都听懂了。通过测试外部函数,calculateDeltas,我认为这是需要完成的,因为这是我试图锁定的行为,我遇到了问题,因为我的测试基本上是每次调用内部填充的Eltas函数时“重新测试”一次,这就是我试图避免或以更合适的方式处理的。也许我缺少一种技巧?@glenn I:你为什么要避免重新测试?怎么了?我在重新测试,这就是我担心的地方。这只是导致我的测试代码与我的生产代码相比非常大。我读过类似于1或2:1的比率,我已经读过了,所以我很确定我做错了什么。@glenn I:在OO语言中,您可以在测试用例中使用继承来重用代码。还有1或2比1的比率,我已经超过了,这并不意味着什么。有些东西很小,很复杂,需要仔细测试。有些东西是大哑巴,或多或少可以通过检查来测试。使用继承。我会测试它,但是你可以 然后重构CalculateDelta。它有大量的重复。为了消除重复,您可能需要重新考虑对象。此外,如果使用依赖项注入,则可以模拟rowStatus,而不是将CalculateDelta依赖于rowStatus设置在外部某处。在这些重构之后,如何测试应该变得更加明显。