我已经开始使用TDD。如先前的问题所述,最大的难点是处理接口更改。在需求变化时,如何减小测试用例的影响?
def test_add_item_to_order(self):
acct = Account('Joe', 'Bloggs')
shipping_addr = Address('123 Elm St', 'etc' 'etc')
order = Order(acct, shipping_addr)
item = OrderItem('Purple Widget')
order.addItem(item)
self.assertEquals([item], order.items)
转换为:
def make_order(self):
acct = Account('Joe', 'Bloggs')
shipping_addr = Address('123 Elm St', 'etc' 'etc')
return Order(acct, shipping_addr)
def make_order_item(self):
return OrderItem('Purple Widget')
def test_add_item_to_order(self):
order = self.make_order()
item = self.make_order_item()
order.addItem(item)
self.assertEquals([item], order.items)
我认为这是界面被过度使用的流行争论之一的原因之一。
然而,我不同意。
当需求发生变化时,测试也应该随之改变。对吧?我的意思是,如果你编写测试的标准不再有效,那么你应该重写或删除该测试。
我希望这可以帮到你,但我觉得我可能误解了你的问题。
会有影响。你必须接受改变界面将需要时间来首先更改相关的测试用例。这是无法避免的。
但是,如果你考虑后面不再试图在此界面中查找难以捉摸的错误并且不在发布周修复该错误所节省的时间,那么改变界面完全值得。
我们应该怎么做才能防止我们的代码和测试依赖于需求?似乎没有什么办法。每当需求发生变化时,我们就必须改变我们的代码和测试。但也许我们可以简化我们的工作?是的,我们可以。关键原则是:封装可能会改变的代码。
http://dmitry-nikolaev.blogspot.com/2009/05/atch-your-changes.html
在编写新接口的代码之前,您需要先编写测试。
如果您正在遵循测试优先的方法,理论上接口更改不应对您的测试代码产生影响。毕竟,当您需要更改接口时,您首先会更改测试用例以匹配要求,然后再更改接口/实现,直到测试通过。
当接口发生变化时,您应该预计测试会出现故障。如果太多的测试出现故障,这意味着您的系统耦合度过高,太多的事情依赖于该接口。您应该预计一些测试会出现故障,但不是很多。
测试出现故障是一件好事,任何代码的更改都应该导致测试出现故障。