টেস্ট টেমপ্লেট

AOSP-তে টেস্ট মডিউলের জন্য টেস্ট টেমপ্লেট অন্তর্ভুক্ত থাকে যা VTS রানারের BaseTest-এর হোস্ট-সাইড পাইথন সাবক্লাস নয়।

ছবি ১. টেস্ট টেমপ্লেট আর্কিটেকচার।

এই ধরনের পরীক্ষা ইন্টিগ্রেট করার জন্য প্রয়োজনীয় পরিশ্রম কমাতে ডেভেলপাররা এইসব টেমপ্লেট ব্যবহার করতে পারেন। এই বিভাগে টেস্ট টেমপ্লেট (VTS testcases/template ডিরেক্টরিতে অবস্থিত) কনফিগার করা ও ব্যবহার করার বিষয়ে আলোচনা করা হয়েছে এবং সাধারণত ব্যবহৃত টেমপ্লেটের উদাহরণ দেওয়া হয়েছে।

BinaryTest টেমপ্লেট

VTS-এ টার্গেট ডিভাইসে এক্সিকিউট করা টেস্ট ইন্টিগ্রেট করতে, BinaryTest টেমপ্লেট ব্যবহার করুন। টার্গেট-সাইড পরীক্ষায় এগুলি অন্তর্ভুক্ত:

  • C++ ভিত্তিক টেস্ট কম্পাইল করে ডিভাইসে পুশ করা হয়েছে
  • টার্গেট-সাইড Python টেস্ট বাইনারি হিসেবে কম্পাইল করা হয়েছে
  • ডিভাইসে এক্সিকিউট করা যায় এমন শেল স্ক্রিপ্ট

এইসব টেস্ট BinaryTest টেমপ্লেট সহ বা ছাড়া VTS-এ ইন্টিগ্রেট করা যেতে পারে।

BinaryTest টেমপ্লেটের সাথে টার্গেট-সাইড টেস্ট ইন্টিগ্রেট করা

BinaryTest টেমপ্লেটটি ডেভেলপারদের সহজেই টার্গেট-সাইড টেস্ট ইন্টিগ্রেট করতে সাহায্য করার জন্য ডিজাইন করা হয়েছে। বেশিরভাগ ক্ষেত্রে, আপনি AndroidTest.xml-এ কনফিগারেশনের কয়েকটি সাধারণ লাইন যোগ করতে পারবেন। VtsDeviceTreeEarlyMountTest থেকে কনফিগারেশনের উদাহরণ:

<configuration description="Config for VTS VtsDeviceTreeEarlyMountTest.">
  ...
<test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
<option name="test-module-name" value="VtsDeviceTreeEarlyMountTest"/>
<option name="binary-test-source" value="_32bit::DATA/nativetest/dt_early_mount_test/dt_early_mount_test" />
<option name="binary-test-source" value="_64bit::DATA/nativetest64/dt_early_mount_test/dt_early_mount_test" />
<option name="test-timeout" value="5m"/>
</test>
</configuration>

এই কনফিগারেশনে:

  • binary-test-source ও binary-test-type হল টেমপ্লেট-নির্দিষ্ট।
  • টেস্ট বাইনারি সোর্সের রিলেটিভ হোস্ট পাথ নির্দিষ্ট করলে, টেমপ্লেটটি প্রস্তুতি, ফাইল পুশ করা, টেস্ট এক্সিকিউশন, ফলাফল পার্স করা এবং ক্লিনআপের মতো কাজগুলি পরিচালনা করতে পারে।
  • টেমপ্লেটে সাবক্লাসের জন্য টেস্ট কেস তৈরি করা সম্পর্কিত পদ্ধতি রয়েছে যা ওভাররাইড করা যায়।
  • টেমপ্লেটটি ধরে নেয় যে প্রতিটি টেস্ট বাইনারি মডিউলে একটি করে টেস্ট কেস আছে এবং ডিফল্ট হিসেবে বাইনারি সোর্স ফাইলের নাম টেস্ট কেসের নাম হিসেবে ব্যবহার করা হয়।

কনফিগারেশন সংক্রান্ত বিকল্প

BinaryTest টেমপ্লেটে নিম্নলিখিত কনফিগারেশন বিকল্প কাজ করে:

বিকল্পের নাম ভ্যালুর ধরন বর্ণনা
binary-test-source স্ট্রিং হোস্টের vts টেস্ট-কেস ডিরেক্টরির সাথে সম্পর্কিত বাইনারি টেস্ট সোর্স পাথ।
উদাহরণ: DATA/nativetest/test
binary-test-working-directory স্ট্রিং ওয়ার্কিং ডিরেক্টরি (ডিভাইস-সাইড পাথ)।
উদাহরণ: /data/local/tmp/testing/
binary-test-envp স্ট্রিং বাইনারির জন্য এনভায়রনমেন্ট ভেরিয়েবল।
উদাহরণ: PATH=/new:$PATH
binary-test-args স্ট্রিং আর্গুমেন্ট বা ফ্ল্যাগ পরীক্ষা করুন।
উদাহরণ: --gtest_filter=test1
binary-test-ld-library-path স্ট্রিং LD_LIBRARY_PATH এনভায়রনমেন্ট ভেরিয়েবল।
উদাহরণ: /data/local/tmp/lib
binary-test-disable-framework বুলিয়ান টেস্ট করার আগে Android ফ্রেমওয়ার্ক বন্ধ করতে adb stop রান করুন। যেমন: true
binary-test-stop-native-servers বুলিয়ান পরীক্ষা চলাকালীন সঠিকভাবে কনফিগার করা সব নেটিভ সার্ভার বন্ধ করুন। যেমন: true
binary-test-type স্ট্রিং টেমপ্লেটের ধরন। অন্যান্য টেমপ্লেট এই টেমপ্লেট থেকে এক্সটেন্ড করা হয়, কিন্তু আপনাকে এই টেমপ্লেটের জন্য এই বিকল্প নির্দিষ্ট করতে হবে না, কারণ আপনি আগেই binary-test-source নির্দিষ্ট করেছেন।

strings ভ্যালু টাইপ সহ বিকল্পের জন্য, আপনি কনফিগারেশনে বিকল্পগুলি পুনরাবৃত্তি করে একাধিক ভ্যালু যোগ করতে পারেন। যেমন, binary-test-source দুবার সেট করুন (VtsDeviceTreeEarlyMountTest উদাহরণে যেমন দেখানো হয়েছে)।

টেস্ট ট্যাগ

আপনি strings ভ্যালু সহ বিকল্পে প্রিফিক্স যোগ করে এবং ::-কে ডিলিমিটার হিসেবে ব্যবহার করে টেস্ট ট্যাগ যোগ করতে পারবেন। একই নামের কিন্তু ভিন্ন বিটনেস বা পেরেন্ট ডিরেক্টরি সহ বাইনারি সোর্স অন্তর্ভুক্ত করার সময় টেস্ট ট্যাগগুলি বিশেষভাবে উপযোগী। যেমন, একই নামের কিন্তু আলাদা সোর্স ডিরেক্টরির সোর্সের জন্য ফাইল পুশ বা ফলাফলের নামের সংঘর্ষ এড়াতে, আপনি এইসব সোর্সের জন্য আলাদা ট্যাগ নির্দিষ্ট করতে পারেন।

VtsDeviceTreeEarlyMountTestদুটি dt_early_mount_test সোর্স সহ উদাহরণে দেখানো হয়েছে, টেস্ট ট্যাগ হল binary-test-source-এ _32bit:: ও _64bit:: প্রিফিক্স। 32bit বা 64bit দিয়ে শেষ হওয়া ট্যাগ অটোমেটিক একটি ABI বিটনেসের জন্য উপলভ্য হিসেবে পরীক্ষাগুলিকে চিহ্নিত করে; যেমন, _32bit ট্যাগ সহ পরীক্ষাগুলি ৬৪-বিট ABI-তে এক্সিকিউট করা হয় না। ট্যাগ উল্লেখ না করা খালি স্ট্রিং সহ ট্যাগ ব্যবহার করার সমান।

একই ট্যাগ সহ বিকল্পগুলি গ্রুপ করা হয় এবং অন্যান্য ট্যাগ থেকে আলাদা করা হয়। যেমন, binary-test-args-এর সাথে _32bit ট্যাগ শুধুমাত্র একই ট্যাগ সহ binary-test-source-এ প্রয়োগ করা হয় এবং একই ট্যাগ সহ binary-test-working-directory-এ এক্সিকিউট করা হয়। বাইনারি পরীক্ষার জন্য binary-test-working-directory বিকল্পটি ঐচ্ছিক, যা আপনাকে কোনও ট্যাগের জন্য একটি ওয়ার্কিং ডিরেক্টরি নির্দিষ্ট করতে দেয়। binary-test-working-directory বিকল্পটি নির্দিষ্ট না করা থাকলে, প্রতিটি ট্যাগের জন্য ডিফল্ট ডাইরেক্টরি ব্যবহার করা হয়।

ফলাফল রিপোর্টে ট্যাগ নামটি সরাসরি টেস্ট কেসের নামের সাথে যুক্ত করা হয়। যেমন, _32bit ট্যাগ সহ টেস্ট কেস testcase1 ফলাফল রিপোর্টে testcase1_32bit হিসেবে দেখা যায়।

BinaryTest টেমপ্লেট ছাড়াই টার্গেট-সাইড টেস্ট ইন্টিগ্রেট করুন

VTS-এ, ডিফল্ট টেস্ট ফর্ম্যাট হল VTS রানারে BaseTest থেকে এক্সটেন্ড করা হোস্ট-সাইড Python টেস্ট। টার্গেট-সাইড টেস্ট ইন্টিগ্রেট করতে, আপনাকে প্রথমে ডিভাইসে টেস্ট ফাইল পুশ করতে হবে, শেল কমান্ড ব্যবহার করে টেস্ট এক্সিকিউট করতে হবে, তারপর হোস্ট-সাইড Python স্ক্রিপ্ট ব্যবহার করে ফলাফল পার্স করতে হবে।

টেস্ট বাইনারি পুশ করুন

আমরা VtsFilePusher টার্গেট প্রিপেয়ারার ব্যবহার করে ফাইল পুশ করার সাজেশন দিই। উদাহরণ:

<target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
        <option name="push" value="DATA/test->/data/local/tmp/test"/>
    </target_preparer>

VtsFilePusher নিম্নলিখিত কাজগুলি করে:

  1. ডিভাইস কানেক্টিভিটি চেক করে।
  2. সম্পূর্ণ সোর্স ফাইলের পাথ নির্ধারণ করে।
  3. adb push কমান্ড ব্যবহার করে ফাইল পুশ করে।
  4. টেস্ট সম্পূর্ণ হওয়ার পরে ফাইল মুছে দেয়।

বিকল্পভাবে, আপনি হোস্ট-সাইড পাইথন টেস্ট স্ক্রিপ্ট ব্যবহার করে ম্যানুয়ালি ফাইল পুশ করতে পারেন যা একই পদ্ধতি অনুসরণ করে।

পরীক্ষা চালান

ডিভাইসে ফাইল পুশ করার পরে, হোস্ট-সাইড Python টেস্ট স্ক্রিপ্টে শেল কমান্ড ব্যবহার করে টেস্ট রান করুন। উদাহরণ:

device = self.android_devices[0]
res = device.shell.Execute(["chmod a+x /data/local/tmp/test", "/data/local/tmp/test"])
asserts.AssertFalse(any(res[return_codes]))

GtestBinaryTest টেমপ্লেট

The GtestBinaryTest টেমপ্লেট GTest টেস্ট বাইনারি হোস্ট করে, যার প্রত্যেকটিতে সাধারণত একাধিক টেস্ট কেস থাকে। এই টেমপ্লেটটি setup, test case creation এবং result parsing পদ্ধতি ওভাররাইড করে BinaryTest টেমপ্লেটকে প্রসারিত করে, তাই সব BinaryTest কনফিগারেশন উত্তরাধিকার সূত্রে প্রাপ্ত হয়।

GtestBinaryTest gtest-batch-mode বিকল্প যোগ করে:

বিকল্পের নাম ভ্যালুর ধরন বর্ণনা
binary-test-type স্ট্রিং টেমপ্লেটের ধরন। gtest ভ্যালু ব্যবহার করে।
gtest-batch-mode বুলিয়ান ব্যাচ মোডে Gtest বাইনারি রান করুন। উদাহরণ: true

সাধারণত, gtest-batch-mode-কে true হিসেবে সেট করলে পারফর্ম্যান্স বাড়ে, তবে নির্ভরযোগ্যতা সামান্য কমে যায়। VTS কমপ্লায়েন্স টেস্টে, পারফর্ম্যান্স উন্নত করতে অনেক মডিউল ব্যাচ মোড ব্যবহার করে। তবে, নির্ভরযোগ্যতার জন্য মোড নির্দিষ্ট করা না থাকলে, এটি ডিফল্ট হিসেবে নন-ব্যাচ মোডে সেট করা থাকে।

নন-ব্যাচ মোড

নন-ব্যাচ মোড প্রতিটি টেস্ট কেসের জন্য GTest বাইনারিতে আলাদা আলাদা কল করে। যেমন, GTest বাইনারিতে ১০টি টেস্ট কেস থাকলে (হোস্ট সাইড কনফিগারেশন অনুযায়ী ফিল্টার করার পরে), ডিভাইস শেলে বাইনারি ১০ বার কল করা হয় এবং প্রতিবার আলাদা টেস্ট ফিল্টার ব্যবহার করা হয়। প্রতিটি টেস্ট কেসের জন্য, একটি অনন্য GTest ফলাফল আউটপুট XML টেমপ্লেট দ্বারা তৈরি এবং পার্স করা হয়।

ছবি ২. নন-ব্যাচ মোড।

নন-ব্যাচ মোড ব্যবহারের সুবিধাগুলির মধ্যে এগুলি অন্তর্ভুক্ত:

  • টেস্ট কেস আইসোলেশন। একটি টেস্ট কেসে ক্র্যাশ বা হ্যাং হলে অন্যান্য টেস্ট কেসে তার প্রভাব পড়ে না।
  • গ্র্যানুলারিটি। প্রতিটি টেস্ট কেস শেষ হওয়ার সাথে সাথেই টেস্ট ফলাফল ও লগ পাওয়া যায়।

নন-ব্যাচ মোড ব্যবহার করার অসুবিধাগুলির মধ্যে রয়েছে:

  • অপ্রয়োজনীয় লোডিং। প্রতিবার GTest বাইনারি কল করা হলে, এটি সম্পর্কিত লাইব্রেরি লোড করে এবং প্রাথমিক ক্লাস সেট-আপ করে।
  • যোগাযোগ সংক্রান্ত ওভারহেড। টেস্ট সম্পূর্ণ হওয়ার পরে, হোস্ট ও টার্গেট ডিভাইস ফলাফল পার্সিং ও পরবর্তী কমান্ডের জন্য যোগাযোগ করে (ভবিষ্যতে অপ্টিমাইজেশন সম্ভব)।

ব্যাচ মোড

GTest ব্যাচ মোডে, হোস্ট-সাইড কনফিগারেশন (এটি নন-ব্যাচ মোডে অপ্রয়োজনীয় লোডিং সংক্রান্ত সমস্যা এড়ায়) দ্বারা ফিল্টার করা সমস্ত টেস্ট কেস সহ একটি দীর্ঘ test ফিল্টার ভ্যালু সহ টেস্ট বাইনারি শুধুমাত্র একবার কল করা হয়। আপনি output.xml বা টার্মিনাল আউটপুট ব্যবহার করে GTest-এর জন্য test ফলাফল পার্স করতে পারবেন।

output.xml (ডিফল্ট) ব্যবহার করার সময়:

ছবি ৩. ব্যাচ মোড, output.xml.

নন-ব্যাচ মোডের মতো, GTest আউটপুট xml ফাইলের মাধ্যমে পরীক্ষার ফলাফল পার্স করা হয়। তবে, সব টেস্ট সম্পূর্ণ হওয়ার পরে আউটপুট xml তৈরি হয় বলে, কোনও টেস্ট কেস বাইনারি বা ডিভাইস ক্র্যাশ করলে, কোনও ফলাফল xml ফাইল তৈরি হয় না।

টার্মিনাল আউটপুট ব্যবহার করার সময়:

ছবি ৪. ব্যাচ মোড, টার্মিনাল আউটপুট।

GTest চলাকালীন, এটি টার্মিনালে টেস্ট লগ এবং অগ্রগতি প্রিন্ট করে এমন একটি ফর্ম্যাটে যা টেস্ট স্ট্যাটাস, ফলাফল এবং লগের জন্য ফ্রেমওয়ার্ক দ্বারা পার্স করা যেতে পারে।

ব্যাচ মোড ব্যবহারের সুবিধাগুলির মধ্যে এগুলি অন্তর্ভুক্ত:

  • টেস্ট কেস আইসোলেশন। ফ্রেমওয়ার্ক যদি ক্র্যাশ হওয়ার পরে বাইনারি/ডিভাইস রিস্টার্ট করে, তাহলে নন-ব্যাচ মোডের মতো একই লেভেলের টেস্ট কেস আইসোলেশন প্রদান করে। এটি করার সময় টেস্ট ফিল্টার কমিয়ে দেওয়া হয় (শেষ হয়ে যাওয়া এবং ক্র্যাশ হওয়া টেস্ট কেস বাদ দিয়ে)।
  • গ্র্যানুলারিটি। ব্যাচ মোড ছাড়া অন্য মোডের মতো একই টেস্ট-কেস গ্র্যানুলারিটি প্রদান করে।

ব্যাচ মোড ব্যবহার করার অসুবিধাগুলি হল:

  • রক্ষণাবেক্ষণের খরচ। GTest লগিং ফর্ম্যাট পরিবর্তন হলে, সব টেস্ট ভেঙে যাবে।
  • সংশয়। টেস্ট কেস GTest প্রগ্রেস ফর্ম্যাটের মতো কিছু প্রিন্ট করতে পারে, যা ফর্ম্যাটকে বিভ্রান্ত করতে পারে।

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

HostBinaryTest টেমপ্লেট

HostBinaryTest টেমপ্লেটে হোস্ট-সাইড এক্সিকিউটেবল অন্তর্ভুক্ত থাকে যা অন্য ডিরেক্টরি বা Python স্ক্রিপ্টে থাকে না। এইসব পরীক্ষার মধ্যে রয়েছে:

  • হোস্টে এক্সিকিউট করা যায় এমন কম্পাইল করা টেস্ট বাইনারি
  • শেল, Python বা অন্যান্য ভাষায় এক্সিকিউটেবল স্ক্রিপ্ট

একটি উদাহরণ হল VTS Security SELinux policy host-side test:

<configuration description="Config for VTS  Security SELinux policy host-side test cases">
    ...
    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
        <option name="test-module-name" value="VtsSecuritySelinuxPolicyHost"/>
        <option name="binary-test-source" value="out/host/linux-x86/bin/VtsSecuritySelinuxPolicyHostTest" />
        <option name="binary-test-type" value="host_binary_test"/>
    </test>
</configuration>

HostBinaryTest, BinaryTest টেমপ্লেট এক্সটেন্ড করে না, তবে একই ধরনের টেস্ট কনফিগারেশন ব্যবহার করে। উপরের উদাহরণে, binary-test-source বিকল্পটি টেস্ট এক্সিকিউটেবলের হোস্ট-সাইড রিলেটিভ পাথ নির্দিষ্ট করে এবং binary-test-type হল host_binary_test। BinaryTest টেমপ্লেটের মতো, ডিফল্ট হিসেবে বাইনারি ফাইলের নাম টেস্ট কেস নাম হিসেবে ব্যবহার করা হয়।

আগে থেকে থাকা টেমপ্লেট এক্সটেন্ড করা

Python নয় এমন টেস্ট অন্তর্ভুক্ত করতে আপনি সরাসরি টেস্ট কনফিগে টেমপ্লেট ব্যবহার করতে পারেন অথবা নির্দিষ্ট টেস্টের প্রয়োজনীয়তা ম্যানেজ করতে সেগুলিকে সাবক্লাসে এক্সটেন্ড করতে পারেন। VTS রেপোতে টেমপ্লেটের নিম্নলিখিত এক্সটেনশন আছে:

ছবি ৫. VTS রেপোতে আগে থেকে থাকা টেমপ্লেট এক্সটেন্ড করা।

ডেভেলপারদের কোনও নির্দিষ্ট পরীক্ষার প্রয়োজনীয়তার জন্য আগে থেকে থাকা যেকোনও টেমপ্লেট এক্সটেন্ড করতে উৎসাহিত করা হয়। টেমপ্লেট এক্সটেন্ড করার সাধারণ কারণগুলির মধ্যে এগুলি অন্তর্ভুক্ত:

  • বিশেষ টেস্ট সেট-আপ পদ্ধতি, যেমন বিশেষ কমান্ড সহ ডিভাইস প্রস্তুত করা।
  • আলাদা আলাদা টেস্ট কেস ও টেস্টের নাম জেনারেট করা।
  • কমান্ড আউটপুট পড়ে বা অন্যান্য শর্ত ব্যবহার করে ফলাফল পার্স করা।

আগে থেকে থাকা টেমপ্লেটকে আরও সহজে এক্সটেন্ড করতে, টেমপ্লেটে প্রতিটি ফাংশনালিটির জন্য বিশেষ মেথড থাকে। আগে থেকে থাকা টেমপ্লেটের জন্য আপনার কাছে উন্নত ডিজাইন থাকলে, VTS কোড বেসে কন্ট্রিবিউট করার জন্য আপনাকে উৎসাহিত করা হচ্ছে।