প্রকৌশলী হিসাবে, আমরা এমন জিনিসগুলি তৈরি করতে চাই যা কাজ করে , কিন্তু আমরা তৈরি করি প্রতিটি নতুন বৈশিষ্ট্যের সাথে, আমরা অনিবার্যভাবে আমাদের অ্যাপগুলির আকার এবং জটিলতা বৃদ্ধি করি।
পণ্য বাড়ার সাথে সাথে আপনার পরিবর্তন দ্বারা প্রভাবিত প্রতিটি কার্যকারিতা ম্যানুয়ালি (যেমন, আপনার হাত দিয়ে) পরীক্ষা করা আরও বেশি সময়সাপেক্ষ হয়ে ওঠে।
স্বয়ংক্রিয় পরীক্ষার অনুপস্থিতির কারণে আমাদের হয় খুব বেশি সময় ব্যয় করা হয় এবং আমাদের শিপিংয়ের গতি কমিয়ে দেয় বা বেগ বাঁচাতে খুব কম খরচ করে, ফলে পেজারডিউটি থেকে গভীর রাতের কলগুলির সাথে ব্যাকলগে নতুন বাগ দেখা দেয়।
বিপরীতে, কম্পিউটার একই বার বার প্রোগ্রাম করা যেতে পারে . সুতরাং, আসুন কম্পিউটারে পরীক্ষা অর্পণ করা যাক!
টেস্টিং পিরামিড ধারণাটি তিনটি প্রধান ধরণের পরীক্ষার পরামর্শ দেয়: ইউনিট, ইন্টিগ্রেশন এবং এন্ড-টু-এন্ড । আসুন প্রতিটি ধরণের গভীরে ডুব দেওয়া যাক এবং বুঝতে পারি কেন আমাদের প্রতিটির প্রয়োজন।
একটি ইউনিট হল যুক্তির একটি ছোট অংশ যা আপনি বিচ্ছিন্নভাবে পরীক্ষা করেন (অন্যান্য উপাদানগুলির উপর নির্ভর না করে)।
ইউনিট পরীক্ষা দ্রুত হয়. সেকেন্ডের মধ্যেই শেষ হয়। বিচ্ছিন্নতা তাদের যেকোন সময়ে স্থানীয়ভাবে এবং সিআই-তে এগুলি চালানোর অনুমতি দেয়, নির্ভরশীল পরিষেবাগুলি/এপিআই এবং ডাটাবেস কল তৈরি না করে।
ইউনিট পরীক্ষার উদাহরণ: একটি ফাংশন যা দুটি সংখ্যা গ্রহণ করে এবং তাদের একসাথে যোগ করে। আমরা এটিকে বিভিন্ন যুক্তি দিয়ে কল করতে চাই এবং দাবি করতে চাই যে প্রত্যাবর্তিত মানটি সঠিক।
// Function "sum" is the unit const sum = (x, y) => x + y test('sums numbers', () => { // Call the function, record the result const result = sum(1, 2); // Assert the result expect(result).toBe(3) }) test('sums numbers', () => { // Call the function, record the result const result = sum(5, 10); // Assert the result expect(result).toBe(15) })
একটি আরও আকর্ষণীয় উদাহরণ হল প্রতিক্রিয়া উপাদান যা API অনুরোধ শেষ হওয়ার পরে কিছু পাঠ্য রেন্ডার করে। আমাদের পরীক্ষার জন্য প্রয়োজনীয় মান ফেরত দিতে, কম্পোনেন্ট রেন্ডার করতে এবং রেন্ডার করা এইচটিএমএল-এ আমাদের প্রয়োজনীয় বিষয়বস্তু আছে বলে দাবি করার জন্য আমাদের API মডিউলটিকে উপহাস করতে হবে।
// "MyComponent" is the unit const MyComponent = () => { const { isLoading } = apiModule.useSomeApiCall(); return isLoading ? <div>Loading...</div> : <div>Hello world</div> } test('renders loading spinner when loading', () => { // Mocking the API module, so that it returns the value we need jest.mock(apiModule).mockReturnValue(() => ({ useSomeApiCall: jest.fn(() => ({ // Return "isLoading: false" for this test case isLoading: false })) })) // Execute the unit (render the component) const result = render(<MyComponent />) // Assert the result result.findByText('Loading...').toBeInTheDocument() }) test('renders text content when not loading', () => { // Mocking the API module jest.mock(apiModule).mockReturnValue(() => ({ useSomeApiCall: jest.fn(() => ({ // Return "isLoading: false" for this test case isLoading: false })) })) // Execute the unit (render the component) const result = render(<MyComponent />) // Assert the result result.findByText('Hello world').toBeInTheDocument() })
যখন আপনার ইউনিট অন্যান্য ইউনিটের (নির্ভরতা) সাথে ইন্টারঅ্যাক্ট করে, তখন আমরা একে ইন্টিগ্রেশন বলি। এই পরীক্ষাগুলি ইউনিট পরীক্ষার চেয়ে ধীর, তবে তারা পরীক্ষা করে যে আপনার অ্যাপের অংশগুলি কীভাবে সংযুক্ত হয়।
ইন্টিগ্রেশন পরীক্ষার উদাহরণ: একটি পরিষেবা যা একটি ডাটাবেসে ব্যবহারকারী তৈরি করে। পরীক্ষাগুলি চালানোর সময় এটির জন্য একটি DB উদাহরণ ( নির্ভরতা ) উপলব্ধ হওয়া প্রয়োজন। আমরা পরীক্ষা করব যে পরিষেবাটি DB থেকে একজন ব্যবহারকারী তৈরি এবং পুনরুদ্ধার করতে পারে।
import db from 'db' // We will be testing "createUser" and "getUser" const createUser = name => db.createUser(name) // creates a user const getUser = name => db.getUserOrNull(name) // retrieves a user or null test("creates and retrieves users", () => { // Try to get a user that doesn't exist, assert Null is returned const nonExistingUser = getUser("i don't exist") expect(nonExistingUser).toBe(null); // Create a user const userName = "test-user" createUser(userName); // Get the user that was just created, assert it's not Null const user = getUser(userName); expect(user).to.not.be(null) })
এটি একটি এন্ড-টু-এন্ড পরীক্ষা যখন আমরা সম্পূর্ণরূপে স্থাপন করা অ্যাপটি পরীক্ষা করি, যেখানে এর সমস্ত নির্ভরতা উপলব্ধ। এই পরীক্ষাগুলি প্রকৃত ব্যবহারকারীর আচরণকে সর্বোত্তমভাবে অনুকরণ করে এবং আপনাকে আপনার অ্যাপে সমস্ত সম্ভাব্য সমস্যাগুলি ধরতে দেয়, তবে সেগুলি হল সবচেয়ে ধীর ধরনের পরীক্ষা৷
যখনই আপনি এন্ড-টু-এন্ড পরীক্ষা চালাতে চান, আপনাকে অবশ্যই সমস্ত পরিকাঠামোর ব্যবস্থা করতে হবে এবং নিশ্চিত করতে হবে যে আপনার পরিবেশে তৃতীয় পক্ষের প্রদানকারীরা উপলব্ধ রয়েছে।
আপনি শুধুমাত্র আপনার অ্যাপের মিশন-সমালোচনামূলক বৈশিষ্ট্যগুলির জন্য এগুলি পেতে চান৷
আসুন একটি এন্ড-টু-এন্ড পরীক্ষার উদাহরণ দেখি: লগইন প্রবাহ। আমরা অ্যাপে যেতে চাই, লগইন বিশদ পূরণ করতে, এটি জমা দিতে এবং স্বাগত বার্তা দেখতে চাই।
test('user can log in', () => { // Visit the login page page.goto('https://example.com/login'); // Fill in the login form page.fill('#username', 'john'); page.fill('#password', 'some-password'); // Click the login button page.click('#login-button'); // Assert the welcome message is visible page.assertTextVisible('Welcome, John!') })
মনে রাখবেন যে এন্ড-টু-এন্ড পরীক্ষাগুলি ইন্টিগ্রেশনের চেয়ে ধীর , এবং ইন্টিগ্রেশন পরীক্ষাগুলি ইউনিট পরীক্ষার চেয়ে ধীর ।
আপনি যে বৈশিষ্ট্যটিতে কাজ করছেন তা যদি মিশন-গুরুত্বপূর্ণ হয়, তাহলে অন্তত একটি এন্ড-টু-এন্ড পরীক্ষা লেখার কথা বিবেচনা করুন (যেমন প্রমাণীকরণ প্রবাহ বিকাশ করার সময় লগইন কার্যকারিতা কীভাবে কাজ করে তা পরীক্ষা করা)।
মিশন-ক্রিটিকাল ফ্লো ছাড়াও, আমরা যতটা সম্ভব এজ কেস এবং বৈশিষ্ট্যের বিভিন্ন অবস্থা পরীক্ষা করতে চাই। ইন্টিগ্রেশন পরীক্ষাগুলি আমাদের অ্যাপের অংশগুলি একসাথে কীভাবে কাজ করে তা পরীক্ষা করার অনুমতি দেয়।
শেষ পয়েন্ট এবং ক্লায়েন্ট উপাদানগুলির জন্য একীকরণ পরীক্ষা করা একটি ভাল ধারণা। এন্ডপয়েন্টগুলিকে অপারেশন করা উচিত, প্রত্যাশিত ফলাফল তৈরি করা উচিত এবং কোনো অপ্রত্যাশিত ত্রুটি নিক্ষেপ করা উচিত নয়।
ক্লায়েন্ট উপাদানগুলি সঠিক বিষয়বস্তু প্রদর্শন করা উচিত এবং ব্যবহারকারীর মিথস্ক্রিয়াগুলিতে প্রতিক্রিয়া জানানো উচিত যে আপনি তাদের প্রতিক্রিয়া আশা করেন।
এবং অবশেষে, কখন আমাদের ইউনিট পরীক্ষা বেছে নেওয়া উচিত? সমস্ত ছোট ফাংশন যা বিচ্ছিন্নভাবে পরীক্ষা করা যেতে পারে, যেমন sum
যা সংখ্যার যোগফল, Button
যা রেন্ডার করে <button>
ট্যাগ, ইউনিট পরীক্ষার জন্য দুর্দান্ত প্রার্থী। আপনি যদি টেস্ট চালিত উন্নয়ন পদ্ধতি অনুসরণ করেন তবে ইউনিটগুলি নিখুঁত।
কিছু পরীক্ষা লিখুন! (তবে ছোট শুরু করুন)
এটি কীভাবে কাজ করে তা বুঝতে উপরের জিনিসগুলি একবার করুন। তারপরে, কিছু বৈশিষ্ট্য/বাগ কাজের সময় এটি আবার করুন। তারপরে এটি আপনার সহকর্মীদের সাথে ভাগ করুন যাতে আপনি সবাই পরীক্ষা লিখতে পারেন, সময় বাঁচান এবং রাতে আরও ভাল ঘুমান!