提取函数让测试简单

作者:Andrew Trenk

原文链接:http://googletesting.blogspot.tw/2007/06/tott-extracting-methods-to-simplify.html

当一个方法很长、很复杂时,会难以测试。通过提取方法可以使这个方法变得简单:即在现有的复杂方法(或函数)中寻找某些代码,这些代码可以由方法调用(或函数调用)来替换。参考下面这个复杂的方法:

def GetTestResults(self):
# 检查结果是否在缓存中了
   results = cache.get('test_results',None)
   if results is None:
# 缓存中没有结果,所以检查数据库
     results =db.FetchResults(SQL_SELECT_TEST_RESULTS)
# 统计通过的和失败的测试个数
   num_passing = len([r for r in resultsif r['outcome'] == 'pass'])
   num_failing = len(results) -num_passing
   return num_passing, num_failing

这个方法难以测试,因为它不仅依赖于数据库,而且依赖于缓存。此外,它还要返回一些对检索处理的结果。方法可以重构的第一个提示是有丰富的注释。提取方法的部分代码,放入命名良好的方法中,能够降低原方法的复杂度。当复杂度降低,注释往往就变得不那么必要了。例如,请看下面这种情况:

 def GetTestResults(self):
   results =self._GetTestResultsFromCache()
   if results is None:
     results =self._GetTestResultsFromDatabase()
   return self._CountPassFail(results)

 def _GetTestResultsFromCache(self):
   return cache.get('test_results', None)

 def _GetTestResultsFromDatabase(self):
   returndb.FetchResults(SQL_SELECT_TEST_RESULTS)

 def _CountPassFail(self, results):
   num_passing = len([r for r in resultsif r['outcome'] == 'pass'])
   num_failing = len(results) -num_passing
   return num_passing, num_failing

现在,通过测试每个被提取出来的方法,测试就可以关注原方法的每个独立片段。这有利于提高方法的可读性和可维护性。

(注:在python中,方法调用可以自动的通过开源浏览器BicycleRepairMan进行重构;在Java中,可以使用多种IDE,包括 IntelliJ IDEA和 Eclipse。)

词语解释:

BicycleRepairMan:被打包成一个库,可以被添加到ide中和编辑器中,进行自动的代码重构。


:被打包成一个库,可以被添加到ide中和编辑器中,进行自动的代码重构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值