বাহ্যিক EXE শুরু হওয়া শ্রেণীর জন্য ইউনিট টেস্ট রাইটিং


9

আমি একটি সি # ক্লাস লিখেছিলাম যা EXEs এর তালিকা শুরু করতে ব্যবহৃত হয় (আমার একটি নয় - তৃতীয় পক্ষের EXE গুলি আমাকে চালাতে হবে) এবং তাদের চালিয়ে যেতে হবে (এটি এখনও চলছে কিনা তা নিশ্চিত হওয়ার জন্য মাঝে মাঝে পরীক্ষা করে দেখবেন, এবং না হলে সেগুলি শুরু করুন) ।

আমি যোগ, অপসারণ, ইত্যাদি সূক্ষ্ম যুক্ত করার প্রাথমিক যুক্তি পরীক্ষা করতে সক্ষম। আমি কীভাবে ইউনিট টেস্ট করব যে EXEs রাখার আসল কাজ কাজ করবে?

আমার প্রাথমিক চিন্তাটি এমন কিছু ডামি এক্সই শুরু করা যা 1 সেকেন্ডের পরে নিজেকে বন্ধ করে দেয়, তারপরে পরীক্ষার জন্য এটি ব্যবহার করুন। এটি কি ইউনিট পরীক্ষার ক্ষেত্রের বাইরে?

উত্তর:


12

আমার প্রাথমিক চিন্তাটি এমন কিছু ডামি এক্সই শুরু করা যা 1 সেকেন্ডের পরে নিজেকে বন্ধ করে দেয়, তারপরে পরীক্ষার জন্য এটি ব্যবহার করুন। এটি কি ইউনিট পরীক্ষার ক্ষেত্রের বাইরে?

এটি কি ভাল পরীক্ষা? অবশ্যই, তাই এটি তৈরি করুন। এটি কি শব্দের আসল অর্থে "ইউনিট টেস্ট"? আমি এটি মনে করি না, আমি এটিকে একটি "সিস্টেম পরীক্ষা" বা এটির মতো কিছু বলব, কিন্তু এটি পরীক্ষাকে কম মূল্যবান করে না।


9

এর চেয়ে উচ্চতর স্তরে এটি উপহাস করুন। আশেপাশে একটি প্রক্সি ক্লাস তৈরি করুন Process.Start(), পরীক্ষায় জাল করুন এবং ইনপুটটি পরীক্ষা করুন।

public interface IProcessProxy
{
     ProcessInfo Start(string application, string[] arguments);
}

public class ProcessProxy : IProcessProxy
{
    public ProcessInfo Start(string application, string[] arguments)
    {
        return Process.Start(application, arguments);
    }
}

// You could use a mocking framework for this, but for the purposes
// of this example ...
public class FakeProcessProxy : IProcessProxy
{
    private string _expectedApplication;
    private string[] _expectedArguments;
    private ProcessInfo response;

    public FakeProxy(string expectedApplication, string[] expectedArguments, ProcessInfo response)
    {
         _expectedApplication = expectedApplication;
         _expectedArguments = expectedArguments;
    }

    public ProcessInfo Start(string application, string[] arguments)
    {
         // compare input to expectations and throw exception if not matching
         return _response;
    }
}

// You can also use an IoC framework to inject your IProcessProxy, but I won't.
public class ClassUnderTest
{
    public ClassUnderTest(IProcessProxy proxy)
    {
        _proxy = proxy;
    }

    public ClassUnderTest() : this(new ProcessProxy())
    {
    }

    public void MethodUnderTest()
    {
        // Do stuff

        ProcessInfo process = _proxy.Start(@"C:\Program Files\App\App.exe", new[] { "arg1", "arg2" });
        process.WaitForExit();

        if (process.ExitCode == 0)
        {
            // Act on success
        }
        else
        {
            // Act on failure
        }
    }   
}

অ্যাপ্লিকেশন কোডে যেখানেই আপনার ক্লাসউন্ডারস্টেস্ট গ্রাস করতে হবে, সেখানে ডিফল্ট কনস্ট্রাক্টর ব্যবহার করুন। আপনার পরীক্ষাগুলিতে, আপনার প্রত্যাশিত প্রক্সি শুরু পরামিতিগুলি এবং নকলের কনস্ট্রাক্টরের আপনার পরীক্ষার ফলাফল ব্যবহার করে অন্য নির্মাণকারীর কাছে একটি ফেকপ্রসেসপ্রক্সি পাস করুন।


4

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

তবে ব্যবহারিক দৃষ্টিকোণ থেকে আপনার দৃষ্টিভঙ্গি ঠিক আছে, যদিও 1 সেকেন্ডটি কিছুটা লম্বা বলে মনে হচ্ছে।


1

আমি অনুরূপ কিছু করেছি, তবে সবেমাত্র ডেকেছি ping localhost। আপনার বিল্ড সার্ভারে এক্সিকিউটেবলগুলি রাখার ঝামেলা বাঁচায়

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