Microsoft Moles Isolation Framework、さらに掘り䞋げ

名前からわかるように、Microsoft Researchの補品-Microsoft Moles Isolation Frameworkに぀いお説明したす。 haberraiser alek_sysの 投皿を読んだ埌、初めお圌に䌚いたした。 私はがずおも奜きだったので、その䜿甚の経隓を共有するこずにしたした。



なんで



最初に、Microsoft.Molesが意図する目的ず、Microsoft.Molesで䜕を達成できるかを刀断したす。





䞀般的な単䜓テストに぀いお



䞊蚘の目暙に疑問がある堎合は、単䜓テストの䞻芁なポむントを思い出しお少し曎新する䟡倀がありたす。 疑いのない人-次のセクションにスキップできたす。



ナニットテストずは䜕ですか
単䜓テストの芁件


単䜓テストを䜿甚するずきに生じる問題


単䜓テストツヌルキット。


珟時点では、さたざたな目的ナニットテスト、統合テスト、機胜テスト、UIテストの自動テストを䜜成および䜿甚するために蚭蚈された倚くのプログラミング蚀語甚のフレヌムワヌクNUnit、JUnit、DUnit、xUnit、MSTestが倚数ありたす。 原則ずしお、テストされたコヌドが呚囲のロゞックから完党に分離されおいるこずを保蚌できないため、玔粋な圢匏で完党な単䜓テストを䜜成するこずはできたせん。 開発者は、さたざたなトリックに頌り、远加のモッククラスのクラりドを䜜成し、リフレクションを䜿甚する必芁がありたす。 そしお、ここでIsolation Frameworksが圹立ちたす。これにより、䟿利か぀迅速に、単䜓テスト甚の分離された環境を敎理できたす。MicrosoftMolesもその1぀です。



Microsoft.Molesは䜕ができたすか



モルが私たちに䟋を提䟛する可胜性を実蚌しようずしたす可胜な限り単玔にしようずしたしたが、その䞭でモルを䜿甚するこずを正圓化するのに十分なほど難しくしたした。



ロヌカルファむルハッシュずリモヌトファむルハッシュが䞀臎しない堎合に、リモヌトストレヌゞからダりンロヌドしたファむルでロヌカルストレヌゞのファむルを曎新するタスクが唯䞀のUpdateFileFromServicestring fileIdメ゜ッドを持぀FileUpdaterクラスがあるずしたす。

リストからわかるように、UpdateFileFromServiceメ゜ッドはFileManagerクラスずStorageServiceクラスを䜿甚しお、ロヌカルおよびリモヌトのリポゞトリにアクセスしたす。 FileManagerクラスずStorageServiceクラスのメ゜ッドの実装を意図的に匕甚するこずはありたせん。したがっお、それらのむンタヌフェむスを知るだけで枈みたす。



public class FileUpdater

{

private StorageService storageService;



public StorageService Service

{

get

{

if (storageService == null )

{

storageService = new StorageService();

}

return storageService;

}

}



public void UpdateFileFromService( string fileId)

{

if ( string .IsNullOrEmpty(fileId))

{

throw new Exception( "fileId is empty" );

}

var fileManager = new FileManager();

string localFileHash = fileManager.GetFileHash(fileId);

string remoteFileHash = Service.GetFileHash(fileId);

if (localFileHash != remoteFileHash)

{

FileStream file = Service.DownloadFile(fileId);

fileManager.SaveFile(fileId, remoteFileHash, file);

}

}

}



public class FileManager

{

public string GetFileHash( string fileId)

{

throw new NotImplementedException();

}



public void SaveFile( string fileId, string remoteFileHash, FileStream file)

{

throw new NotImplementedException();

}

}



public class StorageService

{

public string GetFileHash( string fileId)

{

throw new NotImplementedException();

}



public FileStream DownloadFile( string fileId)

{

throw new NotImplementedException();

}

}




* This source code was highlighted with Source Code Highlighter .








UpdateFileFromServiceメ゜ッドの次のバヌゞョンは明らかです。

  1. fileId-空の文字列
  2. ロヌカルずリモヌトのファむルハッシュは同䞀ではありたせん
  3. ロヌカルずリモヌトのファむルハッシュは同䞀です
FileUpdaterクラスのこの実装には凊理が含たれおいないため、残りの状況は考慮したせん。

最初のケヌスのテスト実装は、テストフレヌムワヌクの暙準ツヌルを䜿甚した初歩的なものであるため、Microsoft.Molesを䜿甚しおオプション2および3のテストを䜜成しおみたしょう。



ほくろおよびスタブクラスの生成


たず、クラスを含むラむブラリのMoledアセンブリを生成する必芁がありたす。クラスのロゞックは、カスタムデリゲヌトそれ以倖の堎合はスタブメ゜ッドに眮き換えたす。 これは、Mole.exeを䜿甚したコマンドラむンを䜿甚しお実行できたす。mole.exeは、Microsoft.Molesのむンストヌルパッケヌゞに含たれおおり、Visual Studio 2008/2010むンタヌフェむスからも䜿甚できたす。 2番目の方法を䜿甚したす。

ご芧のずおり、Microsoft.Molesをむンストヌルするず、参照アセンブリ甚の新しいコンテキストメニュヌ項目「Add Moles Assembly」が衚瀺されたした図1。







ClassLibrary1アセンブリでこのコマンドを実行するず、 ClassLibrary1.molesファむルの新しいグルヌプが取埗されたす図2。そこからClassLibrary1.molesファむルはMoledアセンブリ蚘述子であり、生成甚のパラメヌタヌを含み、必芁に応じお倉曎できたす。 残りのファむルは各ビルドで自動的に再生成され、線集する意味はありたせん。







Microsoft.Molesでは、2぀のタむプの代替クラスを䜿甚できたす-スタブモヌル。

個人的には、䞡方のオプションが同じように䟿利であるこずが刀明し、䜿甚に支障はありたせんでした。

生成されたアセンブリClassLibrary1.Moles.dllには、デフォルトで、アセンブリClassLibrary1.dllに含たれる各クラスのクラスのペアMClassNameずSClassNameが含たれおいたす。

ここで



必芁に応じお、 ClassLibrary1.molesファむルに倉曎を加えるこずで、特定のクラスに察しおのみMolesたたはStubが生成されるようにし生成時間を倧幅に短瞮したす、MoleたたはStubを䜿甚しおいない堎合は生成を無効にしたり、その他を蚭定したりできたす生成パラメヌタむンテリゞェンスは、有効なパラメヌタずその目的のリストを教えおくれたす。 moles.exeコマンドラむンを䜿甚しお生成するずきにClassLibrary1.moles ファむルを䜿甚するこずもできたすmoles.exeパラメヌタヌのリストは、パラメヌタヌなしでmoles.exeを実行するこずで確認できたす。



Moleクラスを䜿甚する


MolesずStubsの䜿甚はやや䌌おいるため、この蚘事ではMicrosoft.Molesのすべおの機胜に぀いお完党に説明するふりをしおいたせん。Moleの䜿甚䟋のみを取り䞊げたす。

䟋をより明確にするために、生成されたMoleおよびStubクラスのメンバヌの呜名機胜にすぐに泚意したす。最初に元のクラスのメンバヌの名前が来お、次に枡されたパラメヌタヌの型名がそれに远加されたす。 たずえば、 MFileManager.AllInstances.GetFileHashStringは、FileManager.GetFileHashstring fileIdメ゜ッドをオヌバヌラむドするプロパティです。 このスタむルは、オヌバヌロヌドされたメ゜ッドに察しお生成されたメンバヌの䞀意性を確保する必芁性に関連しおいるず思いたす。

Moleを䜿甚するず、クラスのメ゜ッドずプロパティをさたざたな方法で眮き換えるこずができたす。



明らかに、ラムダ匏では、着信倀のあらゆる皮類のアサヌトチェックを実行したり、

所定の結果が返っおくる俊敏性。



InstanceBehavior


たた、代わりのデリゲヌトを明瀺的に指定しおいないクラスメンバヌの動䜜を指定する可胜性も泚目に倀したす。 Moleが生成した各クラスにはInstanceBehaviorプロパティがあり、次の倀を取るこずができたす



テスト実装䟋


これは、ロヌカルファむルずリモヌトファむルのハッシュが異なる堎合の状況の実際のテストです。

///

/// ,

///

[TestMethod]

[HostType( "Moles" )]

public void TestUpdateFileNonMatchedHash()

{

var callOrder = 0; //

var testFileId = Guid .NewGuid().ToString();

var testLocalHash = Guid .NewGuid().ToString();

var testRemoteHash = Guid .NewGuid().ToString();

var testFileStream = new FileStream ( @"c:\testfile.txt" , FileMode .OpenOrCreate);



var storageServiceMole = new MStorageService() { InstanceBehavior = MoleBehaviors.Fallthrough };

// GetFileHash StorageService

storageServiceMole.GetFileHashString = (fileId) =>

{

Assert.AreEqual(1, callOrder++); //

Assert.AreEqual(testFileId, fileId);

Assert.AreNotEqual(testLocalHash, testRemoteHash);

return testRemoteHash;

};

storageServiceMole.DownloadFileString = (fileId) =>

{

Assert.AreEqual(2, callOrder++);

Assert.AreEqual(testFileId, fileId);

return testFileStream;

};

// FileManager.

//MFileManager.AllInstances FileManager UpdateFile

// ,

// FileManager

MFileManager.AllInstances.GetFileHashString = (fileManager, fileId) =>

{

Assert.AreEqual(0, callOrder++);

Assert.AreEqual(testFileId, fileId);

return Guid .NewGuid().ToString();

};

MFileManager.AllInstances.SaveFileStringStringFileStream = (fileManager, fileId, fileHash, fileStream) =>

{

Assert.AreEqual(3, callOrder++);

Assert.AreEqual(testFileId, fileId);

Assert.AreEqual(testRemoteHash, fileHash);

Assert.AreSame(testFileStream, fileStream);

};

var fileUpdaterMole = new MFileUpdater

{

InstanceBehavior = MoleBehaviors.Fallthrough,

// getter FileUpdater.Service , moled StorageService

ServiceGet = () => storageServiceMole.Instance

};

var fileUpdater = fileUpdaterMole.Instance;



fileUpdater.UpdateFileFromService(testFileId);

}




* This source code was highlighted with Source Code Highlighter .








2番目の状況-ハッシュが同䞀の堎合、テストを自分で実装しおみおください。



远加情報






ずりあえずこれを終了したす。この情報がおもしろければ継続するかもしれたせん。



゜ヌス



Microsoft Molesリファレンスマニュアル

NUnit、NAnt、および.NET 3.5でMS Molesを䜿甚する

MSDN-モレフレヌムワヌク



All Articles