ইউনিট পরীক্ষা: লিনকের সাথে স্থগিত জবাব


18

এই জাতীয় স্থগিত জোর যুক্ত করা কি ঠিক আছে?

var actualKittens = actualKittens.Select(kitten => {
    Assert.IsСute(kitten);
    return kitten
});

কেন? সুতরাং আমি উদাহরণস্বরূপ বস্তুগত সংগ্রহের প্রত্যাশী বিবৃতি দিয়ে কেবল একবারে পুনরাবৃত্তি করতে পারি:

CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());

এবং এটি কেবল সিলেক্ট হতে পারে না বরং এটির পদ্ধতি এমন একটি পদ্ধতি যা সংশোধনকারী সংজ্ঞাযুক্ত এবং প্রচুর চেক এবং যুক্তিযুক্ত (যেমন কিছু গণনা এবং ফিল্টারিং) থাকতে পারে।

সন্দেহের বীজ হ'ল পরীক্ষায় ব্যর্থ হওয়ার ক্ষেত্রে এই জাতীয় কোডটি পড়া এবং ডিবাগ করার জটিলতা।


1
আমি পরীক্ষার জন্য এটির জন্য নির্ভর করব না তবে কখনও কখনও সমাধানের সমাধান না হলে উত্পাদন কোডে এটি করা কখনও কখনও ঠিক। sequence.WithSideEffect(item => Assert.IsCute(item))এটিকে পরিষ্কার করার জন্য আপনি নিজেকে একটি সহায়ক ফাংশন করতে পারেন।
usr ডিরেক্টরির

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

তালিকার উত্পন্ন করার জন্য এবং একবারের সাথে এটির তুলনা করার জন্য আপনার expectedKittensকি আবার দুবার পুনরাবৃত্তি করতে হবে না ? আপনি কেবল পদ্ধতি কলগুলির পিছনে পুনরাবৃত্তিগুলি গোপন করেছেন।
IllusiveBrian

@ ইলিউসিভ ব্রায়ান এই অর্থে, উদাহরণস্বরূপ, হ্যাঁ। এটি অতিরিক্তের তুলনায় এখনও কম .All()
সার্জ

উত্তর:


37

এই জাতীয় স্থিতিযুক্ত যুক্তি যুক্ত করা ঠিক কি [..]

না , তা নয়। কেন? কারণ যদি আপনি কোনও কারণে দ্বিতীয় দাবী সরিয়ে থাকেন তবে পরীক্ষাটি এখনও সবুজ হয়ে যাবে এবং আপনি ভাবেন যে এটি এখনও কার্যকর হয় তবে সংগ্রহটি অঙ্কিত হবে না। আপনার যদি দুটি বা ততোধিক স্বতঃস্বীকৃতি থাকে তবে তারা যদি তাদের মধ্যে কোনও একটি অক্ষম করেও থাকেন তবে তারা তাদের কাজ চালিয়ে যাবে।

এই সংমিশ্রণটি বিবেচনা করুন:

Assert.IsTrue(actualKittens.All(x => x.IsCute());
CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());

এখন আপনি যদি দৃ the় অক্ষরের একটি অক্ষম বা অপসারণ করেন তবে অন্যটি তার কাজটি করবে। এছাড়াও আপনি যদি সংগ্রহটি বাস্তবায়িত করতে ভুলে যান তবে এটি চালাতে আরও বেশি সময় নিতে পারে তবে এটি এখনও কাজ করবে। স্বতন্ত্র পরীক্ষাগুলি আরও মজবুত এবং নির্ভরযোগ্য।

দ্বিতীয় নম্বরও রয়েছে । অন্যান্য ফ্রেমওয়ার্কগুলি কীভাবে এটি পরিচালনা করে তা আমি নিশ্চিত নই তবে আপনি যদি এমএস টেস্ট প্ল্যাটফর্ম ব্যবহার করেন তবে কোন পরীক্ষায় ব্যর্থ হয়েছে তা আপনি জানতেন না। আপনি যদি ব্যর্থ পরীক্ষায় ডাবল ক্লিক করেন তবে এটি আপনাকে CollectionAssertব্যর্থ হিসাবে দেখিয়ে দেবে তবে বাস্তবে ভুলটি হয়েছিল এমন নেস্ট করা Assertএবং এটি ডিবাগ করা অত্যন্ত কঠিন be এখানে একটি উদাহরণ:

    [TestMethod]
    public void TestMethod()
    {
        var numbers = new[] { 1, 2, 3 }.Select(x =>
        {
            Assert.Fail("Wrong number.");
            return x;
        });

        // This will fail and you won't be sure why.
        CollectionAssert.AreEqual(new[] { 1, 2, 3 }, numbers.ToList()); 

    }

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


কেন? সুতরাং আমি একবারে পুনরাবৃত্তি করতে পারি এমনকি বৈষয়িক সংগ্রহের প্রত্যাশী বিবৃতি দিয়েও

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

আপনার এই জাতীয় পরীক্ষাগুলি বজায় রাখতে হবে তাই আপনার প্রয়োজনীয় কেন তাই আরও জটিল করা উচিত? কাজ হিসাবে সহজ asserts লিখুন।


যদি কোনও কারণে একটি দৃ flow়তা নিয়ন্ত্রণ প্রবাহে কবর দেওয়া প্রয়োজন হয়, তবে এটি কার্যকর করা হয়েছে তা নিশ্চিত করার একটি উপায় হল একটি পাল্টা / পতাকা রাখা যা নেস্টেড দৃser়তার আগে সত্য হিসাবে সেট করা থাকে। পরে, আমরা দৃ counter়ভাবে বলতে পারি যে এই কাউন্টারটি পরীক্ষা করে প্রত্যাশিত নিয়ন্ত্রণ প্রবাহটি নেওয়া হয়েছে। নিখুঁত নয়, তবে মূলত আপনার প্রথম সমালোচনা সম্বোধন করে।
আমন

1
অতিরিক্তভাবে, আপনি বা অন্য কেউ মাসের সময় পিছিয়ে দেওয়া দাবীতে ফিরে আসবেন এবং এটি বের করার সময় নষ্ট করতে হবে।
ডেভিডপুইন

আপনার উদাহরণে কিছু ভুল আছে। কলিং ToListগণনার পুনরাবৃত্তি করবে, তাই না?
রাবারডাক

1
@RubberDuck হ্যাঁ, এটা এবং এটি অবশ্য এ ব্যর্থ করব করবে Assert.Failকিন্তু CollectionAssertএবং আপনি যা আসলে জাহির গন্ডগোল হয়েছে বলতে পারবেন না। মানে ভিএস ফোকাস করবে না Assert.Failতবে অন্যটির দিকে ... এখন আপনি ডিবাগ করতে পারবেন।
t3chb0t
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.