unit-testing
टेस्ट डबल्स
खोज…
टिप्पणियों
परीक्षण करते समय, परीक्षण के तहत प्रणाली के व्यवहार में हेरफेर करने या सत्यापित करने के लिए परीक्षण दोहरे का उपयोग करना कभी-कभी उपयोगी होता है। उत्पादन कोड के उदाहरणों के बजाय युगल को परीक्षण के तहत कक्षा या विधि में पारित या इंजेक्ट किया जाता है।
डिब्बाबंद प्रतिक्रियाओं की आपूर्ति करने के लिए एक स्टब का उपयोग करना
एक स्टब एक लाइट वेट टेस्ट डबल होता है जो तरीकों को कॉल करने पर डिब्बाबंद प्रतिक्रियाएं प्रदान करता है। जहां परीक्षण के तहत एक वर्ग एक इंटरफ़ेस या आधार वर्ग पर निर्भर करता है, एक वैकल्पिक 'स्टब' वर्ग को परीक्षण के लिए लागू किया जा सकता है जो इंटरफ़ेस के अनुरूप है।
इसलिए, निम्नलिखित इंटरफ़ेस को मानते हुए,
public interface IRecordProvider {
IEnumerable<Record> GetRecords();
}
यदि निम्न विधि का परीक्षण किया जाना था
public bool ProcessRecord(IRecordProvider provider)
एक स्टब वर्ग जो इंटरफ़ेस को लागू करता है, परीक्षण किए जा रहे विधि में ज्ञात डेटा को वापस करने के लिए लिखा जा सकता है।
public class RecordProviderStub : IRecordProvider
{
public IEnumerable<Record> GetRecords()
{
return new List<Record> {
new Record { Id = 1, Flag=false, Value="First" },
new Record { Id = 2, Flag=true, Value="Second" },
new Record { Id = 3, Flag=false, Value="Third" }
};
}
}
यह स्टब कार्यान्वयन परीक्षण के तहत सिस्टम को प्रदान किया जा सकता है, ताकि यह व्यवहार को प्रभावित कर सके।
var stub = new RecordProviderStub();
var processed = sut.ProcessRecord(stub);
स्टब के रूप में मॉकिंग फ्रेमवर्क का उपयोग करना
शब्द मॉक और स्टब अक्सर भ्रमित हो सकते हैं। इसका कारण यह है कि कई मॉकिंग फ्रेमवर्क मॉकिंग से जुड़े सत्यापन चरण के बिना स्टब्स बनाने के लिए सहायता प्रदान करते हैं।
एक स्टब को लागू करने के लिए एक नया वर्ग लिखने के बजाय "डिब्बाबंद प्रतिक्रियाओं की आपूर्ति के लिए एक स्टब का उपयोग करना" उदाहरण के लिए, इसके बजाय मॉकिंग फ्रेमवर्क का उपयोग किया जा सकता है।
Moq का उपयोग करना:
var stub = new Mock<IRecordProvider>();
stub.Setup(provider => provider.GetRecords()).Returns(new List<Record> {
new Record { Id = 1, Flag=false, Value="First" },
new Record { Id = 2, Flag=true, Value="Second" },
new Record { Id = 3, Flag=false, Value="Third" }
});
यह हाथ कोडित ठूंठ के समान व्यवहार को प्राप्त करता है, और इसी तरह से परीक्षण के तहत सिस्टम को आपूर्ति की जा सकती है:
var processed = sut.ProcessRecord(stub.Object);
व्यवहार को मान्य करने के लिए एक नकली रूपरेखा का उपयोग करना
मोक्स का उपयोग तब किया जाता है जब परीक्षण और परीक्षण डबल्स के तहत सिस्टम के बीच बातचीत को सत्यापित करना आवश्यक होता है। अत्यधिक भंगुर परीक्षण बनाने से बचने के लिए देखभाल की आवश्यकता होती है, लेकिन जब विशेष रूप से अन्य कॉलों को ऑर्केस्ट्रेट किया जाता है, तो मॉकिंग विशेष रूप से उपयोगी हो सकता है।
यह परीक्षण इस बात की पुष्टि करता है कि जब परीक्षण के तहत विधि को कहा जाता है ( ProcessRecord
), कि सेवा विधि ( UseValue
) को Record
लिए कहा जाता है जहां Flag==true
। ऐसा करने के लिए, यह डिब्बाबंद डेटा के साथ एक स्टब स्थापित करता है:
var stub = new Mock<IRecordProvider>();
stub.Setup(provider => provider.GetRecords()).Returns(new List<Record> {
new Record { Id = 1, Flag=false, Value="First" },
new Record { Id = 2, Flag=true, Value="Second" },
new Record { Id = 3, Flag=false, Value="Third" }
});
इसके बाद यह एक मॉक सेट करता है जो IService
इंटरफ़ेस को लागू करता है:
var mockService = new Mock<IService>();
mockService.Setup(service => service.UseValue(It.IsAny<string>())).Returns(true);
फिर उन्हें परीक्षण के तहत प्रणाली को आपूर्ति की जाती है और परीक्षण की जाने वाली विधि को कहा जाता है।
var sut = new SystemUnderTest(mockService.Object);
var processed = sut.ProcessRecord(stub.Object);
मॉक को तब सत्यापित करने के लिए पूछताछ की जा सकती है कि अपेक्षित कॉल किया गया है। इस मामले में, UseValue
के लिए एक पैरामीटर "दूसरा" के साथ एक कॉल, जो रिकॉर्ड से मूल्य है जहां Flag==true
।
mockService.Verify(service => service.UseValue("Second"));