অ্যান্ড্রয়েড স্টুডিও ইউনিট পরীক্ষা: পড়ুন ডেটা (ইনপুট) ফাইল


99

ইউনিট পরীক্ষায়, আমি কীভাবে আমার (ডেস্কটপ) ফাইল সিস্টেমে কোনও জাসন ফাইল থেকে ডেটা পড়তে পারি, পাথটি হার্ডকোডিং ছাড়াই?

আমি স্ট্যাটিক স্ট্রিং তৈরির পরিবর্তে কোনও ফাইল থেকে পরীক্ষার ইনপুট (আমার পার্সিং পদ্ধতির জন্য) পড়তে চাই।

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


4
আমি আইউইটিস.ল্ট স্ট্রিং (this.getClass ()। GetResourceAsStream ("test_documents.json"), "UTF-8") এর সাথে প্রায় প্রতিটি সংমিশ্রণ চেষ্টা করেছি, এটি সর্বদা শূন্য হয়। সম্ভবত কারণ ফাইলগুলি জারে অন্তর্ভুক্ত হবে না।
ফ্রাঙ্ক

আমরা কি অ্যান্ড্রয়েড এমুলেটর / ডিভাইস জড়িত ইউনিট পরীক্ষার কথা বলছি?
অ্যান্ড্রয়েডেক্স

@ Android777 আমি মনে করি আমরা নতুন ইউনিট পরীক্ষা সমর্থন অ্যানড্রইড স্টুডিও এর সাম্প্রতিক সংস্করণ চালু বিষয়ে কথা বলছি tools.android.com/tech-docs/unit-testing-support
akhy

@ ফ্র্যাঙ্ক আপনি কোথায় রাখবেন test_documents.json? সম্পদ ডিরেক্টরি?
আখি

হ্যাঁ, আমরা নতুন ইউনিট পরীক্ষা সহায়তা সম্পর্কে কথা বলছি, এমুলেটর / ডিভাইসকে জড়িত না। আমি এটিকে সম্পদগুলিতে রাখিনি, কারণ তখন এটি লাইভ এপিপির সাথে প্যাকেজ হয়ে যায়। আমি এটিকে পরীক্ষার (জাভা) ফাইলগুলির মতো একই ফোল্ডারে রেখেছি।
ফ্র্যাঙ্ক

উত্তর:


152

android-gradle-pluginসংস্করণ উপর নির্ভর করে :

1. সংস্করণ 1.5 এবং উচ্চতর:

জাস্টসন ফাইলটিকে কেবল এতে রাখুন src/test/resources/test.jsonএবং এটি উল্লেখ করুন

classLoader.getResource("test.json"). 

কোন গ্রেড পরিবর্তন প্রয়োজন।

২.৫ এর নীচে সংস্করণ : (বা যদি কোনও কারণে উপরের সমাধানটি কাজ করে না)

  1. আপনি কমপক্ষে অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণ 1.1 ব্যবহার করছেন তা নিশ্চিত করুন । অ্যান্ড্রয়েড স্টুডিও সঠিকভাবে সেট আপ করতে লিঙ্কটি অনুসরণ করুন।

  2. testডিরেক্টরি তৈরি করুন । javaডিরেক্টরিতে ইউনিট পরীক্ষার ক্লাস রাখুন এবং আপনার সংস্থান ফাইলটি resডিরেক্টরিতে রাখুন। অ্যান্ড্রয়েড স্টুডিওগুলি তাদের অনুসরণের মতো চিহ্নিত করতে হবে:

    এখানে চিত্র বর্ণনা লিখুন

  3. gradleক্লাস ডিরেক্টরিতে এটির জন্য দৃশ্যমান করার জন্য সংস্থানগুলি অনুলিপি করার জন্য টাস্ক তৈরি করুন classloader:

    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পুরো ক্লাসের বা specyfic পরীক্ষা পদ্ধতির উপর।

4
অসাধারণ! আপনার সম্পাদনা, বাদ্যযন্ত্র ছাড়াই, কবজির মতো কাজ করে, ধন্যবাদ!
ফ্রাঙ্ক

4
এটি একটি দুর্দান্ত সমাধান, তবে এটি সর্বদা কার্যকর হয় না। আপনি যদি পরিচ্ছন্ন কাজটি সঞ্চালন করেন, এবং তারপরে টেস্টডিবগটি ব্যর্থ হয়। মূলত বিকাশকারীকে জানতে হবে যে তাকে টেস্টডিবগের আগে এসেম্বলডিবগ টাস্কটি চালাতে হবে। আপনারা কি এটির উন্নতি করার জন্য কোনও পরামর্শ দিয়েছেন?
jooprudencio

19
অ্যান্ড্রয়েড প্লাগইন 1.5.0 সহ অ্যান্ড্রয়েডস্টুডিও 1.5 এর সাথে আপনার জাসন ফাইলটি এখানে রাখুন src/test/resources/test.jsonএবং এটি হিসাবে উল্লেখ করুন classLoader.getResource("test.json")। কোন গ্রেড পরিবর্তন প্রয়োজন। ভিতরে নেস্টেড ফোল্ডারগুলিও resourcesকাজ করছে।
সেরগেই পেচেনিজকাই

6
অসম্পূর্ণ উত্তর। কী classLoader? এই লাইন কোডটি কোথায় রাখব? রিটার্নের ফলাফল নিয়ে আপনি কী করতে পারেন? আরও সম্পূর্ণ কোড সরবরাহ করুন। -1
ভোগদেভ

4
./src/test/resources/file.txtকোটলিনে পড়তে :TestClassName::class.java.getResource("/file.txt")!!.readText()
এরিক

79

স্থানীয় ইউনিট পরীক্ষার জন্য (বনাম ইনস্ট্রুমেন্টেশন পরীক্ষা), আপনি src/test/resourcesক্লাসলুডার ব্যবহার করে ফাইলগুলি এর অধীনে রাখতে পারেন এবং সেগুলি পড়তে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত কোডগুলি myFile.txtরিসোর্স ডিরেক্টরিতে ফাইল খুলবে ।

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

এটি সঙ্গে কাজ করে

  • অ্যান্ড্রয়েড স্টুডিও 1.5.1
  • গ্রেড প্লাগইন 1.3.1

এটি আমার জন্য কাজ করছে না দয়া করে আমার প্রশ্নটি এখানে দেখুন stackoverflow.com/questions/36295824/…
টাইলার ফাফফ

5
এটি আমার পক্ষে কাজ করেছিল, যখন আমি "src / test / res" থেকে "এসসিআর / পরীক্ষা / সংস্থানসমূহ" এ পরিবর্তিত হয়েছি। অ্যান্ড্রয়েড স্টুডিও 2.0 আরসি 3 ব্যবহার করে, গ্রেড: 2.0.0-আরসি 3
অ্যালেক্স ব্রাভো

প্রত্যাশার মতো কাজ করেছেন। "ফাইলটি" এসসিআর / টেস্ট / রিসোর্স / "উদাহরণস্বরূপ:" নিয়ম.এক্সএমএল "এর আওতায় না পাওয়া গেলেও পরীক্ষার পাস হচ্ছে but
আনন্দ কৃষিশ

4
কোটলিন:val myFile = ClassLoader.getSystemResource("myFile.txt").readText()
জেজে।

মোহন মত কাজ!
অমিত ভান্ডারী

15

আমার ক্ষেত্রে, সমাধানটি গ্রেড ফাইলটিতে যুক্ত করা ছিল

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

এর পরে সবকিছু এএস ২.৩.১ দ্বারা পাওয়া গেছে

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

4
আমি খুব অনুরূপ কিছু করেছি (কোটলিন): ১. ফোল্ডার এবং ফাইল তৈরি করুন: root/app/src/test/resources/test.json ২ এই জাতীয় ডেটা পড়ুন:val jsonFile = ClassLoader.getSystemResource("test.json").readText()
জেজে।

8

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

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/src/test/java/test/ResourceTest.java
data/src/test/resources/test.txt
data/src/test/resources/test/samePackage.txt

তারপর উপরে সমস্ত পরীক্ষার যদি আমি তাদের অ্যান্ড্রয়েড স্টুডিও থেকে চালানো ব্যর্থ হবে, কিন্তু তারা সঙ্গে কমান্ড লাইন পাস ./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


দুর্দান্ত উত্তর (অনুসন্ধানের 45 মিনিটের পরে)। এটি বেশ কয়েকটি সমস্যার কেন্দ্রবিন্দুতে পৌঁছে যায় এবং পরীক্ষাগুলি নিজেই ব্যবহার করে ফলাফলগুলি প্রতিলিপি করা সহজ করে তোলে। ফিভিউউ, ২.৩.১ এ, গ্রেডল ২.৩.১ এ, getClassLoader()সংস্করণগুলি প্রত্যাশা অনুযায়ী কাজ করে অর্থাত তারা উভয়ই অ্যান্ড্রয়েড স্টুডিও থেকে এবং আমার ম্যাকোস মেশিনের কমান্ড লাইন থেকে এবং লিনাক্স সিআই সার্ভারে (সার্কেলসিআই) চালিত। সুতরাং আমি সেই সাথে যাচ্ছি এবং গ্রেডল ৩.৩ আশা করছি এটি পরে ভাঙবে না ...
মিম ২০০১

চমৎকার! আমি এখানে একই রিসোর্স লোডিংয়ের সমস্যাটি দেখছি। এএস 2.3.2, গ্রেডেল 3.3। build/resources/testইন্টারেক্টিভ ক্লাসপথে অন্তর্ভুক্ত না হওয়ার কারণে পরীক্ষাগুলি কমান্ড লাইন থেকে কাজ করে তবে এএস এর মাধ্যমে নয়।
মার্ক

7

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

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

এটি করে আপনি আপনার সংস্থানটি এতে প্রবেশ করতে পারবেন:

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

আমি এটি অনুসন্ধান করছি এবং কোনও উত্তর খুঁজে পাইনি, তাই আমি এখানে অন্যদের সাহায্য করার সিদ্ধান্ত নিয়েছি।


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

6

আপনি যদি চালাতে যান -> কনফিগারেশন সম্পাদনা করুন -> জুনিত এবং তারপরে আপনার ইউনিট পরীক্ষার জন্য রান কনফিগারেশনটি নির্বাচন করেন, সেখানে একটি 'ওয়ার্কিং ডিরেক্টরি' সেটিংস রয়েছে। এটি আপনার জাসন ফাইল যেখানেই থাকুক সেদিকে নির্দেশ করা উচিত। মনে রাখবেন এটি অন্যান্য পরীক্ষা ভঙ্গ করতে পারে।


এবং এই ব্যবহারের চেয়ে ব্যবহার করুন.ক্ল্যাট ()। getResourceAsStream (test.json)? আমি সেখানে ফাইলগুলি যুক্ত করেছি, প্রকল্পের মূলটিতে এটি এখনও ফাইলগুলি খুঁজে পায় না।
ফ্রাঙ্ক

এটি ফাইল ব্যবহার করে new File()বা অনুরূপ ব্যবহার করে লোড করতে ব্যবহৃত হতে পারে তবে উপরে বর্ণিত ক্লাসপাথ লোডিং পদ্ধতির সাথে এটি সরাসরি কাজ করে না। এটিও কিছুটা জটিল কারণ প্রতিটি নতুন রান কনফিগারেশনের জন্য ওয়ার্কিং ডির নির্ধারণ করা প্রয়োজন, এবং ডিফল্টরূপে এএস এবং গ্রেডল কমান্ড লাইনটি বিভিন্ন ওয়ার্কিং ডায়ার ব্যবহার করতে পছন্দ করে ... যেমন একটি ব্যথা
মার্ক ম্যাককেইনা

2

প্রকৃতপক্ষে, এটাই আমার জন্য ইনস্ট্রুমেন্টেশন টেস্টগুলির সাথে কাজ করেছে (অ্যান্ড্রয়েড স্টুডিও সংস্করণ 3.5.3.3 , অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণ 3.5.3.3 , গ্রেডল সংস্করণ 6.0.1 ):

  1. আপনার ফাইলগুলি রাখুন src/androidTest/assets ফোল্ডারে
  2. আপনার পরীক্ষার ফাইলে:

InputStream is = InstrumentationRegistry.getInstrumentation().getContext().getAssets().open("filename.txt");

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.