পরীক্ষা - ইন-মেমোরি ডিবি বনাম উপহাস


12

পরীক্ষাগুলি লেখার সময়, কেউ কেন কেবলমাত্র উপহাসের উপেক্ষা করে মেমরির একটি ডাটাবেস ব্যবহার করতে চান?

আমি দেখতে পেলাম যে মেমোরি ডাটাবেসগুলি কারোর সংগ্রহস্থলগুলি পরীক্ষা করার জন্য উপকারী হতে পারে। তবে যদি কোনও ফ্রেমওয়ার্ক ব্যবহার করা হয় (যেমন স্প্রিং ডেটা), সংগ্রহস্থলগুলির পরীক্ষা করা ফ্রেমওয়ার্কটি পরীক্ষা করে এবং বাস্তবিক প্রয়োগের যুক্তি নয়।

তামাশা, তবুও দ্রুত বলে মনে হচ্ছে এবং ইউনিট টেস্ট এবং টিডিডি লেখার সময় সাধারণত নিযুক্ত একই প্যাটার্নটি অনুসরণ করে।

তাহলে আমি কী মিস করছি? কখন / কেন একটি ইন-মেমরি ডাটাবেস উপকারী হবে?

উত্তর:


14

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

তবে যদি কোনও ফ্রেমওয়ার্ক ব্যবহার করা হয় (যেমন স্প্রিং ডেটা), সংগ্রহস্থলগুলির পরীক্ষা করা ফ্রেমওয়ার্কটি পরীক্ষা করে এবং বাস্তবিক প্রয়োগের যুক্তি নয়।

একটি প্রকৃত ডাটাবেস ব্যবহার করে আপনি পরীক্ষা করছেন যে আপনি প্রকৃতপক্ষে ফ্রেমওয়ার্কটি সঠিকভাবে কনফিগার করছেন এবং ব্যবহার করছেন। প্রকৃত ডেটাবেস (পরীক্ষামূলক উদাহরণ: স্প্রিং ডেটা পোস্টগ্রিসকিউএল এর 9.2 সংস্করণ সমর্থন করে না) কেবল তখনই প্রকাশিত হয় ফ্রেমওয়ার্কে ত্রুটিগুলি থাকতে পারে।

আমি আমার বেশিরভাগ পরীক্ষার কভারেজটি বিদ্রূপিত উত্সগুলির বিরুদ্ধে লিখব, তবে আমি সত্যিকারের ডাটাবেস ব্যবহার করে সাধারণত অনুশীলিত ব্যবহারের ক্ষেত্রে কিছু শেষ থেকে শেষের জন্য পরীক্ষা লিখি।


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

2

বেশিরভাগ সময়, মেমরির ডাটাবেস টেস্টিং উপহাসের চেয়ে সহজ। এটি আরও অনেক নমনীয়। এবং এটি মাইগ্রেশন ফাইলগুলি ভালভাবে সম্পন্ন করার পরীক্ষা করে (যখন মাইগ্রেশন ফাইল থাকে)।

এই ছদ্ম কোডটি দেখুন:

class InMemoryTest 
{
    /** @test */
    public function user_repository_can_create_a_user()
    {
        $this->flushDatabase();

        $userRepository = new UserRepository(new Database());
        $userRepository->create('name', 'email@email.com');

        $this->seeInDatabase('users', ['name' => 'name', 'email' => 'email@email.com']);
    }
}

class MockingDBTest
{
    /** @test */
    public function user_repository_can_create_a_user()
    {
        $databaseMock = MockLib::mock(Database::class);
        $databaseMock->shouldReceive('save')
                     ->once()
                     ->withArgs(['users', ['name' => 'name', 'email' => 'email@email.com']]);

        $userRepository = new UserRepository($databaseMock);
        $userRepository->create('name', 'email@email.com');
    }
}

InMemoryTestউপর নির্ভর করে না কিভাবে Databaseমধ্যে বাস্তবায়িত হয় UserRepositoryকাজ। এটি কেবল UserRepositoryসর্বজনীন ইন্টারফেস ( create) ব্যবহার করে এবং তারপরে এটির বিরুদ্ধে দৃser়তা দেয়। আপনি যদি প্রয়োগটি পরিবর্তন করেন তবে এই পরীক্ষাটি ভাঙবে না তবে এটি ধীর।

ইতিমধ্যে, MockingDBTestকীভাবে Databaseবাস্তবায়িত হয় তার উপর সম্পূর্ণ নির্ভর করে UserRepository। প্রকৃতপক্ষে, আপনি যদি বাস্তবায়ন পরিবর্তন করেন তবে তবুও এটিকে অন্য কোনও উপায়ে কাজ করে তোলেন, সেই পরীক্ষাটি ভেঙে যায়।

উভয় বিশ্বের সেরা ইন্টারফেস প্রয়োগ করে একটি জাল ব্যবহার করবে Database:

class UsingAFakeDatabaseTest
{
    /** @test */
    public function user_repository_can_create_a_user()
    {
        $fakeDatabase = new FakeDatabase();
        $userRepository = new UserRepository($fakeDatabase);
        $userRepository->create('name', 'email@email.com');

        $this->assertEquals('name', $fakeDatabase->datas['users']['name']);
        $this->assertEquals('email@email.com', $fakeDatabase->datas['users']['email']);
    }
}

interface DatabaseInterface
{
    public function save(string $table, array $datas);
}

class FakeDatabase implements DatabaseInterface
{
    public $datas;

    public function save(string $table, array $datas)
    {
        $this->datas[$table][] = $datas;
    }
}

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

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