単体テストコードファイルシステム依存性
-
02-07-2019 - |
質問
皆様にお伝えしたくて書き込みるコンポーネントは、与えられたZIPファイルのニーズに
- 解凍ダウンロードしたファイルです。
- 見特定のdllをunzippedファイルです。
- の負荷のdllを通じて反射やメソッドを呼び出します。
私は単体テストまでこのコンポーネント.
私は誘惑コードを記述をお得に直接ファイルシステム:
void DoIt()
{
Zip.Unzip(theZipFile, "C:\\foo\\Unzipped");
System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar");
myDll.InvokeSomeSpecialMethod();
}
なんと言うことがよくない"という書きのユニットテストに依存するファイルシステム、データベース、ネットワーク等"といいます
また書このユニット試験に優しい方かのようになります:
void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
string path = zipper.Unzip(theZipFile);
IFakeFile file = fileSystem.Open(path);
runner.Run(file);
}
わーい!でのテスト容易化;私の食糧を供給することができテストのdouble(疑似)のDoIt方法です。だが。んでもって定義3つの新しいインターフェイスを作るには、このテスト容易化.うじんの実験をしていますか?感動させることにより、私のDoItく機能との相互作用とその依存関係.な試験のzipファイルunzipped正等
ないよう検査機です。うだけなんですけどね試験クラスの研究。
私の質問は、この:うる適切な方法をユニット試験にも依存のファイルシステム?
編集 います。純が、コンセプトに応用できることを見いだした。Javaのメソッドやネイティブコードです。
解決
がほんとうに何もないかこうにかすと呼んでいる単体テストまたは統合テストです。ばいけないと、ファイルシステムが意図しない副作用がある。具体的には必要な変更を終えたら、後は是非!--削除一時ファイルを作成した、よいものを上書きしてし既存のファイルがあったため、同じファイル名として一時ファイルを使用していた.しつけの相対パス、絶対的なものでない。
ものであることはい chdir()
一時ディレクトリの実行前にご試験 chdir()
奥ます。
他のヒント
わーい!でのテスト容易化;私の食糧を供給することができテストのdouble(疑似)のDoIt方法です。だが。んでもって定義3つの新しいインターフェイスを作るには、このテスト容易化.うじんの実験をしていますか?感動させることにより、私のDoItく機能との相互作用とその依存関係.な試験のzipファイルunzipped正等
お気右す。何をしたいテストは、論理の方法となるかどうかの真のファイルをこれでいいですか?ださをテストする必要があり(このユニットテスト)かどうかのファイルが正しくunzipped、メソッドが与えられます。インタフェースをとって貴重なものが提供されてい抽象化できるプログラムに対しよりも暗黙的または明示的に依拠一コンクリートの実装です。
ご質問に挑むの硬い部分が試験開くえ:
""ファンやめろ"と酷いです。"
おばん興味深いですので接着剤の一部のAPI呼び出での場合は書単位試験で使うだと主張する方法が呼び出されます。試験はこのように緊密にカップル実装の詳細に。これは悪い変化を試験を毎回変化の実施内容の方法で変更の実施内容壊試験(s)!
有悪試験は実際の悪化による試験です。
おとえば:
void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
string path = zipper.Unzip(theZipFile);
IFakeFile file = fileSystem.Open(path);
runner.Run(file);
}
ることができますしながら、パス疑似が論理の方法。した場合の試みは、単体テストのためこのようになります:
// Assuming that zipper, fileSystem, and runner are mocks
void testDoIt()
{
// mock behavior of the mock objects
when(zipper.Unzip(any(File.class)).thenReturn("some path");
when(fileSystem.Open("some path")).thenReturn(mock(IFakeFile.class));
// run the test
someObject.DoIt(zipper, fileSystem, runner);
// verify things were called
verify(zipper).Unzip(any(File.class));
verify(fileSystem).Open("some path"));
verify(runner).Run(file);
}
生、おめでとうございます基本的にコピー-貼り付けの実施内容 DoIt()
法。嬉しました。
を書くときに押さえておくべき試験お試したいと思い、 何 るのではな どのよう. 見 ブラックボックス試験 にあります。
の 何 名の方法(少なくともいき)になります。の どのよう すべての実装の詳細は生ご方法です。良い試験できるスワップの どのよう なの 何.
考えるとこだけ
"変更を行ったが、実装の詳細はこの方法を変えることなく、公共契約)まで休み試験(s)?"
の場合は回答があり、試験の どのよう るのではな 何.
回答おいて検査コードのファイルシステムの依存関係のため、いたちょっと面白いとなっているファイルに保存し、Base64エンコードの内容 byte[]
るファイルです。利用できるストリームにこれを試験するコードは正しいことなくチェック どのよう います。その一例がこのようになっ(Java):
interface StreamFactory {
OutputStream outStream();
InputStream inStream();
}
class Base64FileWriter {
public void write(byte[] contents, StreamFactory streamFactory) {
OutputStream outputStream = streamFactory.outStream();
outputStream.write(Base64.encodeBase64(contents));
}
}
@Test
public void save_shouldBase64EncodeContents() {
OutputStream outputStream = new ByteArrayOutputStream();
StreamFactory streamFactory = mock(StreamFactory.class);
when(streamFactory.outStream()).thenReturn(outputStream);
// Run the method under test
Base64FileWriter fileWriter = new Base64FileWriter();
fileWriter.write("Man".getBytes(), streamFactory);
// Assert we saved the base64 encoded contents
assertThat(outputStream.toString()).isEqualTo("TWFu");
}
試験に使用 ByteArrayOutputStream
では、アプリケーション(使用依存性注射の実StreamFactoryも呼FileStreamFactory)を返します FileOutputStream
から outputStream()
と書くと、 File
.
何が面白かったの write
方法はこちらで書く内容を出Base64符号化されたので、私たちは、これを試験します。ご DoIt()
方法になり得るかということですが、より適切に検討する 統合テスト.
私は寡黙なが汚染される私のコードの種類やコンセプトの存在を容易にする目的でユニットテスト。確かった場合には、デザイナーによる素晴らしいですけど、だと思いることができるのではない。
私はあなたは、あなたのユニットの試験がうまでお問い合わせください100%ます。このみ10%程度にとどまっています。そのポイントは、ユニット試験高速していない外部の依存関係.彼らがテストケースのように"このArgumentNullExceptionきにnullの場合はこのパラメータは".
私はそれがすべての統合の試験も自動化も同じユニットテスティングフレームワーク)では外部の依存関係および試験端末などのシナリオです。
時測定コード-カバレッジ、測定ユニット、統合試験までを実施。
あるものかを打つのファイルシステムでの検討では、統合テストではなく、ユニットテストです。思スワップにハードコードされたパスと相対パスをTestDataサブフォルダに含まれているzipsのユニット。
が統合試験が長すぎる実行を分離していないとのことですがどなどが簡単。
いであると思い相互作用に基づく試験できすぎてカップリングがで提供するのに十分値とします。また試験解凍、ファイルがここならず検証すごとに右ます。
片うの解凍方法にInputstream.その後、ユニットを用いた試験の構築などのInputStreamからバイト配列を使用ByteArrayInputStream.の内容をバイト配列が一定の単体テストのコードです。
といっていいのかもしれないように統合試験として使によって特定の細部のファイルシステムが、組み合わせによる最適化理論。
い抽象のコードを扱うのOSで自分のモジュール(クラス、組立、jarい).ご希望の負荷特定のDLLが見つからなることIDllLoaderタDllLoaderクラスです。てのアプリを取得するDLLのDllLoaderインタフェースを用いて試験を..い責任を負いませんunzipコード結局す。
このファイルシステムの相互作用"などの枠組みそのもの作成方法作業の流れ、試験です。開FileStream、この方法でできるようにすることでお試しFileStream.オープンステの枠組みを世界で活躍するアスリートの育成
べきではない試験クラスの相互作用、機能の呼びかける。代わりにうことを検討すべき統合。試験の結果はファイルの読み込み動作します。
ユニット試験を提供しているときのテストファイルプロジェクト(EARファイルまたはこれに準ずるもの)を使用し、相対パスにユニットテストする"../testdata/testfile".
どのプロジェクトが正しくスクのエクスポート/インポートお客様ユニットテストです。
としてその他っているため、最初はとして統合テストです。第二次試験のみの機能であるといった、すべてのユニットテストです。
このように、第二例目の夜には意味がな試す機会にどのように機能に対応し誤差のです。さんがいないエラーチェックの例ですが、実システムまで、依存関係を注いだの試験すべてに対応載。その費用をもって使い勝手は大きく変わります。