android एंड्रॉइड स्टूडियो यूनिट परीक्षण: डेटा(इनपुट) फ़ाइल पढ़ें




unit-testing android-studio (6)

अगर आप Run -> एडिटिंग कंफिगरेशन -> JUnit पर जाते हैं और फिर अपने यूनिट टेस्ट के लिए रन कॉन्फ़िगरेशन का चयन करते हैं, तो एक 'वर्किंग डायरेक्टरी' सेटिंग होती है। यह इंगित करना चाहिए कि आपकी json फ़ाइल जहाँ भी है। ध्यान रखें कि इससे अन्य परीक्षण टूट सकते हैं।

https://code.i-harness.com

एक यूनिट परीक्षण में, मैं अपने डेस्कटॉप (डेस्कटॉप) फ़ाइल सिस्टम पर एक json फ़ाइल से पथ को हार्डकोड किए बिना कैसे पढ़ सकता हूं?

मैं स्थैतिक स्ट्रिंग्स बनाने के बजाय एक फ़ाइल से परीक्षण इनपुट (मेरे पार्सिंग विधियों के लिए) पढ़ना चाहूंगा।

फ़ाइल मेरी इकाई परीक्षण कोड के समान स्थान पर है, लेकिन यदि आवश्यक हो तो मैं इसे परियोजना में कहीं और भी रख सकता हूं। मैं एंड्रॉइड स्टूडियो का उपयोग कर रहा हूं।


मुझे एंड्रॉइड स्टूडियो में परीक्षण संसाधनों के साथ बहुत सारी समस्याएं हैं इसलिए मैंने स्पष्टता के लिए कुछ परीक्षण स्थापित किए। अपने mobile (Android Application) प्रोजेक्ट में मैंने निम्नलिखित फाइलें जोड़ीं:

mobile/src/test/java/test/ResourceTest.java
mobile/src/test/resources/test.txt
mobile/src/test/resources/test/samePackage.txt

परीक्षण वर्ग (सभी परीक्षण पास):

assertTrue(getClass().getResource("test.txt") == null);
assertTrue(getClass().getResource("/test.txt").getPath().endsWith("test.txt"));
assertTrue(getClass().getResource("samePackage.txt").getPath().endsWith("test/samePackage.txt"));
assertTrue(getClass().getResource("/test/samePackage.txt").getPath().endsWith("test/samePackage.txt"));
assertTrue(getClass().getClassLoader().getResource("test.txt").getPath().endsWith("test.txt"));
assertTrue(getClass().getClassLoader().getResource("test/samePackage.txt").getPath().endsWith("test/samePackage.txt"));

उसी रूट प्रोजेक्ट में मेरे पास जावा (एंड्रॉइड नहीं) प्रोजेक्ट है जिसे data कहा जाता data । यदि मैं डेटा प्रोजेक्ट में समान फ़ाइलें जोड़ता हूं:

data/src/test/java/test/ResourceTest.java
data/src/test/resources/test.txt
data/src/test/resources/test/samePackage.txt

फिर उपरोक्त सभी परीक्षण विफल हो जाएंगे यदि मैं उन्हें एंड्रॉइड स्टूडियो से निष्पादित करता हूं, लेकिन वे कमांड लाइन पर / ./gradlew data:test साथ ./gradlew data:test । इसके आसपास जाने के लिए मैं इस हैक का उपयोग करता हूं (ग्रूवी में)

def resource(String path) {
    getClass().getResource(path) ?:
            // Hack to load test resources when executing tests from Android Studio
            new File(getClass().getClassLoader().getResource('.').path
                    .replace('/build/classes/test/', "/build/resources/test$path"))
}

उपयोग: resource('/test.txt')

एंड्रॉइड स्टूडियो 2.3, ग्रैडल 3.3


मेरे मामले में, समाधान को फ़ाइल में जोड़ना था

sourceSets {
    test.resources.srcDirs += 'src/unitTests/resources'
  } 

इसके बाद एएस 2.3.1 द्वारा सब कुछ पाया गया

javaClass.classLoader.getResourceAsStream("countries.txt")

स्थानीय इकाई परीक्षणों (बनाम इंस्ट्रूमेंटेशन टेस्ट) के लिए, आप फ़ाइलों को src/test/resources Resources के अंतर्गत रख सकते हैं और उन्हें classLoader का उपयोग करके पढ़ सकते हैं। उदाहरण के लिए, निम्न कोड संसाधन निर्देशिका में myFile.txt फ़ाइल खोलता है।

InputStream in = this.getClass().getClassLoader().getResourceAsStream("myFile.txt");

इसके साथ काम किया

  • एंड्रॉइड स्टूडियो 1.5.1
  • ढाल प्लगइन 1.3.1

हालाँकि मुझे अपने निष्कर्ष यहाँ जोड़ने चाहिए। मुझे पता है कि यह थोड़ा पुराना है, लेकिन ग्रैडल के नए संस्करणों के लिए, जहां NO src / test / resource directory है, लेकिन पूरे प्रोजेक्ट के लिए केवल एक ही संसाधन निर्देशिका है, आपको इस लाइन को अपनी Gradle फ़ाइल में जोड़ना होगा।

android {
   testOptions {
      unitTests {
         includeAndroidResources = true
      }
    }
}

ऐसा करने से आप अपने संसाधन तक पहुँच सकते हैं:

 this.getClass().getClassLoader().getResourceAsStream(fileName);

मैं इसके लिए खोज कर रहा हूं और मुझे इसका जवाब नहीं मिला, इसलिए मैंने यहां दूसरों की मदद करने का फैसला किया।


android-gradle-plugin संस्करण पर निर्भर करता है:

1. संस्करण 1.5 और उच्चतर:

सिर्फ src/test/resources/test.json लिए json फाइल src/test/resources/test.json और इसे संदर्भ दें

classLoader.getResource("test.json"). 

किसी भी प्रकार के संशोधन की आवश्यकता नहीं है।

2. संस्करण 1.5 से नीचे : (या यदि किसी कारण से ऊपर समाधान काम नहीं करता है)

  1. सुनिश्चित करें कि आप कम से कम tools.android.com/tech-docs/unit-testing-support का उपयोग कर रहे हैं। Android Studio को सही तरीके से सेट करने के लिए लिंक का अनुसरण करें।

  2. test निर्देशिका बनाएं। java डाइरेक्टरी में यूनिट टेस्ट क्लासेस java और अपनी रिसोर्स फाइल को res डायरेक्टरी में रखें। एंड्रॉइड स्टूडियो को उनका अनुसरण करना चाहिए:

  3. क्लास gradle लिए संसाधनों को कॉपी करने के लिए उन्हें क्लास classloader लिए दृश्यमान बनाने के लिए gradle कार्य बनाएं:

    android{
       ...
    }
    
    task copyResDirectoryToClasses(type: Copy){
        from "${projectDir}/src/test/res"
        into "${buildDir}/intermediates/classes/test/debug/res"
    }
    
    assembleDebug.dependsOn(copyResDirectoryToClasses)
  4. अब आप फ़ाइल संसाधन के लिए File संदर्भ प्राप्त करने के लिए इस पद्धति का उपयोग कर सकते हैं:

    private static File getFileFromPath(Object obj, String fileName) {
        ClassLoader classLoader = obj.getClass().getClassLoader();
        URL resource = classLoader.getResource(fileName);
        return new File(resource.getPath());
    }
    
    @Test
    public void fileObjectShouldNotBeNull() throws Exception {
        File file = getFileFromPath(this, "res/test.json");
        assertThat(file, notNullValue());
    }
  5. Ctrl + Shift + F10 द्वारा पूरे क्लास या स्पेसिफिक टेस्ट विधि से यूनिट टेस्ट चलाएं।




android-studio