কম্পিউটার টিউটোরিয়াল

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড

সিয়ামক মাহমুদী

দ্বারা

টিডিডি, বা টেস্ট-ড্রাইভেন ডেভেলপমেন্ট হল একটি সফ্টওয়্যার ডেভেলপমেন্ট পদ্ধতি যেখানে প্রকৃত কোড প্রয়োগ করার আগে পরীক্ষাগুলি লেখা হয়।

এটির জন্য প্রকল্প/বৈশিষ্ট্যের প্রয়োজনীয়তার মধ্যে "কী" এবং "কিভাবে" এর একটি পরিষ্কার বোঝার প্রয়োজন।

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

সামগ্রিকভাবে, এটি একটি সংক্ষিপ্ত, ইতিমধ্যে ইউনিট-পরীক্ষা কভার, পরিষ্কার কোডবেস রাখতে সহায়তা করে। সময়ের সাথে সাথে, এটি বিকাশ এবং কোড রক্ষণাবেক্ষণের খরচও বাঁচায়৷

এই নিবন্ধে আমরা TDD নিয়ে আলোচনা করব।

প্রসঙ্গটি একটি অ্যান্ড্রয়েড ডেভেলপমেন্ট এনভায়রনমেন্ট, তাই আমরা পদক্ষেপগুলি প্রদর্শনের জন্য একটি নমুনা প্রকল্পের সাথে Kotlin এবং JUnit5 ব্যবহার করব।

যাইহোক, এখানে নির্দেশাবলী এবং কৌশলগুলি অন্যান্য প্রোগ্রামিং ভাষায়ও অনুশীলন করা যেতে পারে।

পূর্বশর্ত

  • কোটলিনের প্রাথমিক জ্ঞান
  • ইউনিট পরীক্ষা লেখার প্রাথমিক জ্ঞান
  • বিদ্রুপ এবং দাবীর জ্ঞান

আমরা প্রোগ্রামিং ভাষা হিসাবে Kotlin এবং ইউনিট পরীক্ষা লিখতে JUnit5 ব্যবহার করব।

মকিটো মক এবং গুপ্তচরদের সাথে কাজ করতে ব্যবহার করা হবে৷

টার্গেট অডিয়েন্স হল যেকোন প্ল্যাটফর্মের যেকোন সফটওয়্যার ডেভেলপার যারা তাদের ক্যারিয়ারে নতুন অধ্যায় খুঁজছেন।

যদিও প্রসঙ্গটি অ্যান্ড্রয়েড, সামগ্রীটি প্ল্যাটফর্মের নির্দিষ্ট বৈশিষ্ট্যগুলির বিষয়ে কথা বলে না। পরিবর্তে, আমরা TDD এর সাথে বিকাশ করার সময় কৌশল, নোট এবং চ্যালেঞ্জের উপর ফোকাস করি।

যদি উপরে আপনার সাথে ঠিক থাকে, তাহলে চলুন শুরু করা যাক।

কীভাবে পরীক্ষা চালিত উন্নয়ন কাজ করে

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড TDD চক্র

উন্নয়ন প্রক্রিয়া একটি চক্র অনুসরণ করে:

  1. একটি ব্যর্থ পরীক্ষা লেখা (গোলাপী বর্গক্ষেত্র)।
  2. পরীক্ষা পাস (সবুজ বর্গক্ষেত্র) করতে কোড প্রয়োগ করা
  3. কোড (নীল বর্গক্ষেত্র) প্রয়োজনমত রিফ্যাক্টর করা এবং নিশ্চিত করা যে পরীক্ষাগুলি ক্রমাগত পাস হচ্ছে (ফ্যাকাশে সবুজ বর্গক্ষেত্র)।
  4. একটি নতুন ব্যর্থ পরীক্ষা লেখা (আবার প্রবাহ পুনরায় চালু করুন)

একটি ব্যর্থ পরীক্ষা লেখা (পিঙ্ক স্কোয়ার)

এই ধাপে, আপনি আপনার কোড কি করতে চান তা বর্ণনা করে শুরু করুন।

কল্পনা করুন যে আপনি আপনার কোডটি সঠিকভাবে আচরণ করছে কিনা তা পরীক্ষা করার জন্য একটি পরীক্ষা দিচ্ছেন। এই পরীক্ষাটি এমন একটি প্রশ্নের মতো যা আপনি আপনার কোড জিজ্ঞাসা করেন, যেমন "আপনি কি এই কাজটি করতে পারেন?"

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

একবার আপনি এই পর্যায়টি শেষ করলে, JUnit5 আপনার তৈরি করা পরীক্ষাগুলি থেকে একটি ব্যাপক প্রতিবেদন তৈরি করবে। এই পরীক্ষাগুলি আপনার কাজের একটি বাস্তব উপস্থাপনা হিসাবে দাঁড়াবে।

এখন, কল্পনা করুন যে আপনার প্রজেক্ট ম্যানেজার তাদের কভারেজ এবং বৈশিষ্ট্য বা পণ্যের উপর আপনার উপলব্ধির নির্ভুলতা উভয়ই মূল্যায়ন করতে এই পরীক্ষার কেস পড়ছেন। এই দৃষ্টিভঙ্গি আলিঙ্গন করা এই উন্নয়নমূলক পর্যায়ের তাৎপর্য সম্পর্কে একটি পরিষ্কার বোঝার অফার করে৷

প্রযুক্তিগত জটিলতা থেকে আপনার ফোকাস সফ্টওয়্যারের আচরণে স্থানান্তর করুন।

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

দৃষ্টিভঙ্গির এই পরিবর্তন আপনাকে সফ্টওয়্যারটির উদ্দেশ্যমূলক ক্রিয়া এবং ফলাফলগুলিকে অগ্রাধিকার দেওয়ার অনুমতি দেয়, যা সঠিকভাবে এর বাস্তব-বিশ্ব আচরণকে প্রতিফলিত করে এমন পরীক্ষাগুলির দিকে পরিচালিত করে৷

টেকনিক্যাল মিনিটিয়ার পরিবর্তে আচরণে মনোযোগ দিয়ে, আপনি নিশ্চিত করেন যে আপনার পরীক্ষাগুলি সফ্টওয়্যারের উদ্দেশ্য এবং ব্যবহারকারীর প্রত্যাশার সাথে ঘনিষ্ঠভাবে সারিবদ্ধ।

কিছু ক্ষেত্রে, আপনি প্রতি কম্পোনেন্টে কয়েকটি টেস্ট কেস দিয়ে শেষ করতে পারেন না (যার উদ্দেশ্য হল:কম কাজ কিন্তু লক্ষ্যযুক্ত) এবং এটি সম্পূর্ণ ঠিক, যতক্ষণ না আপনি প্রকল্পের সমস্ত আচরণগত প্রয়োজনীয়তাগুলি কভার করেন৷

টিপস

  • নির্দিষ্ট হোন: আপনার কোডের আচরণের একটি দিককে ফোকাস করে এমন স্পষ্ট এবং নির্দিষ্ট পরীক্ষার ক্ষেত্রে লিখুন।
  • সাধারণ শুরু করুন:সবচেয়ে সহজ টেস্ট কেস দিয়ে শুরু করুন যা আপনার প্রয়োজনীয় মৌলিক কার্যকারিতা কভার করে।
@Test fun `a sum is calculated from two input numbers`() {}
  • অর্থপূর্ণ নামগুলি ব্যবহার করুন:আপনার পরীক্ষার নামগুলি বর্ণনামূলকভাবে রাখুন যাতে সেগুলি পড়ার যে কেউ জানতে পারে পরীক্ষাটি কী পরীক্ষা করছে৷
@Test fun `Font Ratio is fetched from data source INITIALLY`() {}

সাধারণ ভুলগুলো এড়াতে হবে

  • একবারে অনেক বেশি পরীক্ষা করা হচ্ছে: একক পরীক্ষায় একাধিক জিনিস পরীক্ষা করা এড়িয়ে চলুন। এটি কী ব্যর্থ হচ্ছে তা সনাক্ত করা কঠিন করে তুলতে পারে৷
// Don't do this
@Test fun `pixelSize fits the standart sizes while fontSize is bigger than minumum supported font size but matches the list of special levels of size`() {}
  • বাস্তবায়নের বিবরণের উপর নির্ভর করা: কোডের অভ্যন্তরীণ কাজের সাথে শক্তভাবে সংযুক্ত করা পরীক্ষা লিখবেন না। পরীক্ষাগুলি আচরণের উপর ফোকাস করা উচিত, বাস্তবায়ন নয়৷
// Don't do this
@Test fun `pixelSize is Long and Non-Null and fits the standart sizes then calculated font size is non-null and of type Dimention`() {}

পরীক্ষায় উত্তীর্ণ হওয়ার জন্য কোড প্রয়োগ করা (গ্রিন স্কোয়ার)

এখন যেহেতু আপনার পরীক্ষা রয়েছে, এটি সঠিকভাবে কাজটি কীভাবে করতে হয় তা আপনার কোড শেখানোর সময়।

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

যখন আপনার কোড পরীক্ষায় উত্তীর্ণ হয়, তখন এটি একটি সবুজ আলোর মতো বলে, "হ্যাঁ, আমি এখন কাজটি করতে পারি!"।

এই পদক্ষেপটি আপনার কোড বুঝতে পারে এবং আপনি যে সমস্যার জন্য জিজ্ঞাসা করছেন তা সমাধান করতে পারে তা নিশ্চিত করা।

টিপস

  • নিম্নতম কোড লিখুন:সবচেয়ে সহজ কোড লিখুন যা ব্যর্থ পরীক্ষায় পাস করে। আপনি এখানে ওভার-ইঞ্জিনিয়ারিং এড়ানোর বিষয়ে আরও পড়তে পারেন।
// Test Case 
@Test fun `Storage stores font ratio in key-value`() { 
 // Given
 val fontRatio = 2.0f
 val mockEditor = mockk<SharedPreferences.Editor>(relaxed = true)
 every { mockSharedPreference.edit() } returns mockEditor 
 every { mockEditor.putFloat(any(), any()) } returns mockEditor 
 every { mockEditor.apply() } just Runs 
 // When 
 storage.saveFontRatio(fontRatio) 
 // Then
 verify(exactly = 1) { 
 mockEditor.apply() 
 }
}
// Correct Implementation - Avoid extra implementation
class SharedPreferenceHelper( 
 private val sharedPreferences: SharedPreferences 
) { 
 fun saveFontRatio(fontRatio: Float) {
 sharedPreferences.edit().putFloat("font-ratio", fontRatio).apply() 
 } 
}
// Wrong Implementation 
class SharedPreferenceHelper(
 private val sharedPreferences: SharedPreferences
) { 
 fun saveFontRatio(fontRatio: Float) { 
 if (fontRatio <= 0.0f) 
 throw IllegalArgumentException("Font ratio must be greater than 0.0f") 
 storeValue(key = FONT_RATIO_KEY, value = fontRatio) 
} 
 private fun storeValue(key: String, value: Float){
 val editor = sharedPreferences.edit() editor.putFloat(key, value)
 editor.apply() 
 }
 fun getFontRatio(): Float { 
 return sharedPreferences.getFloat("font_ratio", 1.0f) } 
}
  • ডুপ্লিকেশন এড়িয়ে চলুন: কোড পুনরাবৃত্তি করবেন না. আপনি যদি একাধিক জায়গায় একই রকম যুক্তি লিখতে দেখেন, তাহলে রিফ্যাক্টরিং বিবেচনা করুন। এই প্রাথমিক কোড উন্নতি এই পর্যায়ে করা যেতে পারে, কিন্তু যদি পরিবর্তনের একটি পার্শ্ব-প্রতিক্রিয়া হতে পারে তাহলে এটি উপেক্ষা করুন৷
class ... {
 override fun getDefaultFontSize(): Float {
 val zoomRatio = DEFAULT_SSPEED * DEFAULT_FONT_RATIO / deviceDensity 
 val fontSize = zoomRatio * standardFontSize 
 return fontSize 
 }
 override fun getFontSizeBySSpeed(speed: Int): Float {
 val zoomRatio = speed * DEFAULT_FONT_RATIO / deviceDensity 
 val fontSize = zoomRatio * standardFontSize 
 return fontSize 
 }
}
class ... { 
 override fun getDefaultFontSize(): Float = calculate(DEFAULT_AGE)
 override fun getFontSizeByAge(age: Int): Float = calculate(age) 
 private fun calculate(age: Int): Float {
 val zoomRatio = age * DEFAULT_FONT_RATIO / deviceDensity 
 val fontSize = zoomRatio * standardFontSize 
 return fontSize 
 }
}

সাধারণ ভুলগুলি এড়াতে হবে:

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

কোড রিফ্যাক্টরিং (নীল স্কোয়ার) এবং পরীক্ষার সাফল্য নিশ্চিত করা (ফ্যাকাশে সবুজ স্কোয়ার)

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

আপনি আপনার কোডকে আরও সংগঠিত, বোঝা সহজ বা আরও দ্রুত করার উপায় দেখতে পারেন৷ একবার আপনি খেলা শেষ করার পরে এটিকে আপনার রুম গুছিয়ে রাখার মতো মনে করুন, আপনি খেলা শেষ করার পরে সবকিছু পরিষ্কার এবং সংগঠিত করুন৷ আপনি এটি যা করে তা পরিবর্তন না করেই আপনার কোড উন্নত করুন৷

আপনি এটি করার সাথে সাথে, আপনি আপনার সমস্ত পরীক্ষা চালিয়ে যান যাতে তারা এখনও পাস করে। এই ধাপে পরীক্ষায় ব্যর্থ হলে, এটি একটি ফ্যাকাশে সবুজ সতর্কতা চিহ্নের মতো যা আপনাকে বলছে যে আপনি কিছু পরিষ্কার করেছেন ভুলবশত কোডটি ভেঙে গেছে।

আপনি এই অংশটিকে একটি পৃথক কোড রক্ষণাবেক্ষণ পর্যায় হিসাবে বিবেচনা করতে পারেন।

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

এই পুরো প্রক্রিয়া জুড়ে, মূল বিষয় হল সতর্ক ভারসাম্য বজায় রাখা - পরিমার্জন করার সময় আপনার পরীক্ষাগুলি সফল হওয়া নিশ্চিত করা।

এখানে রিফ্যাক্টরিং পর্বের জন্য কিছু ধারণা এবং কৌশল রয়েছে:

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

মনে রাখবেন যে TDD কোড স্ব-প্রকাশকারী এবং ডকুমেন্টেশন থেকে স্বাধীন হওয়া উচিত।

মনে রাখবেন, রিফ্যাক্টর করার সময়, আপনার সমস্ত পরীক্ষা চালিয়ে যাওয়াটা অত্যন্ত গুরুত্বপূর্ণ যাতে সেগুলি পাস করা অব্যাহত থাকে।

টিপস

  • পরীক্ষাগুলিকে বিস্তৃত রাখুন:নিশ্চিত করুন যে আপনার পরীক্ষাগুলি রিফ্যাক্টরিংয়ের সময় অনাকাঙ্ক্ষিত পার্শ্ব প্রতিক্রিয়াগুলি ধরার জন্য বিভিন্ন পরিস্থিতিতে কভার করে৷
  • রিফ্যাক্টর ধীরে ধীরে:আপনার কোডে ছোট পরিবর্তন করুন এবং যেকোনো রিগ্রেশন তাড়াতাড়ি ধরার জন্য ঘন ঘন পরীক্ষা চালান।

সাধারণ ভুলগুলি এড়াতে হবে:

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

একটি নতুন ব্যর্থ পরীক্ষা লেখা (প্রবাহ পুনরায় চালু করা)

এখন, আপনি পরবর্তী জিনিস সম্পর্কে চিন্তা করুন যা আপনি আপনার কোডটি করতে চান।

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

তারপরে, আপনি পুরো চক্রটি পুনরাবৃত্তি করুন:কোড দিয়ে পরীক্ষা পাস করুন (সবুজ বর্গক্ষেত্র), প্রয়োজনে পরিষ্কার করুন (নীল বর্গক্ষেত্র), এবং সবকিছু কাজ করে তা নিশ্চিত করতে পরীক্ষা চালিয়ে যান (ফ্যাকাশে সবুজ বর্গক্ষেত্র)।

এইভাবে, আপনি সর্বদা এগিয়ে যাচ্ছেন এবং ধাপে ধাপে আপনার কোড তৈরি করছেন।

টিপস

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

প্রতিক্রিয়া লুপ কীভাবে কাজ করে তা এখানে:

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

ফিডব্যাক লুপ নিশ্চিত করে যে আপনার বিকাশ আপনার সফ্টওয়্যারের উদ্দেশ্যের সাথে দৃঢ়ভাবে সামঞ্জস্যপূর্ণ।

সাধারণ ভুলগুলি এড়াতে হবে:

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

আপনি আত্মবিশ্বাসী হলেও কেন আপনার ব্যর্থ পরীক্ষার ধাপটি এড়িয়ে যাওয়া উচিত নয় তা এখানে:

  • উদ্দেশ্যের স্বচ্ছতা:একটি ব্যর্থ পরীক্ষা লেখা বৈশিষ্ট্যটির জন্য আপনার অভিপ্রায়কে স্পষ্ট করে। এটি বাস্তবায়নে ডুব দেওয়ার আগে আপনি যে সঠিক আচরণ এবং ফলাফলের জন্য লক্ষ্য করছেন তা বিবেচনা করতে বাধ্য করে৷
  • অনুমানের যাচাইকরণ:এমনকি যদি আপনি মনে করেন যে আপনি বৈশিষ্ট্যটি বুঝতে পেরেছেন, একটি পরীক্ষা তৈরি করা নিশ্চিত করে যে আপনার অনুমানগুলি বৈধ। আপনার বোধগম্য সঠিক হতে পারে, কিন্তু পরীক্ষা এটিকে বৈধ করে।
  • নিরাপত্তা নেট:একটি ব্যর্থ পরীক্ষা লিখে, আপনি একটি সুরক্ষা নেট স্থাপন করেন যা ভবিষ্যতে রিগ্রেশন প্রতিরোধ করে। এটি বৈশিষ্ট্যের স্পেসিফিকেশন হিসেবে কাজ করে এবং অনিচ্ছাকৃত পার্শ্বপ্রতিক্রিয়া ধরতে সাহায্য করে।
  • ক্রমবর্ধমান উন্নয়ন:TDD ক্রমবর্ধমান উন্নয়নকে উৎসাহিত করে। প্রতিটি নতুন বৈশিষ্ট্য ধাপে ধাপে তৈরি করা হয়েছে, পরীক্ষায় ব্যর্থ হওয়া থেকে কার্যকরী বাস্তবায়ন পর্যন্ত সুস্পষ্ট অগ্রগতি সহ। এই ধাপটি এড়িয়ে যাওয়া সেই অগ্রগতি ব্যাহত করে।
  • ডকুমেন্টেশন:পরীক্ষায় ব্যর্থ হওয়া বৈশিষ্ট্যটির প্রত্যাশিত আচরণকে নথিভুক্ত করে। এই ডকুমেন্টেশনটি আপনার এবং আপনার দলের জন্য মূল্যবান, বিশেষ করে যখন ভবিষ্যতে কোডটি পুনর্বিবেচনা করবেন। সর্বদা মনে রাখবেন যে পণ্য পরিচালক এবং QA-এর জন্য আপনার সমস্ত পরীক্ষার কোড তালিকাভুক্ত করে রিপোর্ট তৈরি করার সিস্টেম রয়েছে। এই প্রতিবেদনগুলি পণ্যটিতে আপনি যে বিশদটি দেখেছেন তা প্রকাশ করে, তাই, তাদের বোঝানোর চেষ্টা করুন যে আপনি বিষয়টি পুঙ্খানুপুঙ্খভাবে বুঝতে পেরেছেন৷

টিডিডি ব্যবহার করে কীভাবে বিকাশ করবেন

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

কিন্তু কিভাবে আমরা এটা অনুশীলন করতে পারি? এটি চেষ্টা করে এবং ধীরে ধীরে এটি অভ্যস্ত করা.

আসুন বাস্তব জগতে কীভাবে এটি ব্যবহার শুরু করতে পারি তা প্রদর্শন করতে একটি নতুন বৈশিষ্ট্য বিকাশ করার সময় TDD-এর চেষ্টা করি৷

আমরা একটি ফন্ট আকার স্বয়ংক্রিয় সেটিং বৈশিষ্ট্য বাস্তবায়ন করা হবে.

আমাদের একটি নিউজ অ্যাপ আছে এবং একজন ব্যবহারকারী নিউজ ফিডের জন্য স্বয়ংক্রিয়-স্ক্রোল-গতি সেট করতে পারেন।

আমরা একটি বৈশিষ্ট্য বাস্তবায়ন করতে চাই যা ব্যবহারকারীর প্রোফাইল পৃষ্ঠায় স্ক্রোল গতি সেট থেকে স্ক্রীন ফন্টের আকার সামঞ্জস্য করে৷

ব্যবহারকারী যদি স্ক্রোল গতি 0 থেকে 1 পর্যন্ত সেট করে, তাহলে ফন্টের আকার 1.3 দ্বারা বৃদ্ধি করা উচিত।

1-এর উপরে যেকোনো স্ক্রোল গতি বৃদ্ধির ফলে ফন্টের আকার 1.2 বৃদ্ধি পাবে।

এই বৈশিষ্ট্যটি ব্যবহারকারীদের খবর পড়ার সময় আরও ভাল অভিজ্ঞতা পেতে দেয়৷

এই GitHub সংগ্রহস্থলে আমরা যে কোডটি অন্বেষণ করি তাও আমি শেয়ার করেছি৷

নির্দ্বিধায় ক্লোন করুন এবং এটির সাথে খেলুন৷

আমরা উন্নয়নে অগ্রসর হওয়ার সাথে সাথে পদক্ষেপগুলি অনুসরণ করার চেষ্টা করুন। এটি আপনাকে TDD-এর প্রেক্ষাপটে কৌশল এবং চিন্তাভাবনাকে কার্যত উপলব্ধি করতে সাহায্য করবে।

সুতরাং, অ্যান্ড্রয়েড স্টুডিও খুলুন এবং একটি নতুন প্রকল্প তৈরি করুন৷

ফন্ট সাইজ স্বয়ংক্রিয় সেটিং বৈশিষ্ট্য ডেটা ফ্লো চার্ট

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড Android অ্যাপে একটি নমুনা বৈশিষ্ট্যের DFD

উপরে ডেটা ফ্লো শেষ পর্যন্ত কেমন হওয়া উচিত তার ফ্লোচার্ট।

এখানে প্রতিটি আকর্ষক উপাদানের একটি রূপরেখা রয়েছে:

AutoScrollSettingsUseCase ক্লাস FontRatio গণনা এবং সংরক্ষণ করার জন্য যুক্তি পরিচালনা করবে নির্বাচিত স্ক্রোল গতির উপর ভিত্তি করে।

এই ব্যবহারের ক্ষেত্রে UserRepository এর উপর নির্ভরশীলতা থাকবে FontRatio সংরক্ষণ করা হচ্ছে মান।

UserRepository-এ , FontRatio সংরক্ষণ এবং পুনরুদ্ধার করার পদ্ধতি আছে Storage ব্যবহার করে মান প্রক্রিয়া যখনই একটি নতুন FontRatio সঞ্চয়স্থানে পাঠানো হয়, যে কোনো পর্যবেক্ষণযোগ্য সর্বশেষ মান সহ একটি নির্গমন পাবে।

UserProfileViewModel-এ , সেখানে AutoScrollSettingsUseCase এর একটি উদাহরণ রয়েছে যখনই ব্যবহারকারী স্ক্রোল গতি আপডেট করে তখনই এটি বলা হচ্ছে। এটি FontRatio এর পুনঃগণনাকে ট্রিগার করবে এবং এটি সংগ্রহস্থলের মাধ্যমে সংরক্ষিত।

ব্যবহারকারীকে তাদের পছন্দসই স্ক্রোল গতি ইনপুট করার অনুমতি দেওয়ার জন্য আমাদের ব্যবহারকারী সেটিং বিভাগে প্রয়োজনীয় UI উপাদান থাকবে। এটি স্ট্যান্ডার্ড Android UI উপাদান যেমন NumberPicker ব্যবহার করে করা যেতে পারে অথবা কাস্টম UI উপাদান (আমরা এই অংশগুলি নিয়ে আলোচনা করব না)।

এটি একটি সাধারণ বৈশিষ্ট্যের জন্য ব্রেকডাউন এবং প্রতিবার আপনি এটির মধ্য দিয়ে যান, এটি আরও স্পষ্ট হয়ে ওঠে যে পদক্ষেপগুলি এবং চূড়ান্ত ফলাফল কী। আপনার পরিবর্তনের জন্য এটি করা অত্যন্ত গুরুত্বপূর্ণ৷

পরীক্ষাগুলি কীভাবে লিখবেন

প্রথম ধাপ হল সবসময় পরীক্ষা ক্লাস নিজেই তৈরি করা। এই ক্ষেত্রে, আমাদের কমপক্ষে নিম্নলিখিত পরীক্ষার ক্লাস থাকবে:

  • UserRepositoryTest
  • AutoScrollSettingTest
  • UserSettingsViewModelTest

আমি ViewModel অংশ দিয়ে শুরু করতে পছন্দ করি।

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

unitTest-এর ভিতরে টেস্ট ফাইল তৈরি করা যাক প্রকৃত বৈশিষ্ট্য কোডের মতো একই প্যাকেজ পথ অনুসরণ করে উৎস কোডের ডিরেক্টরি।

বাস্তবে TDD উত্তরাধিকার কাজের উন্নয়নের সাথে ভিন্ন।

TDD-এর মাধ্যমে আমরা ফাইল এবং সম্পত্তি (ক্ষেত্র) তৈরির প্রক্রিয়াকে বুস্ট করতে একটি IDE ব্যবহার করি। কিন্তু আমরা ম্যানুয়ালি টেস্ট ফাইল তৈরি করি! কিছু চেষ্টা করার পর, IDE-এর এই দিকটি সহজ হয়ে যাবে।

কোড স্ট্রাকচার (প্যাকেজ) তৈরি করুন এবং তারপর প্যাকেজে ডান ক্লিক করে এবং Class নির্বাচন করে আপনার টেস্ট ক্লাস তৈরি করুন প্রকার

এটির জন্য একটি বর্ণনামূলক নাম চয়ন করুন (যদি আপনি ইতিমধ্যে না থাকেন তবে সম্ভবত আপনার এটির জন্য একটি নিয়ম অনুসরণ করা উচিত)।

উদাহরণস্বরূপ:xxx is tested for , যেখানে xxx পরীক্ষিত উপাদানের নাম।

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড ফাইল তৈরি করতে IDE ব্যবহার করুন

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড

এখন, খালি পরীক্ষা তৈরি করা যাক। যতটা সম্ভব বিস্তৃত হওয়ার চেষ্টা করুন।

চিত্র অনুসারে, আমাদের এই বৈশিষ্ট্যটির জন্য খুব বেশি যুক্তি থাকবে না।

ইউনিট পরীক্ষার ফাংশন লেখার জন্য দুটি প্রধান কৌশল রয়েছে:

  • এএএ
  • প্রদত্ত/কখন/তারপর
@Test fun `strategy A`(){ 
 // Arrange
 // Act 
 // Assert 
}
@Test fun `strategy B`(){ 
 // Given 
 // When 
 // Then 
}

আসুন একটি বেছে নিন এবং আপনার সমস্ত পরীক্ষার জন্য এটি অনুসরণ করুন৷

ধারণাটি একই:ক্লাস্টার করে আপনার পরীক্ষার কোডটি পড়া এবং বজায় রাখা সহজ।

আপাতত এটাই আমার কাছে:

class UserProfileViewModel is tested for` {
 // Unimplemented Class 
 val viewModel = UserProfileViewModel()
 @Test
 fun Font Ratio is fetched from data source`(){}
 @Test
 fun `Scroll Speed update is called so fontSize calculations are triggered`() {}
 @Test
 fun `Font Ratio is updated with new emissions from data source`() {}
}

পরীক্ষা চালানো যাক!

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড একটি অনুপস্থিত পরীক্ষার লক্ষ্যের কারণে পরীক্ষা ব্যর্থ হয়েছে

এটা ব্যর্থ হচ্ছে. আসলে, বিল্ড ব্যর্থ হয়েছে- পরীক্ষা নয়।

অভিনন্দন! আমরা এইমাত্র টিডিডি চক্রের প্রথম ধাপে পৌঁছেছি:

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড TDD চক্রের প্রথম ধাপ

যেহেতু ViewModel এখনও বিদ্যমান নেই, আমাদের লাল রং আছে।

এখন, ViewModel-এর একটি উদাহরণ তৈরি করা যাক,

সুতরাং, আমরা একটি অনুপস্থিত শ্রেণী বা অবাস্তব কোড তৈরি করতে একটি IDE ব্যবহার করি।

এই ডায়ালগ পপআপ করতে, আমি পয়েন্টারটিকে অপ্রয়োগিত অংশে নিয়ে যাই এবং Option + Return (macOS-এ) হিট করি।

তারপর, প্রদত্ত বিকল্পগুলি অনুসরণ করুন:

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড TDD অ্যাকশন:UnitTest ফাইলের মাধ্যমে টার্গেট ফাইল তৈরি করুন

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড নতুন ফাইলের জন্য সঠিক গন্তব্য চয়ন করুন

এবং এখন পরীক্ষাগুলি পুনরায় চালানো যাক (শেষ ধাপ):

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড পরীক্ষায় উত্তীর্ণ দেখানো হচ্ছে

হ্যাঁ! এটা পাস.

মনে রাখবেন যে এই পরীক্ষার একটি খালি শরীর আছে এবং তারা কিছুই পরীক্ষা করে না! এটা সঠিক এবং ঠিক আছে।

এমনকি আমাদের DFD ডায়াগ্রামের প্রতিটি উপাদানের জন্য সমস্ত পরীক্ষার ক্লাস (এখনও একটি খালি পরীক্ষার বডি সহ) তৈরি করা চালিয়ে যাওয়া উচিত - আমি নিবন্ধের শুরুতে এগুলি শেয়ার করেছি৷

আমরা এটি কার্যকর করার আগে এটি বৈশিষ্ট্যটি আরও স্পষ্টভাবে বুঝতে সাহায্য করে৷

অবশেষে, আমাদের প্রায় 3-4টি পরীক্ষা ক্লাস থাকবে যাতে সাধারণ পরিস্থিতি এবং ইউনিট পরীক্ষা কভার করা যায়।

এটি এরকম কিছু দেখাবে:

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড নূন্যতম খালি পরীক্ষার ক্ষেত্রে

আসুন তাদের একটিকে উদাহরণ হিসেবে প্রয়োগ করি।

কিন্তু, তার আগে, আমাদের এই বৈশিষ্ট্যের UI এবং ডোমেন ডেটা মডেলগুলির সাথে কাজ করতে হবে।

সুতরাং, ডাটা ঘুরিয়ে নিতে সক্ষম হওয়ার জন্য, আসুন আপনার প্রয়োজনীয় ডেটা ক্লাসগুলি আগে থেকেই তৈরি করি৷

আমাদের ProfileViewModel এ ফিরে যান পরীক্ষা ক্লাস, আমাদের একটি খালি ইউনিট পরীক্ষা ফাংশন আছে। আসুন এটি বাস্তবায়ন করি।

মনে রাখবেন যে এখানে মূল বিষয় হল পরীক্ষাটি মনোযোগ সহকারে পড়া এবং অতিরিক্ত বাস্তবায়ন এড়িয়ে চলা।

শুধুমাত্র প্রয়োজনীয়তা বাস্তবায়নের অনুমতি দেওয়া হয়৷

এই ক্ষেত্রে, আমাদের ডেটার একটি স্ট্রিম প্রয়োজন যা পূর্বে তৈরি করা ডেটা উত্সের সাথে সংযুক্ত (UserRepository )

ভুলে যাবেন না:আমাদের প্রথমে একটি ব্যর্থ পরীক্ষা দরকার।

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড ইনার বডি প্রয়োগ করুন

পরীক্ষার ফাংশন বডি (লাল ফন্ট দিয়ে চিহ্নিত) ভিতরে অপ্রয়োজনীয় অংশগুলি লক্ষ্য করুন।

এখন, কোডটি বাস্তবায়ন করা যাক, তারপর এটিকে পাস করার জন্য এটিকে রিফ্যাক্টর করি।

আমি এখানে ফ্লো স্ট্রীম পরীক্ষা করার জন্য ক্লাস এবং অবজেক্ট এবং টারবাইনকে উপহাস করার জন্য MockK লাইব্রেরি ব্যবহার করছি৷

আপনি যদি তাদের সাথে পরিচিত না হন তবে আতঙ্কিত হবেন না! শুধু তাদের অফিসিয়াল ওয়েবপেজ দেখুন এবং তাদের চেষ্টা করুন.

চলুন প্রথমে নির্ভরতা তৈরি করি এবং নামযুক্ত আর্গুমেন্ট ব্যবহার করে ভিউমডেলে যোগ করি। পরীক্ষার কোডের মাধ্যমে সঠিক নাম পরিচয় করিয়ে দেওয়ার জন্য IDE-এর মাধ্যমে প্যারামিটার তৈরি করার সময় নামযুক্ত আর্গুমেন্ট আমাদের সাহায্য করে৷

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড আইডিই ডায়ালগ ব্যবহার করে অনুপস্থিত প্যারামিটার তৈরি করুন

FontRatio এর জন্যও একই কাজ করুন রিপোজিটরির ভিতরে পরিবর্তনশীল।

অবশেষে, চূড়ান্ত পরীক্ষার কোড নিচের কোডের মত কিছু হতে পারে:

class `UserProfileViewModel is tested for` {
 init {
 Dispatchers.setMain(Dispatchers.Unconfined)
 }
 val mockUserRepository = mockk<UserRepository>()
 @Test
 fun `Font Ratio is fetched from data source`() = runTest {
 // Given
 val expectedRatio = 2.0f
 every { mockUserRepository.fontRatio } returns flowOf(FontRatioUiModel(expectedRatio))
 val viewModel = UserProfileViewModel(userRepository = mockUserRepository)
 // When
 viewModel.fontRatio.test {
 val fromDataSource = expectItem()
 // Then
 assertEquals(/* expected = */ expectedRatio, /* actual = */ fromDataSource.fontRatio)
 }
 }
...
}

মনে রাখবেন যে আমরা এখানে ভিউমডেল বা সংগ্রহস্থলের অভ্যন্তরীণ অংশগুলি প্রয়োগ করি না।

আমরা পরীক্ষা বডি থেকে ত্রুটি অপসারণ করার জন্য অনুপস্থিত অংশগুলি তৈরি করি।

আমরা পরবর্তী পুনরাবৃত্তিতে সেই বিবরণগুলি বাস্তবায়ন করব।

এখন পরীক্ষা চালান।

অবশ্যই এটি ব্যর্থ হবে, কারণ আমরা FontRatio বাস্তবায়ন করিনি ভিতরে ProfileViewModel .

এখন, পরীক্ষা পাস (ন্যূনতম বাস্তবায়ন) করতে ViewModelটিকে রিফ্যাক্টর করুন।

এই ক্ষেত্রে, শুধুমাত্র রাষ্ট্র প্রবাহকে সংগ্রহস্থলের সাথে সংযুক্ত করতে হবে। আমরা ইতিমধ্যে এটি পূর্ববর্তী পুনরাবৃত্তিতে নির্ভরতা হিসাবে যুক্ত করেছি।

এখানে চূড়ান্ত কোড:

class UserProfileViewModel(
 userRepository: UserRepository
) : ViewModel() {
 val fontRatio: StateFlow<FontRatioUiModel> = userRepository.fontRatio.stateIn(
 initialValue = FontRatioUiModel(DEFAULT_FONT_RATIO),
 scope = viewModelScope,
 started = SharingStarted.Lazily
 )
 companion object {
 private const val DEFAULT_FONT_RATIO = 1.0f
 }
}

আবার পরীক্ষা চালান, এবং বুম! এটা পাস!

মাস্টার অ্যান্ড্রয়েড টিডিডি:পরীক্ষা-চালিত উন্নয়নের জন্য একটি ব্যবহারিক গাইড প্রধান কোডের ন্যূনতম প্রয়োগের পরে পরীক্ষায় উত্তীর্ণ হওয়া

এই ইউনিট পরীক্ষার মাধ্যমে, আমরা UserProfileViewModel এর একটি প্রাথমিক অংশ প্রয়োগ করেছি উপাদান কিন্তু শুধুমাত্র প্রয়োজনীয় অংশ। বাকি পরীক্ষার ক্ষেত্রেও একই কাজ করুন।

এই পরীক্ষার ক্ষেত্রে আপনি সাধারণ ইউনিট পরীক্ষার মতো আচরণ করবেন না (যা দ্রুত চলে এবং পাস করে)।

প্রথমে প্রযুক্তিগত এবং পণ্যের প্রয়োজনীয়তা বুঝতে এটিতে কিছু সময় ব্যয় করুন। তারপর, পরিকল্পনাটি রোলআউট করুন এবং বাস্তবায়ন শুরু করুন। কয়েকবার চেষ্টা করার পর, TDD ভাবে চিন্তা করা সহজ হবে।

সোর্স কোড

এই প্রজেক্টের সোর্স কোড এবং রিপোজিটরি আমার GitHub পৃষ্ঠায় উপলব্ধ।

নির্দ্বিধায় এটি পরীক্ষা করে দেখুন এবং পরবর্তী পদক্ষেপগুলি সম্পূর্ণ করুন৷ আমি বিভিন্ন শাখায় পুনরাবৃত্তি আলাদা করেছি যাতে আপনি এটিকে নিজের বাস্তবায়নের সাথে তুলনা করতে পারেন।

উপসংহার

সুতরাং, টেস্ট-ড্রাইভেন ডেভেলপমেন্ট (TDD) এ ডুব দেওয়ার পরে এবং এর ইনস এবং আউটগুলি অন্বেষণ করার পরে, আমি বলতে চাই, এটি একটি গেম-চেঞ্জার!

আমাকে আপনার জন্য এটি ভেঙে দিতে দিন:

মূল পয়েন্ট:

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

আমরা পরীক্ষার ক্লাস তৈরি করে এবং খালি পরীক্ষার ফাংশন লিখে শুরু করেছি কিন্তু এটি শেষ করা এখন আপনার কাজ (অথবা আপনি এখনই শেয়ার্ড রেপোতে যেতে পারেন :))।

এমন পরীক্ষা করাটা একটু অদ্ভুত বলে মনে হতে পারে যেগুলো কিছুই করে না, কিন্তু এটা সবই পরিকল্পনার অংশ।

এরপরে, আমরা একটি ডেটা ফ্লো চার্টের উপর ভিত্তি করে আমাদের বৈশিষ্ট্যগুলি কী করা উচিত তার একটি পরিষ্কার পরিকল্পনা তৈরি করেছি৷ এটি আমাদের বাস্তবায়নে ডুব দেওয়ার আগে প্রয়োজনীয়তাগুলি বুঝতে সাহায্য করেছে৷

পরিকল্পনা হাতে নিয়ে, আমরা প্রয়োজনীয় উপাদানগুলি বাস্তবায়ন শুরু করেছি (এই ক্ষেত্রে ভিউমডেল), আমাদের পরীক্ষাগুলি প্রথমে ব্যর্থ হয়েছে তা নিশ্চিত করে। এটা ঠিক, পরীক্ষায় ব্যর্থ হওয়া আসলে TDD-তে একটা ভালো জিনিস!

ধীরে ধীরে, আমরা UserAutoScrollSettingsUseCase সেট আপ করার মতো টুকরোগুলিকে একসাথে সংযুক্ত করেছি স্বয়ংক্রিয়-স্ক্রোল গতির উপর ভিত্তি করে ফন্টের আকার গণনা পরিচালনা করার জন্য ক্লাস (প্রজেক্ট রেপো পরীক্ষা করুন)।

আমরা UI উপাদানগুলিও মোকাবেলা করেছি, ব্যবহারকারীদের তাদের পছন্দসই স্ক্রোল গতি ইনপুট করার অনুমতি দেয় এবং নিশ্চিত করে যে ফন্টের আকার সেই অনুযায়ী সামঞ্জস্য করা হয়েছে (প্রজেক্ট রেপো পরীক্ষা করুন)।

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

শেষ পর্যন্ত, আমাদের "ফন্ট সাইজ স্বয়ংক্রিয় সেটিং" বৈশিষ্ট্যটি চালু এবং চলমান ছিল, যা পরীক্ষাগুলি উড়ন্ত রঙের সাথে পাস করেছিল৷

মনে রাখবেন, টিডিডি পরীক্ষার মাধ্যমে তাড়াহুড়া করা বা পাগলের মতো কোডিং করা নয়। এটি আপনার বিকাশের প্রক্রিয়ায় ইচ্ছাকৃত এবং চিন্তাশীল হওয়ার বিষয়ে, যা দীর্ঘমেয়াদে বড় সময় পরিশোধ করে।

সুতরাং, আপনি যদি আপনার সফ্টওয়্যার ডেভেলপমেন্ট গেমকে সমতল করতে চান, টিডিডিকে একটি শট দিন! এটি একটি শক্তিশালী পদ্ধতি যা আপনার কোডকে আরও শক্ত করে তুলবে, বাগগুলি কমিয়ে দেবে এবং সামগ্রিকভাবে আপনাকে আরও ভাল বিকাশকারী করে তুলবে৷

আমি যা শেয়ার করেছি তা হল, আমরা কীভাবে আমার দলে কাজ করি এবং এটি আমাদের জন্য কাজ করছে, তবে এটি প্রতিটি দল/কোম্পানীর জন্য সঠিক সমাধান নয়। এটি আপনার কিনা তা আপনাকে খুঁজে বের করতে হবে। আপনি যদি মনে করেন যে আমি এই সমাধানটি উন্নত করতে পারি তাহলে আমাকে জানান৷

শুভ কোডিং! 🚀

বিনামূল্যে কোড শিখুন. freeCodeCamp-এর ওপেন সোর্স পাঠ্যক্রম 40,000-এরও বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন


  1. উইন্ডোজ 10-এ আপনার ফোন অ্যাপে ইমেজ থেকে কীভাবে টেক্সট কপি করবেন

  2. আপনার কি আপনার ম্যাকবুককে এয়ারপ্লেন মোডে রাখতে হবে?

  3. কিভাবে Outlook এ ব্যক্তিগতকৃত গণ ইমেল পাঠাতে হয়

  4. কিভাবে ম্যাকের কাজ করছে না এমন স্ক্রিনশট ঠিক করবেন