作者: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中和编辑器中,进行自动的代码重构