স্থানীয় ইউনিট পরীক্ষা তৈরি করুন

একটি স্থানীয় পরীক্ষা একটি Android ডিভাইস বা এমুলেটরের পরিবর্তে সরাসরি আপনার নিজস্ব ওয়ার্কস্টেশনে চলে। যেমন, এটি পরীক্ষা চালানোর জন্য একটি Android ডিভাইসের পরিবর্তে আপনার স্থানীয় জাভা ভার্চুয়াল মেশিন (JVM) ব্যবহার করে। স্থানীয় পরীক্ষাগুলি আপনাকে আপনার অ্যাপের যুক্তিকে আরও দ্রুত মূল্যায়ন করতে সক্ষম করে। যাইহোক, অ্যান্ড্রয়েড ফ্রেমওয়ার্কের সাথে ইন্টারঅ্যাক্ট করতে না পারা আপনি যে ধরনের পরীক্ষা চালাতে পারেন তাতে সীমাবদ্ধতা তৈরি করে।

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

ইউনিট পরীক্ষাগুলি সাধারণত সহজ হয় তবে তাদের সেটআপ সমস্যাযুক্ত হতে পারে যখন পরীক্ষার অধীনে ইউনিটটি পরীক্ষাযোগ্যতার কথা মাথায় রেখে ডিজাইন করা হয় না:

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

অ্যান্ড্রয়েডে সাধারণ ইউনিট পরীক্ষার কৌশল সম্পর্কে জানতে, কী পরীক্ষা করতে হবে তা পড়ুন।

স্থানীয় পরীক্ষার অবস্থান

ডিফল্টরূপে, স্থানীয় ইউনিট পরীক্ষার জন্য উত্স ফাইলগুলি module-name/src/test/ এ স্থাপন করা হয়। আপনি যখন Android স্টুডিও ব্যবহার করে একটি নতুন প্রকল্প তৈরি করেন তখন এই ডিরেক্টরিটি ইতিমধ্যেই বিদ্যমান থাকে।

পরীক্ষার নির্ভরতা যোগ করা হচ্ছে

JUnit টেস্টিং ফ্রেমওয়ার্ক দ্বারা প্রদত্ত স্ট্যান্ডার্ড API ব্যবহার করার জন্য আপনাকে আপনার প্রকল্পের জন্য পরীক্ষার নির্ভরতাগুলিও কনফিগার করতে হবে।

এটি করতে, আপনার অ্যাপের মডিউলের build.gradle ফাইলটি খুলুন এবং নির্ভরতা হিসাবে নিম্নলিখিত লাইব্রেরিগুলি নির্দিষ্ট করুন৷ testImplementation ফাংশনটি ব্যবহার করুন ইঙ্গিত করার জন্য যে তারা স্থানীয় পরীক্ষার উত্স সেটে প্রযোজ্য, অ্যাপ্লিকেশন নয়:

dependencies {
  // Required -- JUnit 4 framework
  testImplementation "junit:junit:$jUnitVersion"
  // Optional -- Robolectric environment
  testImplementation "androidx.test:core:$androidXTestVersion"
  // Optional -- Mockito framework
  testImplementation "org.mockito:mockito-core:$mockitoVersion"
  // Optional -- mockito-kotlin
  testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
  // Optional -- Mockk framework
  testImplementation "io.mockk:mockk:$mockkVersion"
}

একটি স্থানীয় ইউনিট পরীক্ষার ক্লাস তৈরি করুন

আপনি একটি JUnit 4 পরীক্ষা ক্লাস হিসাবে আপনার স্থানীয় ইউনিট পরীক্ষার ক্লাস লিখুন।

এটি করার জন্য, একটি ক্লাস তৈরি করুন যাতে এক বা একাধিক পরীক্ষার পদ্ধতি রয়েছে, সাধারণত module-name/src/test/ তে। একটি পরীক্ষা পদ্ধতি @Test টীকা দিয়ে শুরু হয় এবং আপনি যে উপাদানটি পরীক্ষা করতে চান তার একটি একক দিক অনুশীলন এবং যাচাই করার জন্য কোড রয়েছে।

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি স্থানীয় ইউনিট পরীক্ষা ক্লাস বাস্তবায়ন করতে হয়। পরীক্ষার পদ্ধতি emailValidator_correctEmailSimple_returnsTrue() isValidEmail() যাচাই করার চেষ্টা করে, যা অ্যাপের মধ্যে একটি পদ্ধতি। যদি isValidEmail() ও true রিটার্ন করে তাহলে টেস্ট ফাংশনটি সত্য হবে।

কোটলিন


import org.junit.Assert.assertFalse
import org.junit.Assert.assertTrue
import org.junit.Test

class EmailValidatorTest {
  @Test fun emailValidator_CorrectEmailSimple_ReturnsTrue() {
    assertTrue(EmailValidator.isValidEmail("name@email.com"))
  }

}

জাভা


import org.junit.Test;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

class EmailValidatorTest {
  @Test
  public void emailValidator_CorrectEmailSimple_ReturnsTrue() {
    assertTrue(EmailValidator.isValidEmail("name@email.com"));
  }
}

আপনার পঠনযোগ্য পরীক্ষাগুলি তৈরি করা উচিত যা মূল্যায়ন করে যে আপনার অ্যাপের উপাদানগুলি প্রত্যাশিত ফলাফল দেয় কিনা। আমরা আপনাকে জুনিট , হ্যামক্রেস্ট , বা সত্যের মতো একটি দাবী গ্রন্থাগার ব্যবহার করার পরামর্শ দিই। উপরের স্নিপেটটি junit.Assert ব্যবহার করার একটি উদাহরণ।

উপহাসযোগ্য অ্যান্ড্রয়েড লাইব্রেরি

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

এটি Context এর মতো অ্যান্ড্রয়েড ফ্রেমওয়ার্কের রেফারেন্স করার সময় স্থানীয় পরীক্ষাগুলি তৈরি করার অনুমতি দেয়। আরও গুরুত্বপূর্ণ, এটি আপনাকে অ্যান্ড্রয়েড ক্লাসের সাথে একটি উপহাস কাঠামো ব্যবহার করতে দেয়।

অ্যান্ড্রয়েড নির্ভরতা নিয়ে উপহাস করা

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

উপহাসযোগ্য অ্যান্ড্রয়েড লাইব্রেরি এবং মকিটো বা মককে- এর মতো মকিং ফ্রেমওয়ার্কের সাহায্যে আপনি আপনার ইউনিট পরীক্ষায় অ্যান্ড্রয়েড ক্লাসের উপহাসের আচরণ প্রোগ্রাম করতে পারেন।

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

  1. আপনার build.gradle ফাইলে Mockito লাইব্রেরি নির্ভরতা অন্তর্ভুক্ত করুন, যেমনটি আপনার টেস্টিং এনভায়রনমেন্ট সেট আপ করুন
  2. আপনার ইউনিট পরীক্ষার ক্লাস সংজ্ঞার শুরুতে, @RunWith(MockitoJUnitRunner.class) টীকা যোগ করুন। এই টীকাটি মকিটো টেস্ট রানারকে যাচাই করতে বলে যে আপনার ফ্রেমওয়ার্কের ব্যবহার সঠিক এবং আপনার মক অবজেক্টের প্রারম্ভিকতাকে সহজ করে।
  3. Android নির্ভরতার জন্য একটি মক অবজেক্ট তৈরি করতে, ক্ষেত্র ঘোষণার আগে @Mock টীকা যোগ করুন।
  4. নির্ভরতার আচরণ বন্ধ করার জন্য, আপনি when() এবং thenReturn() পদ্ধতি ব্যবহার করে শর্ত পূরণ হলে একটি শর্ত এবং রিটার্ন মান নির্দিষ্ট করতে পারেন।

নিম্নলিখিত উদাহরণটি দেখায় যে আপনি কীভাবে একটি ইউনিট পরীক্ষা তৈরি করতে পারেন যা Kotlin-এ Mockito-Kotlin দিয়ে তৈরি একটি মক Context অবজেক্ট ব্যবহার করে।

import android.content.Context
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.junit.MockitoJUnitRunner
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock

private const val FAKE_STRING = "HELLO WORLD"

@RunWith(MockitoJUnitRunner::class)
class MockedContextTest {

  @Mock
  private lateinit var mockContext: Context

  @Test
  fun readStringFromContext_LocalizedString() {
    // Given a mocked Context injected into the object under test...
    val mockContext = mock<Context> {
        on { getString(R.string.name_label) } doReturn FAKE_STRING
    }

    val myObjectUnderTest = ClassUnderTest(mockContext)

    // ...when the string is returned from the object under test...
    val result: String = myObjectUnderTest.getName()

    // ...then the result should be the expected one.
    assertEquals(result, FAKE_STRING)
  }
}

Mockito ফ্রেমওয়ার্ক ব্যবহার সম্পর্কে আরও জানতে, নমুনা কোডে Mockito API রেফারেন্স এবং SharedPreferencesHelperTest ক্লাস দেখুন। এছাড়াও অ্যান্ড্রয়েড টেস্টিং কোডল্যাব ব্যবহার করে দেখুন।

ত্রুটি: "পদ্ধতি ... উপহাস করা হয়নি"

উপহাসযোগ্য অ্যান্ড্রয়েড লাইব্রেরি একটি ব্যতিক্রম ছুঁড়ে দেয় যদি আপনি Error: "Method ... not mocked

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

android {
  ...
  testOptions {
    unitTests.returnDefaultValues = true
  }