私は数週間、Test Driven Development: By Exampleを読んでいます。今、私は第 31 章 - リファクタリングに固執しました。私の質問は、183 ページのデータの移行に関するものです。このトピックがわかりません。についての例TestSuite
も、これを理解するのに役立ちません。
移行データの意味と、TDD での使用方法を知りたいです。
[更新]本 Migrate Dataのコンテンツ
1 つの表現からどのように移行しますか? データを一時的に複製します。
方法: これは、内部から外部へのバージョンです。ここでは、表現を内部で変更してから、外部から見えるインターフェイスを変更します。
- 新しい形式でインスタンス変数を追加する
- 古いフォーマットを設定するすべての場所に新しいフォーマット変数を設定します
- 古い形式を使用するすべての場所で、新しい形式変数を使用します
- 古いフォーマットを削除する
- 新しい形式を反映するように外部インターフェイスを変更します
ただし、最初に API を変更したい場合もあります。次に、次のことを行う必要があります。 - 新しい形式でパラメーターを追加する - 新しい形式パラメーターから古い形式の内部表現に変換する - 古い形式パラメーターを削除する - 古い形式の使用を新しい形式に置き換える - 古い形式を削除する
理由: 1 対多では、毎回データ移行の問題が発生します。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)
ここでは、単一のテストの代わりにテストのリストを使用します。現在のテスト ケースでは、これはリファクタリングです (セマンティクスを保持します)。これは、コレクション内に要素が 1 つしかないためです。
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 に移行する場合のように、プロトコルが異なる同等のフォーマット間を移行する場合にも、段階的なデータ移行を使用できます。