আমার এমএসটিস্ট ইউনিট পরীক্ষায় আমি কীভাবে "কোনও ব্যতিক্রম ঘটেনি" পরীক্ষা করব?


89

আমি এই এক পদ্ধতির জন্য একটি ইউনিট পরীক্ষা লিখছি যা "শূন্য" দেয়। আমি একটি কেস করতে চাই যে পরীক্ষাটি পাস হয় যখন কোনও ব্যতিক্রম ছুঁড়ে না দেওয়া হয়। আমি কীভাবে সি # তে এটি লিখব?

Assert.IsTrue(????)

(আমার অনুমান এইভাবে আমার চেক করা উচিত তবে "???" এর মধ্যে কী যায়)

আমি আশা করি আমার প্রশ্নটি যথেষ্ট পরিষ্কার হয়েছে।


আপনি কি এমএসটিস্ট বা নুনিট ব্যবহার করছেন?
ম্যাট গ্র্যান্ডে

4
এমএসটিস্টে অনাবৃত ব্যতিক্রমগুলি স্বয়ংক্রিয়ভাবে পরীক্ষাগুলিকে ব্যর্থ করে দেবে। আপনি কি ধরা পড়া ব্যতিক্রমগুলির জন্য অ্যাকাউন্ট করার চেষ্টা করছেন?
ফিল

আপনি "সি # এর জন্য চেষ্টা করুন" সন্ধান করতে পারেন এবং এটি আপনাকে কীভাবে ব্যতিক্রম ছোঁড়া বা ছুঁড়ে ফেলা হচ্ছে তা পরিচালনা করতে নির্দেশ দেয় handle
ফোগজি

4
যদি ননিত না থাকে তবে সরেজমিনে দেখুন hatতাই (ল্যাম্বডা) hআপনার কিছুই নেই (যদিও আমি মনে করি এটি সম্প্রতি বদলেছে)
ম্যাট গ্র্যান্ড

উত্তর:


139

আপনার ইউনিট পরীক্ষাটি যাইহোক ব্যর্থ হবে যদি কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয় - আপনাকে কোনও বিশেষ চাপ দেওয়ার দরকার নেই don't

এটি এমন কয়েকটি পরিস্থিতিতে একটি যেখানে আপনি ইউনিট পরীক্ষা দেখতে পাবেন না কোনও দাবী ছাড়াই - কোনও ব্যতিক্রম উত্থাপিত হলে পরীক্ষা স্পষ্টতই ব্যর্থ হবে।

তবে, আপনি যদি সত্যিই এটির জন্য একটি দৃ write়তা লিখতে চান - সম্ভবত ব্যতিক্রমটি ধরতে সক্ষম হবেন এবং "" কোনও ব্যতিক্রম প্রত্যাশিত নয় তবে এটি পেয়েছেন ... ", আপনি এটি করতে পারেন:

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

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

(উপরেরটি নুনিতের জন্য উদাহরণ, তবে এটি এমএসটিস্টের ক্ষেত্রেও সত্য)


স্পষ্টতই আপনার সত্যায়িত হওয়ার জন্য এই ধরণের ব্যতিক্রমগুলি ধরা উচিত নয়।
পরিবেশন করুন

7
একটি পরীক্ষা কেবল তখনই ব্যর্থ হবে যদি কোনও অবিচ্ছিন্ন ব্যতিক্রম ছুঁড়ে দেওয়া হয়। ব্যতিক্রম হ্যান্ডলারগুলির মধ্যে কোডের উপর নির্ভরশীল, ইউনিট পরীক্ষা পাস হতে পারে।
এডিবলকোড

4
এটা তোলে মিসেস Unittest জন্য দরকারী, তাই সেখানে Unittest কোন Assert.DoesNotThrow (() পদ্ধতি।
বাসার কায়া

26

নুনিতে আপনি ব্যবহার করতে পারেন:

Assert.DoesNotThrow(<expression>); 

আপনার কোড একটি ব্যতিক্রম ছুঁড়ে না যে জোর দিয়ে। যদিও পরীক্ষা ব্যর্থ হবে যদি তার আশেপাশে কোনও দৃsert়তা না থাকলেও যদি কোনও ব্যতিক্রম ছুঁড়ে ফেলা হয় তবে এই পদ্ধতির মান হ'ল আপনি নিজের পরীক্ষায় আনমেট প্রত্যাশাগুলি এবং বাগগুলির মধ্যে পার্থক্য করতে পারবেন এবং আপনার কাছে একটি কাস্টম বার্তা যুক্ত করার বিকল্প রয়েছে যা আপনার পরীক্ষার আউটপুট প্রদর্শিত হবে। একটি ভাল শব্দযুক্ত পরীক্ষার আউটপুট আপনাকে আপনার কোডে ত্রুটিগুলি সনাক্ত করতে সহায়তা করতে পারে যা পরীক্ষাতে ব্যর্থ হওয়ার কারণ ঘটেছে।

আপনার কোডটি ব্যতিক্রম ছোঁড়াচ্ছে না তা নিশ্চিত করতে পরীক্ষা যুক্ত করা বৈধ বলে মনে করি; উদাহরণস্বরূপ, কল্পনা করুন যে আপনি ইনপুটকে বৈধতা দিচ্ছেন এবং আগত স্ট্রিংটিকে দীর্ঘতে রূপান্তর করতে হবে। এমন ঘটনা ঘটতে পারে যখন স্ট্রিংটি নাল থাকে এবং এটি গ্রহণযোগ্য হয়, তাই আপনি নিশ্চিত করতে চান যে স্ট্রিং রূপান্তরটি একটি ব্যতিক্রম ছুঁড়ে না ফেলে। এই উপলক্ষটি পরিচালনা করার জন্য কোড থাকবে এবং আপনি যদি এটির জন্য একটি পরীক্ষা না লিখে থাকেন তবে আপনার যুক্তির একটি গুরুত্বপূর্ণ অংশের চারপাশে কভারেজ মিস হবে।


4
সুস্পষ্ট ডোনটট্রো দুর্দান্ত। যদি আপনি অ্যাসেটটি দেখতে অভ্যস্ত হন *
ম্যাট বেকম্যান

বনাম বা এমস্টেস্টের জন্য এটির সমতুল্য কি আছে?
ড্যান Carsharpster

4
@ ড্যানশার্পস্টার, আমি কমপক্ষে এমএসটিস্টে আছে বলে মনে করি না - অতীতে যখন আমি এমএসটিস্টে এই কার্যকারিতাটি প্রয়োজন তখন আমি এই জাতীয় কিছু করেছি: 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); } } }
ক্লার্কি ২

@ ক্লার্কে, এটি একটি আকর্ষণীয় ধারণা। ধন্যবাদ! আশা করি, তারা ভবিষ্যতে সংস্করণগুলিতে আরও ভালভাবে অনুলিপি করতে শিখবে। আমি ভিয়েস্ট এবং নুনিতের মধ্যে একটি অ্যাডাপ্টার লেখার বিষয়েও ভেবেছিলাম।
ড্যান চিশার্পস্টার 13

@ ড্যানশার্পস্টার, একটি বিষয় যা আপনি দেখতে চাইছেন তা হ'ল সাবলীল দৃser় বক্তব্য, যা হোল্ডথ্রো এবং হোল্ড নটথ্রো: গিথুব / এডনিসডোমেন / ফ্লুয়েটেসারেশনস / উইকি # এক্সপেকশনসকে সমর্থন করে । দস্তাবেজগুলি বলে যে এটি এমএসটিস্টের সাথে সামঞ্জস্যপূর্ণ (যদিও আমি এটি কেবল এক্স ইউনাইট এবং নুনিটের সাথে ব্যবহার করেছি)। আপনি যা চান তা নাও করতে পারেন তবে আপনি এমএসটিস্টের দৃser়তার সাথে এটি মিশ্রিত করতে পারেন।
ক্লার্কে

12

পরীক্ষা না করে কিছু ঘটে না । এটি কোডটি ভঙ্গ না হওয়ার আশ্বাস দেওয়ার মতো । এটি সাজানো এক প্রকারের, আমরা সকলেই নন-ব্রেকিং, বাগ-কম কোডের জন্য প্রচেষ্টা করি। আপনি কি তার জন্য পরীক্ষা লিখতে চান? কেন শুধু একটি পদ্ধতি? আপনি কি চান না যে আপনার সমস্ত পদ্ধতি পরীক্ষা করা হোক যাতে তারা কিছু ব্যতিক্রম না ফেলে ? এই রাস্তাটি অনুসরণ করে, আপনি আপনার কোড বেসে প্রতিটি পদ্ধতির জন্য একটি অতিরিক্ত, ডামি, অ্যাস্রেড-কম পরীক্ষা দিয়ে শেষ করবেন । এটি কোন মূল্য আনতে।

অবশ্যই, যদি আপনার প্রয়োজনীয়তাটি যাচাই করা হয় তবে ব্যতিক্রমগুলি ধরা পড়ে , আপনি এটি পরীক্ষা করেন (বা এটি কিছুটা বিপরীত; পরীক্ষা করুন যে এটি যেটিকে ধরবে বলে মনে করা হচ্ছে তা নিক্ষেপ করে না)।

যাইহোক, সাধারণ পদ্ধতি / অনুশীলন অক্ষত থাকে - আপনি কিছু কৃত্রিম / অস্পষ্ট প্রয়োজনীয়তার জন্য পরীক্ষাগুলি লেখেন না যা পরীক্ষিত কোডের সুযোগের বাইরে (এবং "এটি কাজ করে" বা "নিক্ষেপ করে না" এটি পরীক্ষা করা সাধারণত উদাহরণ হিসাবে দেখা যায়) যেমন - বিশেষত দৃশ্যে যখন পদ্ধতির দায়িত্বগুলি সুপরিচিত হয়)।

আপনার কোড কি উপর ফোকাস - এটা সহজ করা কি আছে এবং যে জন্য পরীক্ষা।


10
-1 আমি ইতিবাচক কার্যকারিতা সম্পর্কে ভাবতে পারি যা প্রয়োজন এবং ব্যতিক্রম নিক্ষেপ করা উচিত নয়। এক - পদ্ধতির যার কাজ এটি ব্যতিক্রমগুলি পরিচালনা করা, লগ ইন করুন এবং পদক্ষেপ নিন - ব্যতিক্রমটিকে আরও ছুঁড়ে না ফেলে। আপনি একটি ভাল সাধারণ বিন্দু তৈরি - কিন্তু তারপর নিখুঁতভাবে কথা বলতে যেমন এটি সর্বদা সত্য।
রব লেভিন

4
@ রোব্ল্যাভাইন: আমি আপনার উদাহরণটি বুঝতে পেরেছি এবং বুঝতে পারি যে আপনি এ জাতীয় ক্ষেত্রে পরীক্ষা লিখেন। তবুও যেমন আপনি লক্ষ্য করেছেন, আমার বক্তব্যটি আরও সাধারণ অনুশীলনের বিষয়ে ছিল - তাই বলার জন্য, আপনার কোডটি যা করেন না তার পরীক্ষার বিপরীতে আপনার কোডটি যা পরীক্ষা করে তা পরীক্ষা করে। আমি আমার পোস্টটি কিছুটা পুনরায় প্রতিস্থাপন করেছি, যাতে আমার বক্তব্যটি আমার কাছে যা মনে আছে তার থেকে আরও স্পষ্ট এবং নিকটতর হয়। এছাড়াও আপনাকে আপনার ভোট পুনর্বিবেচনা করার একটি সুযোগ দেয়। স্পষ্টতার জন্য ধন্যবাদ এবং বিলম্বিত প্রতিক্রিয়ার জন্য দুঃখিত।
কিমি

4
ডাউনভোট সরানো হয়েছে - আমি পরের বার ডাউন-ভোটে খুশি হব না!
রব লেভাইন

4
আমাদের প্রকল্পে আমাদের এইচটিএমএলএলডিএটার শ্রেণি রয়েছে, এটি এইচটিএমএলটি বৈধ না হলে ব্যতিক্রম ছুঁড়ে ফেলে। উদাহরণস্বরূপ যখন ব্যবহারকারী ইনপুট (কনসোল ব্যবহার করে) সমৃদ্ধ কম্বোতে জাভাস্ক্রিপ্ট হয়। সুতরাং আমার ক্ষেত্রে কোডে আমার কোডটি ব্যতিক্রম (সাদা তালিকা পদ্ধতির) নিক্ষেপ করা নয় এবং এটির জন্য আমার পরীক্ষা করা দরকার।
মাচেট

4
এই উত্তরের সাথে দ্বিমত পোষণ করুন। কখনও কখনও একটি নির্দিষ্ট দৃশ্যের অধীনে কিছু অনুপস্থিতির জন্য পরীক্ষা করা একটি বৈধ পরীক্ষা হতে পারে।
বাইটেডেভ

7

এই সহায়ক ক্লাসটি এমএসটিস্টের সাথে আমার চুলকানি স্ক্র্যাচ করেছে। সম্ভবত এটি আপনারও স্ক্র্যাচ করতে পারে।

[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);
        }
    }
}

@ রেমকো বেরসকেনস - NoExceptionThrown <T> এর শেষে একটি সাধারণ ক্যাচ যুক্ত করুন other other অন্যান্য ত্রুটিগুলি দমন করবে, যা পদ্ধতির উদ্দেশ্যযুক্ত ফলাফল নয়। সমস্ত ব্যতিক্রম দমন করার জন্য এটি সাধারণ উদ্দেশ্য পদ্ধতি নয়। এটি শুধুমাত্র ব্যর্থ হওয়ার উদ্দেশ্যে যখন পরিচিত টাইপের আইএস ব্যতিক্রম ছুঁড়ে ফেলা হয়।
জেজেএস

4
এটি এখন অতি পুরানো, তবে 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

    }

এটি একই না. যদি আপনার কোড ছুড়ে দেয় তবে কোনও দৃ no়তা আঘাত হানাবে না এবং আপনার পরীক্ষার রানটি ব্যর্থ হবে। আপনি একটি শর্ত জারি করে পরীক্ষার কাঠামোটিতে ঝুঁকতে চান।
ডিভিএস

1

আমার বন্ধু টিম আমাকে প্রত্যাশিত ধারণা সম্পর্কে বলেছিল । আমি এই খ / সি সত্যিই পছন্দ করি এটি আরও সংক্ষিপ্ত, কম কোড এবং খুব স্পষ্ট যে আপনি একটি ব্যতিক্রমের জন্য পরীক্ষা করছেন।

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

আপনি এ সম্পর্কে আরও কিছু উপায় এখানে পড়তে পারেন: প্রত্যাশিত এক্সপশন অ্যাট্রিবিউট ব্যবহার


4
ওপি ব্যতিক্রম চাইছে for
ড্যানিয়েল এ। হোয়াইট

আমি এই উত্তর এখানে ছেড়ে যাচ্ছি। ব্যতিক্রমগুলির জন্য কীভাবে পরীক্ষা করতে হয় তার জন্য গুগল অনুসন্ধান করার সময় আমি এই প্রশ্নটি পেয়েছি এবং আমার মনে হয় এই উত্তরটি এখানে থাকা দরকার। ওপি তাদের প্রশ্নের উত্তর 7 বছর আগে দিয়েছিল। এমনকি আমি মনে করি যে অন্য উত্তরের লিঙ্কটি সহায়ক।
জেস

ভাল ওলে টিম। 🤔
রাফিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.