ruby tdd处理过时测试的最佳实践

时间:2014-07-25 15:18:16

标签: ruby unit-testing

我在Code Wars中遇到了一个非常基本的挑战。挑战在于测试驱动一个返回正方形数组之和的方法。

到目前为止,我的测试是:

describe "square method" do   
  it "should return the square of a number" do

    Test.assert_equals(squareSum(4), [16])

  end

  it "should return the square of multiple numbers" do 

    Test.assert_equals(squareSum(4, 2, 3), [16, 4, 9])

  end
end

我的代码是:

def squareSum(*numbers)
  numbers.map { |num| num ** 2 }
end

现在我正处于需要更改它的位置,以便增加总和。在我看来,这必然会否定之前的两个测试。至于TDD最佳实践,我是否对前两个场景进行了荒谬的测试,因为它们不是我想要的方法吗?我该如何进行下一次测试?

我应该:

  • 删除前两个测试,因为一旦我改变方法它们就会失败?
  • 找到一种方法,使之前的两个测试一旦我改变它就不会失败?

在解决这个问题时,我应该不担心前两个测试吗?我在解决这个问题时遇到了相当大的困难。基本上,我知道我最终想要的是:

describe "squareSum method" do 
  it "should return the sum of the squares of the numbers passed" do 

    Test.assert_equals(squareSum(1, 2, 2), 9)

  end
end

使用代码使其工作。我只是想知道测试驱动这种特殊问题的最佳实践是什么,因为我想测试我可以在返回总和之前返回多个数字的正方形。我的“最终”代码将使初始测试过时。这是一个“我应该在最终的解决方案中出现多少工作?”,我认为,这是一种挑剔的肛门保留问题。但我很好奇。

1 个答案:

答案 0 :(得分:1)

由于测试是您打算编写的软件的规范,因此问题是您为不想要的东西编写规范的原因(因为挑战的任务不是编写一个使其参数正方形的函数)? / p>

你应该首先为“一个返回正方形数组之和的方法”编写一个规范。这个测试开始是红色的。

然后你可能决定需要一个将其参数(或给定数组的元素)作为中间步骤的函数。为此功能编写测试。通过实现这样的功能使其变为绿色。

最终将所有内容放在一起并使初始测试变为绿色(主函数可以使用辅助函数并总结其返回值)。

不,你可以重构。如果在重构期间您决定不再需要辅助函数:删除该函数并删除其测试。

此外,当您的规格发生变化时,您需要重写测试,编写新测试甚至删除其中一些测试。

但一般规则是:测试始终是软件当前状态的规范。他们应该准确指定您的软件的目的。没什么,没什么。