Microsoft मोल्स अलगाव ढांचा, गहरी खुदाई

जैसा कि आप नाम से समझते हैं, हम Microsoft रिसर्च - Microsoft मोल्स आइसोलेशन फ्रेमवर्क के एक उत्पाद के बारे में बात करेंगे। हेबराइज़र एलेक_साइस की पोस्ट पढ़ने के बाद मैं उनसे पहली बार मिला । मुझे पतंगा इतना पसंद आया कि मैंने इसके उपयोग के अपने अनुभव को साझा करने का फैसला किया।



क्यों?



पहले हम यह निर्धारित करने की कोशिश करेंगे कि Microsoft किस उद्देश्य से है। हमारा उद्देश्य क्या है और हम इससे क्या हासिल कर सकते हैं:





सामान्य रूप में इकाई परीक्षण के बारे में



यदि आपको संदेह में उपरोक्त लक्ष्य हैं, तो इकाई परीक्षण के मुख्य बिंदुओं की स्मृति में यह थोड़ा ताज़ा है। जिन लोगों को कोई संदेह नहीं है - आप अगले अनुभाग पर जा सकते हैं।



इकाई परीक्षण किसके लिए है?
यूनिट टेस्ट आवश्यकताएँ


यूनिट परीक्षणों का उपयोग करते समय क्या समस्याएं आती हैं


यूनिट टेस्टिंग टूलकिट।


फिलहाल, विभिन्न प्रयोजनों (यूनिट टेस्ट, इंटीग्रेशन टेस्ट, फ़ंक्शनल टेस्ट, यूआई टेस्ट) के लिए स्वचालित परीक्षण बनाने और उपयोग करने के लिए डिज़ाइन की गई कई प्रोग्रामिंग भाषाओं के लिए बड़ी संख्या में चौखटे (NUnit, JUnit, DUnit, xUnit, MSTest) मौजूद हैं। एक नियम के रूप में, वे पूर्ण इकाई परीक्षणों को शुद्ध रूप में बनाने की अनुमति नहीं देते हैं, क्योंकि वे आसपास के तर्क से परीक्षण किए गए कोड का पूर्ण अलगाव सुनिश्चित नहीं कर सकते हैं। डेवलपर्स को विभिन्न ट्रिकों का सहारा लेना पड़ता है, अतिरिक्त मॉक कक्षाओं का एक बादल बनाना, प्रतिबिंब का उपयोग करना, और इसी तरह। और यहां अलगाव फ्रेमवर्क बचाव के लिए आते हैं, जो आपको सुविधा और जल्दी से पर्याप्त करने की अनुमति देते हैं, यूनिट परीक्षणों के लिए एक अलग वातावरण का आयोजन करते हैं, और Microsoft मोल्स उनमें से एक है।



Microsoft.Moles क्या कर सकते हैं?



मैं उन संभावनाओं को प्रदर्शित करने का प्रयास करूंगा जो मोल्स हमें एक उदाहरण प्रदान करता है (मैंने इसे यथासंभव सरल लेकिन इतना कठिन बनाने की कोशिश की कि इसमें मोल्स का उपयोग करना उचित था)।



मान लें कि हमारे पास FileUpdater वर्ग है, एकमात्र UpdateFileFromService (string fileId) विधि के साथ, जिसका कार्य स्थानीय संग्रहण में डाउनलोड की गई फ़ाइल के साथ स्थानीय संग्रहण में फ़ाइल को अद्यतन करना है, यदि स्थानीय और दूरस्थ फ़ाइल hasha मेल नहीं खाते हैं।

जैसा कि आप लिस्टिंग से देख सकते हैं, 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. स्थानीय और दूरस्थ फ़ाइल हैश समान हैं
हम शेष स्थितियों पर विचार नहीं करेंगे, क्योंकि फ़ाइलअपडेट श्रेणी के इस कार्यान्वयन में उनका प्रसंस्करण शामिल नहीं है।

आइए Microsoft.Moles का उपयोग करके विकल्पों 2 और 3 के लिए परीक्षण बनाने की कोशिश करें, क्योंकि किसी भी परीक्षण ढांचे के मानक उपकरण का उपयोग करके पहले मामले के लिए परीक्षण कार्यान्वयन प्राथमिक है।



मोल और स्टब क्लास जनरेशन


सबसे पहले, आपको पुस्तकालयों के लिए एक मोलेड असेंबली बनाने की आवश्यकता है जिसमें कक्षाएं शामिल हैं, जिनमें से तर्क हम कस्टम प्रतिनिधियों (अन्यथा स्टब विधियों) के साथ बदल देंगे। यह कमांड लाइन का उपयोग कर मोल। Exe का उपयोग करके किया जा सकता है, जो Microsoft.Moles के साथ स्थापना पैकेज में आता है, साथ ही साथ Visual Studio 2010/2010 इंटरफ़ेस के माध्यम से। हम दूसरी विधि का उपयोग करेंगे।

जैसा कि आप देख सकते हैं, Microsoft.Moles को स्थापित करने के बाद, संदर्भ असेंबलियों के लिए एक नया संदर्भ मेनू आइटम "ऐड मोल्स असेंबली" दिखाई दिया (चित्र 1)।







ClassLibrary1 असेंबली पर इस कमांड को निष्पादित करने के बाद, हमें ClassLibrary1.moles फ़ाइलों (छवि 2) का एक नया समूह मिलता है, जिसमें से ClassLibrary1.moles फ़ाइल मोलड असेंबली विवरणक है, जिसमें इसकी पीढ़ी के पैरामीटर शामिल हैं और यदि आवश्यक हो तो इसे बदला जा सकता है। बाकी फाइलें प्रत्येक बिल्ड पर स्वचालित रूप से पुनर्जीवित हो जाती हैं, और उन्हें संपादित करने का कोई मतलब नहीं है।







Microsoft.Moles आपको दो प्रकार के स्थानापन्न वर्गों का उपयोग करने की अनुमति देता है - स्टब्स और मोल्स।

मेरे लिए व्यक्तिगत रूप से, दोनों विकल्प समान रूप से सुविधाजनक थे, और उपयोग में कोई कठिनाई नहीं हुई।

असेंबली ClassLibrary1.Moles.dll उन सभी वर्गों के लिए M M क्लास ClassName% और S% ClassName% की डिफ़ॉल्ट जोड़ियों में शामिल है जो असेंबली ClassLibrary1.dll में शामिल हैं।

जहां:



यदि आप चाहें, तो ClassLibrary1.moles फ़ाइल में परिवर्तन करके, आप यह सुनिश्चित कर सकते हैं कि मोल्स या स्टब्स केवल कुछ वर्गों (जो पीढ़ी के समय को बहुत कम कर देंगे) के लिए उत्पन्न होते हैं, या आप मोल्स या स्टब्स की पीढ़ी को अक्षम कर सकते हैं यदि आप इसका उपयोग नहीं कर रहे हैं, साथ ही साथ अन्य सेट करें। पीढ़ी के मापदंडों (Intellisence आपको मान्य मापदंडों और उनके उद्देश्य की एक सूची बताएगा)। जब आप moles.exe कमांड लाइन का उपयोग कर जेनरेट कर रहे हैं तो आप ClassLibrary1.moles फ़ाइल का उपयोग कर सकते हैं (आप पैरामीटर के बिना moles.exe चलाकर moles.exe मापदंडों की सूची पा सकते हैं)।



तिल कक्षाओं का उपयोग करना


चूंकि मोल्स और स्टब्स का उपयोग कुछ समान है, और लेख Microsoft.Moles की सभी कार्यक्षमता का पूर्ण विवरण होने का दिखावा नहीं करता है - हम केवल मोल का उपयोग करने के उदाहरणों पर ध्यान देंगे।

उदाहरणों को और अधिक स्पष्ट करने के लिए, मैं तुरंत उत्पन्न तिल और स्टब वर्गों के सदस्यों के नामकरण की विशेषताओं पर ध्यान देता हूं - पहले मूल वर्ग के सदस्य का नाम आता है, और फिर पारित मापदंडों के प्रकार को इसमें जोड़ा जाता है। उदाहरण के लिए, MFileManager.AllInstances.GetFileHashString FileManager.GetFileHash (string fileId) विधि को ओवरराइड करने का गुण है। मुझे लगता है कि यह शैली अतिभारित तरीकों के लिए उत्पन्न सदस्यों की विशिष्टता सुनिश्चित करने की आवश्यकता से जुड़ी है।

मोल के साथ हमें विभिन्न तरीकों से कक्षाओं के किसी भी तरीके और गुणों को बदलने का अवसर मिलता है:



जाहिर है, लैम्ब्डा एक्सप्रेशन में, आप आने वाले मूल्यों के एस्टर चेक के सभी प्रकार का प्रदर्शन कर सकते हैं या कुछ का अनुकरण कर सकते हैं

पूर्व निर्धारित परिणाम की वापसी के साथ चपलता।



InstanceBehavior


यह वर्ग के सदस्यों के व्यवहार को निर्दिष्ट करने की संभावना को भी ध्यान देने योग्य है, जिनके लिए हम स्पष्ट रूप से एक स्थानापन्न प्रतिनिधि को निर्दिष्ट नहीं करते हैं। प्रत्येक तिल उत्पन्न वर्ग में एक 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 .








दूसरी स्थिति के लिए - जब हैश समान हैं, तो परीक्षण को स्वयं लागू करने का प्रयास करें।



अतिरिक्त जानकारी






मैं इसे अभी के लिए समाप्त कर दूंगा, अगर यह जानकारी दिलचस्प हो जाए तो एक निरंतरता हो सकती है।



सूत्रों का कहना है



Microsoft मोल्स संदर्भ मैनुअल

NUnit, NAnt और .NET 3.5 के साथ MS मोल्स का उपयोग करना

MSDN - मोल्स फ्रेमवर्क



All Articles