私はTDDを使って、Bit Vectorのような単純なものを開発することで、TDDを実践しようとしています。私はたまたまSwiftを使用していますが、これは言語に依存しない質問です。
My BitVector
は、struct
単一のを格納し、そのUInt64
上にコレクションのように扱うことができるAPIを提供します。詳細はさほど重要ではありませんが、非常に簡単です。上位57ビットはストレージビットであり、下位6ビットは「カウント」ビットであり、格納された値を実際に格納するストレージビットの数を示します。
これまでのところ、非常にシンプルな機能がいくつかあります。
- 空のビットベクトルを構築する初期化子
count
タイプのプロパティInt
isEmpty
タイプのプロパティ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
あり、公共のメンバーが有意義なテストを行うために必要な問題を即座に解決します。