मैं अपने MSTest इकाई परीक्षण में "कोई अपवाद नहीं हुआ" कैसे जांच सकता हूं?


89

मैं इस एक विधि के लिए एक इकाई परीक्षण लिख रहा हूं जो "शून्य" देता है। मैं एक मामला रखना चाहूंगा कि जब कोई अपवाद न हो तो परीक्षा पास हो जाती है। मैं C # में कैसे लिखूं?

Assert.IsTrue(????)

(मेरा अनुमान यह है कि मुझे कैसे जांच करनी चाहिए, लेकिन "???" में क्या जाता है)

मुझे आशा है कि मेरा प्रश्न पर्याप्त स्पष्ट है।


क्या आप MSTest या NUnit का उपयोग कर रहे हैं?
मैट ग्रांडे

2
MSTest अनकैप्ड अपवादों में स्वचालित रूप से परीक्षण विफल हो जाएंगे। क्या आप पकड़े गए अपवादों के लिए खाते की कोशिश कर रहे हैं?
फिल

आप "C # के लिए ट्राइ-कैच" देख सकते हैं और यह आपको निर्देश देगा कि अपवाद को कैसे फेंका जाए या फेंका न जाए।
फोगजी

1
यदि NUnit, Assert.That (lambda) में देखें। थ्रेड्स.नॉथिंग (हालांकि मुझे लगता है कि यह हाल ही में बदल गया है)
मैट ग्रांडे

जवाबों:


139

आपकी इकाई का परीक्षण वैसे भी विफल हो जाएगा जब एक अपवाद फेंक दिया जाता है - आपको एक विशेष मुखर में डालने की आवश्यकता नहीं है।

यह उन कुछ परिदृश्यों में से एक है जहाँ आप इकाई परीक्षणों को बिना किसी दावे के देखेंगे - यदि कोई अपवाद उठाया जाता है, तो परीक्षण अंतर्निहित रूप से विफल हो जाएगा।

हालांकि, अगर आप वास्तव में इसके लिए एक जोरदार लिखना चाहते थे - शायद अपवाद को पकड़ने और रिपोर्ट करने में सक्षम होने के लिए "कोई अपवाद नहीं मिला, लेकिन यह मिला ...", आप ऐसा कर सकते हैं:

[Test]
public void TestNoExceptionIsThrownByMethodUnderTest()
{
    var myObject = new MyObject();

    try
    {
        myObject.MethodUnderTest();
    }
    catch (Exception ex)
    {
        Assert.Fail("Expected no exception, but got: " + ex.Message);
    }
}

(उपरोक्त NUnit के लिए एक उदाहरण है, लेकिन वही MSTest के लिए सही है)


जाहिर है कि आपको ऐसा नहीं करना चाहिए और इस तरह के अपवादों को पकड़ना चाहिए।
सर्व

7
एक परीक्षण केवल तभी विफल होगा जब एक अनकहा अपवाद को फेंक दिया गया हो। अपवाद संचालकों के भीतर कोड पर निर्भर, इकाई परीक्षण पास हो सकते हैं।
25

1
यह सुश्री यूनीटेस्ट के लिए उपयोगी है, इसलिए इसमें कोई Assert.DoesNotThrow () विधि नहीं है।
बैसार काया

26

NUnit में, आप उपयोग कर सकते हैं:

Assert.DoesNotThrow(<expression>); 

यह दावा करने के लिए कि आपका कोड अपवाद नहीं फेंकता। हालाँकि यह परीक्षण विफल हो जाता है अगर कोई अपवाद नहीं फेंका जाता है, भले ही इसके आस-पास कोई मुखर न हो, लेकिन इस दृष्टिकोण का मूल्य यह है कि आप अपने परीक्षणों में बिना किसी अपेक्षा और कीड़े के बीच अंतर कर सकते हैं, और आपके पास एक कस्टम संदेश जोड़ने का विकल्प है जो आपके परीक्षण आउटपुट में प्रदर्शित किया जाएगा। एक अच्छी तरह से शब्दों का परीक्षण आउटपुट आपको अपने कोड में त्रुटियों का पता लगाने में मदद कर सकता है जिन्होंने परीक्षण को विफल कर दिया है।

मुझे लगता है कि यह सुनिश्चित करने के लिए परीक्षण जोड़ना मान्य है कि आपका कोड अपवाद नहीं फेंक रहा है; उदाहरण के लिए, कल्पना करें कि आप इनपुट को मान्य कर रहे हैं और आने वाले स्ट्रिंग को लंबे समय तक बदलने की आवश्यकता है। ऐसे अवसर हो सकते हैं जब स्ट्रिंग अशक्त हो, और यह स्वीकार्य है, इसलिए आप यह सुनिश्चित करना चाहते हैं कि स्ट्रिंग रूपांतरण अपवाद न फेंके। इसलिए इस अवसर को संभालने के लिए कोड होगा, और यदि आपने इसके लिए कोई परीक्षण नहीं लिखा है, तो आप तर्क के एक महत्वपूर्ण टुकड़े के आसपास कवरेज को याद नहीं करेंगे।


1
स्पष्ट DoNotThrow अच्छा है। यदि आप Assert। * एक परीक्षण में देखने के आदी हैं, तो आप सोच सकते हैं कि दूसरा व्यक्ति आलसी और भूल गया था।
मैट बेकमैन

क्या इसके लिए कोई समान है vstest या mstest में?
Dan Csharpster

1
@DanCsharpster, मुझे नहीं लगता कि कम से कम MSTest में है - जब मुझे अतीत में MSTest में इस कार्यक्षमता की आवश्यकता है, तो मैंने कुछ इस तरह किया है: public class TestBase { //believe me, I don't like this anymore than you do. protected void AssertDoesNotThrow(Action action, string message) { try { action(); } catch (Exception) { Assert.Fail(message); } } }
क्लार्केई

@ क्लार्क, यह एक दिलचस्प विचार है। धन्यवाद! उम्मीद है, वे भविष्य के संस्करणों में बेहतर NUnit की नकल करना सीखेंगे। मैंने vstest और NUnit के बीच एक एडेप्टर लिखने के बारे में भी सोचा।
दान Csharpster

: @DanCsharpster, एक बात आप पर एक नज़र है करने के लिए चाहते हो सकता है धाराप्रवाह दावे, जो ShouldThrow और ShouldNotThrow के लिए अच्छा समर्थन हासिल है है github.com/dennisdoomen/fluentassertions/wiki#exceptions । डॉक्स कहते हैं कि यह MSTest के साथ संगत है (हालाँकि मैंने इसे केवल XUnit और NUnit के साथ प्रयोग किया है)। आप जो चाहते हैं वह सब कुछ नहीं कर सकते हैं, लेकिन आप इसे एमएसटीएस के दावे के साथ मिला सकते हैं।
क्लार्केई

12

परीक्षण मत करो कि कुछ नहीं होता है । यह आश्वस्त करने जैसा है कि कोड टूटता नहीं है । यह निहित है, हम सभी गैर-तोड़ने, बग-कम कोड के लिए प्रयास करते हैं। आप उसके लिए परीक्षण लिखना चाहते हैं? सिर्फ एक विधि क्यों? क्या आप नहीं चाहते हैं कि आपके सभी तरीकों का परीक्षण किया जाए कि वे कुछ अपवाद न फेंकें ? उस सड़क के बाद, आप अपने कोड बेस में हर विधि के लिए एक अतिरिक्त, डमी, मुखर-कम परीक्षण के साथ समाप्त करेंगे । इसका कोई मूल्य नहीं है।

बेशक, अगर आपकी आवश्यकता यह सत्यापित करने की है कि विधि अपवादों को पकड़ती है , तो आप परीक्षण करते हैं (या इसे थोड़ा उलट कर देखते हैं। परीक्षण करें कि यह वह नहीं फेंकता है जो इसे पकड़ना चाहिए)।

हालांकि, सामान्य दृष्टिकोण / अभ्यास बरकरार है - आप कुछ कृत्रिम / अस्पष्ट आवश्यकताओं के लिए परीक्षण नहीं लिखते हैं जो परीक्षण कोड के दायरे से बाहर हैं (और परीक्षण कि "यह काम करता है" या "नहीं फेंकता है" आमतौर पर इसका एक उदाहरण है इस तरह - विशेष रूप से परिदृश्य में जब विधि की जिम्मेदारियों को अच्छी तरह से जाना जाता है)।

इसे सरल बनाने के लिए - अपने कोड को क्या करना है और उसके लिए परीक्षण करें, उस पर ध्यान केंद्रित करें ।


10
-1 मैं सकारात्मक कार्यक्षमता के बारे में सोच सकता हूं जिसकी आवश्यकता और अपवाद नहीं है। एक - विधि के लिए जिसका काम अपवादों को संभालना है, उन्हें लॉग इन करें और कार्रवाई करें - अपवाद को आगे फेंकने के बिना। आप एक अच्छा सामान्य बिंदु बनाते हैं - लेकिन फिर पूर्ण में बोलते हैं जैसे कि यह हमेशा सच होता है।
रोब लेविन

3
@RobLevine: मैं आपके उदाहरण को समझता हूं और महसूस करता हूं कि आप ऐसे मामलों में परीक्षण लिखते हैं। फिर भी जैसा कि आपने देखा, मेरी बात वास्तव में अधिक सामान्य अभ्यास के बारे में थी - इसलिए बोलने के लिए, आपके कोड के लिए परीक्षण क्या करना है, इसके लिए परीक्षण करना आपके कोड के लिए क्या नहीं है। मैंने अपनी पोस्ट को थोड़ा सा रीफ़्रेश किया है, ताकि मेरी बात और स्पष्ट हो और जो मुझे ध्यान में आए, उसके करीब आए। आपको अपने वोट पर पुनर्विचार करने का अवसर भी देता है। स्पष्टीकरण के लिए धन्यवाद और विलंबित प्रतिक्रिया के लिए खेद है।
किमी

4
डाउनवोट हटा दिया - मैं अगली बार डाउन-वोट पर खुश नहीं होऊंगा!
रॉ लेविन

4
हमारे प्रोजेक्ट में हमारे पास htmlvalidator क्लास है, अगर html मान्य नहीं है तो अपवादों को फेंकता है। उदाहरण के लिए जब अमीर कॉम्बो में उपयोगकर्ता इनपुट (कंसोल का उपयोग करके) जावास्क्रिप्ट। तो मेरे केस कोड में मेरा कोड क्या है अपवाद (श्वेत सूची दृष्टिकोण) को न फेंकें और मुझे इसके लिए परीक्षण करने की आवश्यकता है।
मचेट

1
इस उत्तर से असहमत हैं। एक निश्चित परिदृश्य के तहत कभी-कभी किसी चीज की अनुपस्थिति के लिए परीक्षण एक वैध परीक्षण हो सकता है।
bytedev

7

इस हेल्पर क्लास ने मेरी खुजली को MSTest से खरोंच दिया। हो सकता है कि यह आपका भी खुरच सके।

[TestMethod]
public void ScheduleItsIneligibilityJob_HasValid_CronSchedule()
{
    // Arrange
    var factory = new StdSchedulerFactory();
    IScheduler scheduler = factory.GetScheduler();

    // Assert
    AssertEx.NoExceptionThrown<FormatException>(() =>
        // Act
        _service.ScheduleJob(scheduler)
    );
}

public sealed class AssertEx
{
    public static void NoExceptionThrown<T>(Action a) where T:Exception
    {
        try
        {
            a();
        }
        catch (T)
        {
            Assert.Fail("Expected no {0} to be thrown", typeof(T).Name);
        }
    }
}

@Remco Beurskens - NoExceptionThrown <T> के अंत में एक सामान्य कैच {} को जोड़ना अन्य त्रुटियों को दबा देगा, जो विधि का एक परिणामी परिणाम नहीं है। यह सभी अपवादों को दबाने के लिए एक सामान्य उद्देश्य विधि नहीं है। यह केवल तब विफल होने का इरादा है जब ज्ञात प्रकार के अपवाद को फेंक दिया जाता है।
JJS

1
यह अब सुपर-पुराना है, लेकिन Assertइसमें एक सिंगलटन प्रॉपर्टी ऐक्सेसर है, Thatजिसे एक्सटेंशन विधियों के लिए हुक के रूप में उपयोग किया जा सकता है। Assert.That.DoesNotThrow()बल्कि इसके बजाय , इसके लिए और अधिक खोज योग्य हो सकता है AssertEx.DoesNotThrow()। यह सिर्फ एक राय है।
रिचर्ड हौअर

3

मैं Assert.Whateverप्रत्येक परीक्षण के अंत में देखना पसंद करता हूं , बस एक संगति के लिए ... एक के बिना, क्या मैं वास्तव में सुनिश्चित हो सकता हूं कि वहां एक होना नहीं चाहिए?

मेरे लिए, यह डाल के रूप में सरल है Assert.IsTrue(true);

मुझे पता है कि मैंने गलती से उस कोड को वहां नहीं डाला था , और इस तरह मुझे त्वरित स्किम पर पर्याप्त आश्वस्त होना चाहिए क्योंकि यह इस उद्देश्य के अनुसार था।

    [TestMethod]
    public void ProjectRejectsGappedVersioningByDefault() {

        var files = new List<ScriptFile>();
        files.Add(ScriptProjectTestMocks.GetVersion1to2());
        files.Add(ScriptProjectTestMocks.GetVersion3to4());

        Assert.Throws<ScriptProject.InvalidProjectFormatException>(() => {
            var sut = new ScriptProject(files);
        });

    }

    [TestMethod]
    public void ProjectAcceptsGappedVersionsExplicitly() {

        var files = new List<ScriptFile>();
        files.Add(ScriptProjectTestMocks.GetVersion1to2());
        files.Add(ScriptProjectTestMocks.GetVersion3to4());

        var sut = new ScriptProject(files, true);

        Assert.IsTrue(true);   // Assert.Pass() would be nicer... build it in if you like

    }

यह वैसा नहीं है। यदि आपका कोड फेंकता है, तो कोई जोर नहीं मारा जाएगा और आपका टेस्ट रन विफल हो जाएगा। आप एक शर्त लगाकर परीक्षण ढांचे में हुक करना चाहते हैं।
21

1

मेरे दोस्त टिम ने मुझे ExpectedException के बारे में बताया । मुझे वास्तव में यह पसंद है b / c यह अधिक रसीला है, कम कोड है, और बहुत स्पष्ट है कि आप एक अपवाद के लिए परीक्षण कर रहे हैं।

[TestMethod()]
[ExpectedException(typeof(System.Exception))]
public void DivideTest()
{
    int numerator = 4;
    int denominator = 0;
    int actual = numerator / denominator;
}

आप इसके बारे में अधिक तरीके से यहाँ पढ़ सकते हैं: ExpectedException विशेषता उपयोग


2
ओपी बिना किसी अपवाद के पूछ रहा है।
डैनियल ए व्हाइट

मैं इस जवाब को यहाँ छोड़ने जा रहा हूँ। अपवादों के लिए परीक्षण करने के लिए Google को खोजते समय मुझे यह प्रश्न मिला और मुझे लगता है कि इसका उत्तर यहां होना चाहिए। ओपी ने 7 साल पहले उनके सवाल का जवाब दिया था। यहां तक ​​कि मुझे लगता है कि अन्य उत्तर के लिए लिंक उपयोगी है।
जेस

अच्छा ओले टिम। 🤔
Ruffin
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.