在TDD上迁移数据意味着什么?

时间:2012-07-02 14:09:22

标签: tdd

我一直在阅读Test Driven Development: By Example几周。现在,我坚持第31章 - 重构。我的问题是关于迁移数据的信息,请参阅第183页。我不明白这个主题。关于TestSuite的示例也无法帮助我理解这一点。

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


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

你如何摆脱一种表现形式?暂时复制数据。

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

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

但有时候,您希望首先更改API。然后你应该:   - 以新格式添加参数   - 从新格式参数转换为旧格式内部表示   - 删除旧格式参数   - 用旧格式替换旧格式的使用   - 删除旧格式

为什么: 一对多每次都会产生数据迁移问题。假设我们想要 使用One to Many实现TestSuite。我们将从:

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

通过以下方式实现(在One to Many的“One”部分中):

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 / 迭代器。

1 个答案:

答案 0 :(得分:0)

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

正如书中所说, 示例正在从一个变为多个,例如你已经为一个测试做了一个场景,现在你想改进它以处理N个测试。所以现在你必须将数据表示从Test实例变量改为(迁移)到List<Test>。进行此更改可以从内到外或从外到内的方式逐步完成

  • 外部(首选) - 在新表示中为现有API添加额外参数(例如,将基元从基元更改为自定义结构)。让所有客户编译。重新连接API的内部以使用旧的param使用旧的param(另一个选项是复制,以便您暂时使用它们)。很快你的IDE就会告诉你旧的(原始)参数不再被使用了。此时,您可以安全地删除该参数。这个想法是通过重构来保留代码的行为。