私はTDDを使って、Bit Vectorのような単純なものを開発することで、TDDを実践しようとしています。私はたまたまSwiftを使用していますが、これは言語に依存しない質問です。
My BitVectorは、struct単一のを格納し、そのUInt64上にコレクションのように扱うことができるAPIを提供します。詳細はさほど重要ではありませんが、非常に簡単です。上位57ビットはストレージビットであり、下位6ビットは「カウント」ビットであり、格納された値を実際に格納するストレージビットの数を示します。
これまでのところ、非常にシンプルな機能がいくつかあります。
- 空のビットベクトルを構築する初期化子
countタイプのプロパティIntisEmptyタイプのプロパティBool- 等号演算子(
==)。注意:これは、JavaのObject.equals()ような参照等価演算子ではなく、==Javaのような値等価演算子です。
私は周期的な依存関係の束に直面しています:
イニシャライザをテストする単体テストでは、新しく構築されたを確認する必要があり
BitVectorます。次の3つの方法のいずれかで実行できます。- チェック
bv.count == 0 - チェック
bv.isEmpty == true - それを確認します
bv == knownEmptyBitVector
方法1は依存
count、方法2は依存isEmpty(それ自体が依存しているcountため、使用する意味はありません)、方法3は依存してい==ます。いずれにしても、初期化子を単独でテストすることはできません。- チェック
のテストは
count何かを操作する必要があり、必然的に私のイニシャライザーをテストしますの実装は、に
isEmpty依存していますcountの実装はに
==依存していcountます。
BitVector(aとしてUInt64)既存のビットパターンからを構築するプライベートAPIを導入することにより、この問題を部分的に解決することができました。これにより、他のイニシャライザーをテストせずに値を初期化できたので、「ブートストラップ」することができました。
ユニットテストが本当にユニットテストであるためには、たくさんのハックをしていることに気付きます。
この種の問題をどのように正確に回避しますか?
BitVectorは単体テストに最適なユニットサイズでBitVectorあり、公共のメンバーが有意義なテストを行うために必要な問題を即座に解決します。