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




unit-testing android-studio (4)

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

एक यूनिट परीक्षण में, मैं अपने डेस्कटॉप (डेस्कटॉप) फ़ाइल सिस्टम पर एक 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


स्थानीय इकाई परीक्षणों (बनाम इंस्ट्रूमेंटेशन टेस्ट) के लिए, आप फ़ाइलों को 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-studio