0

几周以来,我一直在阅读测试驱动开发:示例。现在,我坚持第 31 章——重构。我的问题是关于第 183 页上的迁移数据。我不明白这个主题。关于的例子TestSuite也不能帮助我理解这一点。

我想知道迁移数据是什么意思以及如何在 TDD 中使用它。


[更新] 迁移数据一书中的内容

你如何从一种表现形式转变?临时复制数据。

如何: 这是内部到外部的版本,您可以在内部更改表示,然后更改外部可见的界面:

  • 以新格式添加实例变量
  • 在您设置旧格式的任何地方设置新格式变量
  • 在使用旧格式的任何地方使用新格式变量
  • 删除旧格式
  • 更改外部接口以反映新格式

不过,有时您想先更改 API。那么您应该: - 添加新格式的参数 - 从新格式参数转换为旧格式内部表示 - 删除旧格式参数 - 用新格式替换旧格式的使用 - 删除旧格式

原因: 一对多每次都会产生数据迁移问题。假设我们想使用一对多来实现 TestSuite。我们将从:

def testSuite(self):
suite= TestSuite()
suite.add(WasRun("testMethod"))
suite.run(self.result)
assert("1 run, 0 failed" == self.result.summary())

通过以下方式实现(在一对多的“一”部分):

class TestSuite:
def add(self, test):
self.test= test
def run(self, result):
self.test.run(result)

现在我们开始复制数据。首先我们初始化测试集合:

TestSuite
def __init__(self):
self.tests= []
Everywhere “test” is set, we add to the collection, too:
TestSuite
def add(self, test):
self.test= test
self.tests.append(test)

现在我们使用测试列表而不是单个测试。出于当前测试用例的目的,这是一种重构(它保留了语义),因为集合中只有一个元素。

TestSuite
def run(self, result):
for test in self.tests:
test.run(result)

我们删除现在未使用的实例变量“test”:

TestSuite
def add(self, test):
self.tests.append(test)

在具有不同协议的等效格式之间移动时,您还可以使用逐步数据迁移,例如从 Java 的 Vector/Enumerator 移动到 Collection/Iterator。

4

1 回答 1

1

这是一种重构,您希望更改数据的表示方式。

正如书中所说,一个例子是从一个转移到多个,例如你已经为一个测试制作了一个场景,现在你想改进它来处理 N 个测试。因此,现在您必须将数据表示形式从 Test 实例变量更改(迁移)为List<Test>. 可以通过由内而外或由外而内的方法逐步完成此更改

  • Outside in (preferred) - 在新表示中向现有 API 添加额外参数(例如,您将参数从原始结构更改为自定义结构)。让所有客户端编译。重新连接 API 的内部以在使用旧参数的地方使用新参数(另一种选择是复制,以便暂时使用两者)。很快,您的 IDE 应该会告诉您旧的(原始)参数已不再使用。那时,您可以安全地删除该参数。这个想法是通过重构来保留代码的行为。
于 2012-07-03T06:34:59.590 回答