लोकल यूनिट टेस्ट तैयार करें

लोकल टेस्ट, Android के बजाय सीधे आपके वर्कस्टेशन पर चलता है डिवाइस या एम्युलेटर का इस्तेमाल करें. यह आपकी लोकल Java वर्चुअल मशीन (JVM) का इस्तेमाल करता है, का इस्तेमाल करने का सुझाव दिया जाता है. लोकल टेस्ट की मदद से, के तर्क को ज़्यादा तेज़ी से इकट्ठा किया जा सकता है. हालांकि, Android फ़्रेमवर्क की मदद से, यह तय किया जा सकता है कि किस तरह के टेस्ट किए जा सकते हैं.

इकाई टेस्ट, कोड के उस छोटे सेक्शन के व्यवहार की पुष्टि करता है जिसे इकाई टेस्ट. ऐसा करने के लिए यह कोड उस कोड को एक्ज़ीक्यूट करता है और नतीजे की जांच करता है.

आम तौर पर यूनिट की जांच करना आसान होता है. हालांकि, इकाई टेस्ट के तहत को टेस्ट करने की क्षमता को ध्यान में रखकर नहीं बनाया गया है:

  • आपको जिस कोड की पुष्टि करनी है, यह ज़रूरी है कि टेस्ट में वह कोड ऐक्सेस किया जा सके. इसके लिए उदाहरण के लिए, निजी तरीके को सीधे टेस्ट नहीं किया जा सकता. इसके बजाय, क्लास की जांच करें सार्वजनिक एपीआई का इस्तेमाल कर रहा है.
  • आइसोलेशन में यूनिट टेस्ट चलाने के लिए, यूनिट की डिपेंडेंसी अंडर टेस्ट को उन कॉम्पोनेंट से बदलना चाहिए जिन्हें कंट्रोल किया जा रहा हो. जैसे, नकली या अन्य टेस्ट डबल. यह खास तौर पर तब मुश्किल होता है, जब आपका कोड Android फ़्रेमवर्क पर आधारित है.

Android में सामान्य इकाई परीक्षण रणनीतियों के बारे में जानने के लिए, पढ़ें कि क्या टेस्ट.

लोकल टेस्ट लोकेशन

डिफ़ॉल्ट रूप से, लोकल यूनिट टेस्ट के लिए सोर्स फ़ाइलें module-name/src/test/. नई डायरेक्ट्री बनाने पर, यह डायरेक्ट्री पहले से मौजूद है प्रोजेक्ट बनाने के लिए किया जा सकता है.

टेस्टिंग डिपेंडेंसी जोड़ना

आपको अपने प्रोजेक्ट के लिए टेस्टिंग डिपेंडेंसी भी कॉन्फ़िगर करनी होगी, ताकि JUnit टेस्टिंग फ़्रेमवर्क से मिले स्टैंडर्ड एपीआई.

ऐसा करने के लिए, अपने ऐप्लिकेशन के मॉड्यूल की 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() भी 'सही' दिखाता है, तो यह सही है.

Kotlin

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"))
  }

}

Java

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, Hamcrest के तौर पर या सच. ऊपर दिया गया स्निपेट एक उदाहरण के तौर पर, junit.Assert.

नकली Android लाइब्रेरी

जब लोकल यूनिट टेस्ट किए जाते हैं, तो Android Gradle प्लग-इन में लाइब्रेरी जिसमें Android फ़्रेमवर्क के सभी API शामिल हैं, वह वर्शन का इस्तेमाल किया जा सकता है. लाइब्रेरी में सभी सार्वजनिक तरीक़ों और की क्लास में शामिल हो सकते हैं, लेकिन इन तरीकों में मौजूद कोड हटा दिया गया है. अगर कोई है जिन तरीकों को ऐक्सेस किया जाता है उनमें से कुछ टेस्ट में अपवाद की जानकारी मिलती है.

इससे Android में क्लास का रेफ़रंस देते समय, लोकल टेस्ट बनाए जा सकते हैं फ़्रेमवर्क जैसे Context. इससे भी अहम बात यह है कि इससे आपको अपनी साइट पर फ़्रेमवर्क भी शामिल है.

Android डिपेंडेंसी की मॉकिंग करना

एक सामान्य समस्या यह है कि यह पता लगाया जाता है कि क्लास, स्ट्रिंग रिसॉर्स का इस्तेमाल कर रही है या नहीं. आप Context में getString() तरीके को कॉल करके स्ट्रिंग रिसॉर्स पाएं क्लास. हालांकि, लोकल टेस्ट, Context या इसके किसी भी तरीके का इस्तेमाल नहीं कर सकता, क्योंकि Android फ़्रेमवर्क से जुड़े होते हैं. आम तौर पर, getString() को किया गया कॉल क्लास से बाहर हो जाएं, लेकिन यह हमेशा संभव नहीं होता. इसका समाधान है कि Context का एक मॉक या स्टब बनाता है, जो getString() तरीका शुरू किया गया.

Mockable Android लाइब्रेरी और मॉकिंग फ़्रेमवर्क Mockito या MockK के तौर पर अपने ऐप्लिकेशन का इस्तेमाल किया जा सकता है. आपके यूनिट टेस्ट में, Android क्लास के मॉक का व्यवहार.

Mockito का इस्तेमाल करके, अपने लोकल यूनिट टेस्ट में मॉक ऑब्जेक्ट जोड़ने के लिए, यह तरीका अपनाएं प्रोग्रामिंग मॉडल:

  1. अपनी build.gradle फ़ाइल में Mockito लाइब्रेरी डिपेंडेंसी को इस तरह शामिल करें इसके बारे में, टेस्टिंग एनवायरमेंट सेट अप करना में बताया गया है.
  2. यूनिट टेस्ट क्लास की परिभाषा की शुरुआत में, इस फ़ील्ड में जोड़ें @RunWith(MockitoJUnitRunner.class) एनोटेशन. इस एनोटेशन से मॉकिटो टेस्ट रनर, ताकि यह पुष्टि की जा सके कि आपने फ़्रेमवर्क का सही इस्तेमाल किया है और आपके मॉक ऑब्जेक्ट को शुरू करने की प्रोसेस को आसान बनाता है.
  3. Android डिपेंडेंसी के लिए मॉक ऑब्जेक्ट बनाने के लिए, @Mock एनोटेशन जोड़ें फ़ील्ड एलान से पहले.
  4. डिपेंडेंसी के व्यवहार को रोकने के लिए, कोई शर्त तय की जा सकती है और when() और thenReturn() का इस्तेमाल करके, शर्त पूरी होने पर रिटर्न वैल्यू तरीकों का इस्तेमाल करना होगा.

नीचे दिया गया उदाहरण दिखाता है कि किसी मॉक टेस्ट का इस्तेमाल करके, यूनिट टेस्ट कैसे बनाया जा सकता है Kotlin में Context ऑब्जेक्ट को Mockito-Kotlin की मदद से बनाया गया.

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 श्रेणी सैंपल कोड. साथ ही, Android टेस्टिंग कोडलैब (कोड बनाना सीखना) भी आज़माएं.

गड़बड़ी: "तरीका ... मॉक नहीं है"

Mockable Android लाइब्रेरी को इसे अपवाद माना जाता है. इसकी एक वजह यह है कि Error: "Method ... not mocked मैसेज वाले तरीके.

अगर दिए गए अपवादों की वजह से, जांच में समस्या आ रही है, तो व्यवहार से जुड़ी हो, ताकि इसके बजाय रिटर्न टाइप. ऐसा करने के लिए, अपने प्रोजेक्ट के ग्रूवी में टॉप लेवल build.gradle फ़ाइल:

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