database - সফটওয - রিলেশনাল ডাটাবেজ কি




কিভাবে ইউনিট ডেটাবেস প্রশ্নের সাথে একটি বস্তু পরীক্ষা (9)

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

আপনার অবজেক্টগুলি আপনার ডেটা স্তরতে জোরালোভাবে সংযুক্ত থাকলে, যথাযথ ইউনিট পরীক্ষা করা কঠিন। ইউনিট পরীক্ষা প্রথম অংশ, "ইউনিট" হয়। সমস্ত ইউনিট বিচ্ছিন্নতা পরীক্ষা করা সম্ভব হবে।

আমার সি # প্রোজেক্টগুলিতে, আমি এনএইচবিবারনেটকে একটি সম্পূর্ণ পৃথক ডাটা স্তর দিয়ে ব্যবহার করি। আমার বস্তু মূল ডোমেন মডেলে বাস করে এবং আমার অ্যাপ্লিকেশন স্তর থেকে অ্যাক্সেস করা হয়। অ্যাপ্লিকেশন স্তর উভয় তথ্য স্তর এবং ডোমেন মডেল স্তর আলোচনা।

অ্যাপ্লিকেশন স্তর কখনও কখনও "ব্যবসা স্তর" বলা হয়।

আপনি যদি পিএইচপি ব্যবহার করেন তবে শুধুমাত্র ডাটা অ্যাক্সেসের জন্য ক্লাসগুলির একটি নির্দিষ্ট সেট তৈরি করুন। আপনার অবজেক্টগুলির কোনও ধারণা নেই যে তারা কীভাবে স্থির থাকে এবং আপনার অ্যাপ্লিকেশান ক্লাসগুলির মধ্যে দুটি আপলোড করে।

আরেকটি বিকল্প mocking / stubs ব্যবহার করা হবে।

আমি শুনেছি যে ইউনিট পরীক্ষার "পুরোপুরি সন্ত্রস্ত", "সত্যিই দুর্দান্ত" এবং "ভাল জিনিসগুলির সমস্ত উপায়ে" কিন্তু আমার ফাইলগুলির 70% বা তার বেশি ডেটাবেস ডাটাবেস অ্যাক্সেস (কিছু পড়া এবং কিছু লেখার) শোনা এবং আমি নিশ্চিত নই কিভাবে এই ফাইলগুলির জন্য একটি ইউনিট পরীক্ষা লিখতে।

আমি পিএইচপি এবং পাইথন ব্যবহার করছি কিন্তু আমি মনে করি এটি একটি প্রশ্ন যা ডেটাবেস অ্যাক্সেস ব্যবহার করে বেশিরভাগ / সমস্ত ভাষাতে প্রযোজ্য।


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

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

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

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

দুঃখিত, পিএইচপি / পাইথনের জন্য আমার কোনও নির্দিষ্ট কোড উদাহরণ নেই, তবে যদি আপনি একটি .NET উদাহরণ দেখতে চান তবে আমার একটি post যা আমি এমন একটি কৌশল বর্ণনা করে যা আমি এই একই পরীক্ষার জন্য ব্যবহার করতাম।


আপনি ইউনিট আপনার ক্লাস পরীক্ষা করতে চান তাহলে আপনি ডাটাবেস অ্যাক্সেস mock করা উচিত। সব পরে, আপনি একটি ইউনিট পরীক্ষা ডাটাবেস পরীক্ষা করতে চান না। যে একটি ইন্টিগ্রেশন পরীক্ষা হবে।

সারাংশ কল দূরে এবং তারপর প্রত্যাশিত তথ্য ফেরৎ যে একটি ঠক্ঠক্ ঢোকান। যদি আপনার ক্লাসগুলি এক্সিকিউটিভ ক্যোয়ারীগুলি থেকে বেশি কিছু না করে তবে এটিও তাদের মূল্যায়ন করতে পারে না, যদিও ...


আপনি ডাটাবেস ইঞ্জিন বিমূর্ত আউট mocking কাঠামো ব্যবহার করতে পারে। আমি জানি না পিএইচপি / পাইথন টাইপকৃত ভাষাগুলির জন্য কিছু পেয়েছে কিনা (সি #, জাভা ইত্যাদি) প্রচুর পছন্দ রয়েছে

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


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

মকিংয়ের জন্য আপনার বস্তুগুলি সেট আপ করার জন্য, আপনাকে সম্ভবত নিম্নোক্ত ছদ্ম-কোডের মতো নিয়ন্ত্রণ / নির্ভরতা ইনজেকশন প্যাটার্নের কিছু ধরণের আনুষঙ্গিক ব্যবহার করতে হবে:

class Bar
{
    private FooDataProvider _dataProvider;

    public instantiate(FooDataProvider dataProvider) {
        _dataProvider = dataProvider;
    }

    public getAllFoos() {
        // instead of calling Foo.GetAll() here, we are introducing an extra layer of abstraction
        return _dataProvider.GetAllFoos();
    }
}

class FooDataProvider
{
    public Foo[] GetAllFoos() {
        return Foo.GetAll();
    }
}

এখন আপনার ইউনিট টেস্টে, আপনি FooDataProvider এর একটি কাহিনী তৈরি করেছেন যা আপনাকে ডেটাবেসকে আঘাত না করে GetAllFoos পদ্ধতিটি কল করার অনুমতি দেয়।

class BarTests
{
    public TestGetAllFoos() {
        // here we set up our mock FooDataProvider
        mockRepository = MockingFramework.new()
        mockFooDataProvider = mockRepository.CreateMockOfType(FooDataProvider);

        // create a new array of Foo objects
        testFooArray = new Foo[] {Foo.new(), Foo.new(), Foo.new()}

        // the next statement will cause testFooArray to be returned every time we call FooDAtaProvider.GetAllFoos,
        // instead of calling to the database and returning whatever is in there
        // ExpectCallTo and Returns are methods provided by our imaginary mocking framework
        ExpectCallTo(mockFooDataProvider.GetAllFoos).Returns(testFooArray)

        // now begins our actual unit test
        testBar = new Bar(mockFooDataProvider)
        baz = testBar.GetAllFoos()

        // baz should now equal the testFooArray object we created earlier
        Assert.AreEqual(3, baz.length)
    }
}

একটি সাধারণ mocking দৃশ্যকল্প, সংক্ষিপ্তভাবে। অবশ্যই আপনি এখনও ইউনিট আপনার প্রকৃত ডাটাবেস কল পরীক্ষা করতে চান, যার জন্য আপনি ডাটাবেস আঘাত করতে হবে।


আমি পিএইচপি তে কখনোই এটি করতে পারিনি এবং আমি পাইথন ব্যবহার করি নি, তবে আপনি যা করতে চান তা ডাটাবেসের কলগুলি ঠকায়। এটি করার জন্য আপনি কিছু IoC বাস্তবায়ন করতে পারেন কিনা তৃতীয় পক্ষের সরঞ্জাম বা আপনি এটি পরিচালনা করেন, তবে আপনি ডাটাবেস কলারের কিছু মক সংস্করণ বাস্তবায়ন করতে পারেন যেখানে আপনি সেই জাল কলটির ফলাফল নিয়ন্ত্রণ করবেন।

আইওসি একটি সহজ ফর্ম শুধু ইন্টারফেস কোডিং দ্বারা সঞ্চালিত করা যেতে পারে। এটি আপনার কোডে কিছু ধরণের অবজেক্ট অভিযোজন দরকার যা আপনার কাজ করার ক্ষেত্রে এটি প্রযোজ্য না হতে পারে (আমি যা বলেছি তা হল পিএইচপি এবং পাইথন আপনার উল্লেখ।

আশা করি এটি সহায়ক, যদি অন্য কিছু না থাকে তবে এখন অনুসন্ধান করতে কিছু শর্ত আছে।


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

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


ইউনিট পরীক্ষা জন্য পরীক্ষা তথ্য সেট আপ করা একটি চ্যালেঞ্জ হতে পারে।

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


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





unit-testing