মাল্টি-ডিভাইস টেস্টিং

VTS এমন পরীক্ষা সমর্থন করে যার জন্য একাধিক অ্যান্ড্রয়েড ডিভাইসের মধ্যে মিথস্ক্রিয়া প্রয়োজন।

স্থাপত্য

VTS টেস্ট মডিউলগুলিতে ডিভাইস সিরিয়াল গ্রহণ ও প্রেরণ করতে TradeFed ফ্রেমওয়ার্ক ব্যবহার করে।

চিত্র ১. ভিটিএস দ্বারা ডিভাইস সিরিয়াল সংযোগ প্রেরণ।

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

ডিভাইস বরাদ্দ

টেস্ট ইনফ্রাস্ট্রাকচার (সাধারণত টেস্ট শিডিউলার) টেস্ট প্ল্যান কনফিগারেশনে উল্লেখিত শর্ত পূরণকারী উপলব্ধ ডিভাইসগুলোকে VTS ফ্রেমওয়ার্কের জন্য বরাদ্দ করে। টেস্ট মডিউল ডিভাইসগুলো ব্যবহার না করলেও, বরাদ্দকৃত ডিভাইসগুলো টেস্ট প্ল্যানের জন্য সংরক্ষিত থাকে। এরপর VTS এজেন্ট বাইনারিগুলো সমস্ত বরাদ্দকৃত ডিভাইসে পুশ করা হয় এবং চালানো হয় (যদি না বিশেষভাবে না চালানোর নির্দেশ দেওয়া হয়)। এটি নিশ্চিত করে যে একটি টেস্ট স্ক্রিপ্টের সমস্ত ডিভাইসে শেল কমান্ড এবং HAL RPC-এর জন্য TCP সংযোগগুলো উপলব্ধ থাকে।

পরীক্ষা প্রস্তুতকারীরা

ফ্রেমওয়ার্কটি সেই সমস্ত ডিভাইসের জন্য টেস্ট প্রিপেয়ারার চালায়, যেগুলোর সিরিয়াল নম্বর এটি পেয়েছে। টার্গেট প্রিপেয়ারার একক বা একাধিক ডিভাইসের হতে পারে:

  • একক-ডিভাইস টার্গেট প্রস্তুতকারক ( VtsDeviceInfoCollector- এ উদাহরণ):
    • শুধুমাত্র টেস্ট প্ল্যান কনফিগারেশনে প্রয়োজনীয় ডিভাইস তালিকার সাথে এটি নির্দিষ্ট করা যাবে (ভবিষ্যৎ সংস্করণগুলোতে মডিউল স্তরের কনফিগারেশনের সুযোগ থাকবে)।
    • শুধুমাত্র একটি ডিভাইস সিরিয়াল গ্রহণ করুন।
    • একটি নির্দিষ্ট ডিভাইসের জন্য প্রস্তুতিমূলক এবং পরিষ্করণমূলক কাজগুলো চালান।
  • একাধিক-ডিভাইস টার্গেট প্রিপারার (উদাহরণস্বরূপ VtsPythonVirtualenvPreparer দেখুন):
    • টেস্ট প্ল্যান কনফিগারেশন বা টেস্ট মডিউল কনফিগারেশনে নির্দিষ্ট করা যেতে পারে।
    • সমস্ত ডিভাইসের সিরিয়াল গ্রহণ করুন
    • প্রতিটি ডিভাইসের জন্য অথবা সমস্ত ডিভাইসের জন্য প্রস্তুতিমূলক এবং পরিষ্করণমূলক কাজগুলো চালান।

পরীক্ষার মডিউল

টেস্ট প্রস্তুতকারীরা হোস্ট/ডিভাইসগুলো সেট আপ করা শেষ করার পর টেস্ট মডিউলগুলো ডিভাইসের একটি তালিকা পায়। প্রতিটি মাল্টি-ডিভাইস টেস্ট মডিউলের জন্য একটি হোস্ট-সাইড পাইথন টেস্ট মডিউল চলে। বরাদ্দকৃত অ্যান্ড্রয়েড ডিভাইসগুলো পাইথন টেস্ট মডিউল থেকে AndroidDevice অবজেক্টের একটি তালিকা হিসাবে অ্যাক্সেস করা যায়:

devices = self.android_devices
device1 = devices[0]
device1_serial = device1.serial

টেস্ট প্ল্যানের একটি টেস্ট মডিউল মাত্র একটি ডিভাইস ব্যবহার করলেও, বরাদ্দকৃত সমস্ত ডিভাইস সেই প্ল্যানের জন্য সংরক্ষিত থাকে।

পরীক্ষার সময় ডিভাইসের যোগাযোগ

কার্যকরী মাল্টি-অ্যান্ড্রয়েড টেস্টের জন্য বরাদ্দকৃত ডিভাইসগুলোর মধ্যে যোগাযোগ স্থাপন করা প্রয়োজন। এই ধরনের টেস্ট তৈরি করার সময়, আপনাকে অবশ্যই নির্ধারণ করতে হবে যে বরাদ্দকৃত ডিভাইসগুলোর মধ্যে কীভাবে যোগাযোগ স্থাপন করা হবে। নিম্নলিখিত বিভাগগুলোতে যোগাযোগের তিনটি উদাহরণ দেওয়া হয়েছে (তবে, টেস্ট ডেভেলপাররা অন্যান্য মডেল ডিজাইন করতে স্বাধীন)।

টাইপ ১: হোস্ট-সাইড HAL পরীক্ষা

হোস্ট-সাইড HAL টেস্টগুলো VTS HAL ড্রাইভার ব্যবহার করতে পারে, যেগুলো ডিভাইসগুলোতে ডিফল্টভাবে পুশ করা থাকে:

চিত্র ২. হোস্ট-সাইড এইচএএল পরীক্ষা।

এই পরিস্থিতিতে:

  • টেস্ট লজিক হোস্টে এক্সিকিউট হয়।
  • হোস্ট-সাইড টেস্ট স্ক্রিপ্ট প্রতিটি ডিভাইসের ড্রাইভারগুলিতে RPC কল পাঠায়।
  • হোস্ট সাইড ডিভাইসগুলোর পারস্পরিক ক্রিয়া সমন্বয় করে।

প্রকার ২: হোস্ট-সাইড এজেন্ট-ভিত্তিক পরীক্ষা

ডিভাইসে VTS এজেন্ট ব্যবহার করার পরিবর্তে, একটি হোস্ট-সাইড টেস্ট প্রতিটি ডিভাইসে তার নিজস্ব এজেন্ট (অ্যাপ বা বাইনারি) পুশ করতে পারে:

চিত্র ৩. হোস্ট-সাইড, এজেন্ট-ভিত্তিক পরীক্ষা।

এই পরিস্থিতিতে:

  • টেস্ট লজিক হোস্টে এক্সিকিউট হয়।
  • এজেন্ট অ্যাপ (বা বাইনারি) প্রতিটি ডিভাইসে ইনস্টল হয়।
  • হোস্ট-সাইড টেস্ট স্ক্রিপ্ট প্রতিটি ডিভাইসের অ্যাপগুলোতে কমান্ড জারি করে।
  • হোস্ট সাইড ডিভাইসগুলোর পারস্পরিক ক্রিয়া সমন্বয় করে।

উদাহরণস্বরূপ, বর্তমান VTS রিপোতে থাকা নেক্সট বিলিয়ন ইউজার টেস্টগুলো হলো হোস্ট-সাইড, অ্যাপ-ভিত্তিক এবং একাধিক ডিভাইস-ভিত্তিক টেস্ট।

টাইপ ৩: টার্গেট-সাইড HIDL পরীক্ষা

টার্গেট-সাইড, মাল্টি-ডিভাইস HIDL টেস্টগুলো সমস্ত টেস্ট লজিক ডিভাইস-সাইড টেস্ট বাইনারিতে রাখে, যার জন্য টেস্ট চলাকালীন ডিভাইসগুলোকে সিনক্রোনাইজ করতে হয়:

চিত্র ৪. লক্ষ্যমাত্রা-ভিত্তিক HIDL পরীক্ষা।

এই পরিস্থিতিতে:

  • টেস্ট লজিক ডিভাইসগুলোতে কার্যকর হয়।
  • হোস্ট-সাইড ফ্রেমওয়ার্ক প্রাথমিক ডিভাইস শনাক্তকরণ প্রদান করে।
  • টার্গেট-সাইড টেস্ট বাইনারির সিঙ্ক্রোনাইজেশন প্রয়োজন:
    • সকল ডিভাইসের জন্য একই টেস্ট বাইনারি।
    • প্রতিটি ভূমিকার জন্য আলাদা টেস্ট বাইনারি।

উদাহরণ: একাধিক-ডিভাইস পরীক্ষার পরিকল্পনা

এই উদাহরণটিতে দুটি ডিভাইসের কনফিগারেশন নির্দিষ্ট করা হয়েছে:

  • ডিভাইস ১-এ একটি বিল্ড প্রোভাইডার এবং VtsDeviceInfoCollector টার্গেট প্রিপারার অন্তর্ভুক্ত রয়েছে।
  • ডিভাইস ২-এ একটি অতিরিক্ত FilePusher প্রিপেয়ারার অন্তর্ভুক্ত রয়েছে, যা হোস্ট-চালিত সম্পর্কিত ফাইলগুলির একটি গ্রুপকে ডিভাইসটিতে পুশ করে।
<configuration description="VTS Codelab Plan">
  ...
<device name="device1">
<build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" />
<target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" />
</device>
<device name="device2" >
<build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" />
<target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" />
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
<option name="push-group" value="HostDrivenTest.push" />
</target_preparer>
</device>
<option name="compatibility:include-filter" value="VtsCodelabHelloWorldMultiDeviceTest" />
</configuration>

উদাহরণ: হোস্ট-সাইড পাইথন টেস্ট স্ক্রিপ্ট

টেস্ট প্রিপেয়ারার সম্পর্কিত বিস্তারিত তথ্য ও উদাহরণের জন্য, টেস্ট প্রিপেয়ারারস দেখুন। একটি সম্পূর্ণ হোস্ট-সাইড মাল্টি-ডিভাইস উদাহরণের জন্য, hello_world_multi কোডল্যাবটি দেখুন।

def setUpClass(self):
logging.info('number of device: %s', self.android_devices)
asserts.assertEqual(len(self.android_devices), 2, 'number of device is wrong.')
self.dut1 = self.android_devices[0]
self.dut2 = self.android_devices[1]
self.shell1 = self.dut1.shell
self.shell2 = self.dut2.shell

def testSerialNotEqual(self):
'''Checks serial number from two device not being equal.'''
command = 'getprop | grep ro.serial'
res1 = self.shell1.Execute(command)
res2 = self.shell2.Execute(command)

def getSerialFromShellOutput(output):
'''Get serial from getprop query'''
return output[const.STDOUT][0].strip().split(' ')[-1][1:-1]
serial1 = getSerialFromShellOutput(res1)
serial2 = getSerialFromShellOutput(res2)

logging.info('Serial number of device 1 shell output: %s', serial1)
logging.info('Serial number of device 2 shell output: %s', serial2)
asserts.assertNotEqual(serial1, serial2, 'serials from two devices should not be the same')
asserts.assertEqual(serial1, self.dut1.serial, 'serial got from device system property is different from allocated serial')
asserts.assertEqual(serial2, self.dut2.serial, 'serial got from device system property is different from allocated serial')