একাধিক ডিভাইস জুড়ে টেস্টিং

একাধিক Android ডিভাইসের মধ্যে ইন্টার‍্যাকশন প্রয়োজন এমন টেস্ট VTS-এ কাজ করে।

স্থাপত্যশিল্প

VTS, TradeFed ফ্রেমওয়ার্ক ব্যবহার করে ডিভাইস সিরিয়াল পায় এবং তা টেস্ট মডিউলে পাঠায়।

ছবি ১. VTS পাসিং ডিভাইসের সিরিয়াল।

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

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

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

পরীক্ষার প্রস্তুতিতে সাহায্যকারী

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

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

টেস্ট মডিউল

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

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

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

পরীক্ষা চলাকালীন ডিভাইসের মধ্যে যোগাযোগ

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

ধরন ১: হোস্ট-সাইড HAL টেস্ট

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

ছবি ২. হোস্ট-সাইড 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>

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

পরীক্ষার প্রস্তুতি নেওয়া সম্পর্কে বিস্তারিত তথ্য ও উদাহরণ পেতে, পরীক্ষার প্রস্তুতি নেওয়া দেখুন। সম্পূর্ণ হোস্ট-সাইড মাল্টি-ডিভাইস উদাহরণের জন্য, 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')