私はあなたがここで正しい道を進んでいると思います。コードが機能することを証明するためのテストでは、プログラムが通常の状態で、意味のある、意味のある、期待される入力を持つメソッドを呼び出します。コードを解読するためのテストでは、そのコードについて「箱から出して」考えようとします。したがって、意味のない、または予期しない入力を使用します。
しかし、私見で重要なのは、2つの思考プロセスが非常に異なることを理解することです。開発者がTDD方式でコードを作成する場合、開発者はコードに実装するさまざまな機能に焦点を当てる傾向があり、これとその機能またはユースケースが指定どおりに機能することを証明するテストを行います。この方法で作成されたテストは、McConnellが「クリーンテスト」と呼んでいるものです。
コードの一部がどのように壊れるかを考えるには、非常に異なる思考プロセスと異なる経験も必要です。メソッドとAPIを別の角度から見る必要があります。たとえば、これらのメソッドとパラメーターの目的について知っていることを一時的に脇に置き、それらを使用して技術的に可能なことだけに焦点を当てる必要があります。また、このメソッドが正しく機能するために必要なすべての(多くの場合暗黙の)前提条件または依存関係について考えること。DBから読み取った構成パラメーターに依存しますか?ファイルシステムに書き込みますか?事前に適切に初期化されていることを期待して、別のコンポーネントを呼び出しますか?大量のメモリを使用していますか?GUIにメッセージを表示しますか?...そして、これらの1つ以上が成り立たない場合はどうなりますか?
これはすべて重要な質問につながります:あなたのメソッドはそのような汚いケースをどのように処理する必要がありますか?クラッシュする必要がありますか?例外をスローしますか?できる限り最善を尽くしますか?エラーコードを返しますか?エラーレポートをログに記録しますか?...これらの小さな決定または大きな決定はすべて、メソッドまたはAPIのコントラクトを正しく一貫して定義するために実際には非常に重要です。
ケント・ベックは、同じ意味で「開発者の帽子」と「テスターの帽子」の着用を切り替えることについて話します。このように視点と思考プロセスを流暢に切り替えるには、実践と経験が必要です。