คำสั่งเชลล์อุปกรณ์

ในระหว่างการทดสอบ VTS คำสั่งเชลล์จะใช้เพื่อเรียกใช้ไบนารีการทดสอบฝั่งเป้าหมายเพื่อรับ / ตั้งค่าคุณสมบัติตัวแปรสภาพแวดล้อมและข้อมูลระบบและเพื่อเริ่ม / หยุดเฟรมเวิร์ก Android คุณสามารถเรียกใช้คำสั่งเชลล์อุปกรณ์ VTS โดยใช้คำสั่ง adb shell หรือไดรเวอร์เชลล์ VTS ที่ทำงานบนอุปกรณ์ (แนะนำ)

ใช้เปลือก ADB

การทดสอบที่ต้องปิดพอร์ต USB หรือรีบูตอุปกรณ์ระหว่างการทดสอบต้องใช้เชลล์ ADB เนื่องจากไดรเวอร์เชลล์ VTS ไม่สามารถใช้งานได้หากไม่มีการเชื่อมต่อ USB แบบต่อเนื่อง คุณสามารถเรียกใช้ ADB shell จากอ็อบเจ็กต์ AndroidDevice ในสคริปต์ทดสอบ Python ตัวอย่าง:

  • รับวัตถุอุปกรณ์ Android:
    self.device = self.android_devices[0]
    
  • ออกคำสั่งเชลล์เดียว:
    result = self.device.adb.shell(‘ls')
    

การใช้ไดรเวอร์เชลล์ VTS

ไดรเวอร์เชลล์ VTS เป็นไบนารีของเอเจนต์ที่รันบนอุปกรณ์และรันคำสั่งเชลล์ ตามค่าเริ่มต้น VTS จะใช้ไดรเวอร์เชลล์หากไดรเวอร์กำลังทำงานบนอุปกรณ์เนื่องจากวิธีนี้มีเวลาแฝงน้อยกว่าการใช้คำสั่ง adb shell

รูปที่ 1. ไดรเวอร์เชลล์ VTS

เฟรมเวิร์ก VTS รองรับการทดสอบหลายอุปกรณ์โดยที่อุปกรณ์ Android แต่ละเครื่องจะแสดงเป็นอ็อบเจ็กต์ AndroidDevice ใน base runner ตามค่าเริ่มต้นเฟรมเวิร์ก VTS จะพุช VTS agent และ VTS shell ไดร์เวอร์ไบนารีไปยังอุปกรณ์ Android แต่ละเครื่องและสร้างการเชื่อมต่อ TCP กับเอเจนต์ VTS บนอุปกรณ์เหล่านั้น

ในการดำเนินการคำสั่งเชลล์สคริปต์ Python ฝั่งโฮสต์จะเรียกใช้ฟังก์ชันไปยังอ็อบเจ็กต์ ShellMirror ภายในอ็อบเจ็กต์ AndroidDevice วัตถุ ShellMirror บรรจุข้อความคำสั่งเชลล์ลงในข้อความ protobuf และส่ง (ผ่านช่องทาง TCP) ไปยังตัวแทน VTS บนอุปกรณ์ Android เอเจนต์ที่รันบนอุปกรณ์จากนั้นส่งต่อคำสั่งเชลล์ไปยังไดรเวอร์เชลล์ VTS ผ่านซ็อกเก็ต Unix

เมื่อไดรเวอร์เชลล์ VTS ได้รับคำสั่งเชลล์จะรันคำสั่งผ่าน nohup บนเชลล์อุปกรณ์เพื่อป้องกันไม่ให้แฮงค์ จากนั้น Stdout, stderr และโค้ดส่งคืนจะถูกดึงมาจาก nohup และส่งกลับไปยังตัวแทน VTS ในที่สุดเอเจนต์จะตอบกลับโฮสต์โดยการรวมผลลัพธ์ของคำสั่งไว้ในข้อความ protobuf

ข้อดี

ข้อดีของการใช้ VTS shell driver แทน adb shell ได้แก่ :

  • ความน่าเชื่อถือ ไดรเวอร์เชลล์ VTS ใช้ nohup เพื่อดำเนินการคำสั่งในการตั้งค่าเริ่มต้น เนื่องจากการทดสอบ VTS ส่วนใหญ่เป็นการทดสอบ HAL และเคอร์เนลในระดับที่ต่ำกว่าดังนั้น nohup ทำให้คำสั่งเชลล์ไม่ค้างระหว่างการดำเนินการ
  • ประสิทธิภาพ ในขณะที่คำสั่ง adb shell แคชผลลัพธ์บางอย่าง (เช่นการแสดงรายการไฟล์ในไดเร็กทอรี) แต่ก็มีค่าใช้จ่ายในการเชื่อมต่อเมื่อทำงานต่างๆเช่นเรียกใช้ไบนารีทดสอบ ไดรเวอร์เชลล์ VTS รักษาการเชื่อมต่อที่ใช้งานได้ตลอดการทดสอบดังนั้นค่าใช้จ่ายเพียงอย่างเดียวคือการสื่อสารผ่าน USB ในการทดสอบของเราการใช้ไดรเวอร์เชลล์ VTS เพื่อดำเนินการคำสั่งที่มี 100 การเรียกไปยังไบนารี gtest ว่างนั้นเร็วกว่าการใช้ adb shell ประมาณ 20 เปอร์เซ็นต์ ความแตกต่างที่แท้จริงนั้นใหญ่กว่าเนื่องจากการสื่อสารของเชลล์ VTS มีการบันทึกที่ครอบคลุม
  • การรักษารัฐ ไดรเวอร์เชลล์ VTS รักษาเซสชันเทอร์มินัลสำหรับแต่ละชื่อเทอร์มินัล (ชื่อเทอร์มินัล เริ่มต้น เป็น ค่าเริ่มต้น ) ตัวแปรสภาพแวดล้อมที่ตั้งค่าในเซสชันเทอร์มินัลหนึ่งจะพร้อมใช้งานสำหรับคำสั่งที่ตามมาในเซสชันเดียวกันเท่านั้น
  • ขยาย ได้ การสื่อสารคำสั่งเชลล์ระหว่างเฟรมเวิร์ก VTS และไดรเวอร์อุปกรณ์ถูกรวมไว้ใน protobuf เพื่อเปิดใช้งานการบีบอัดระยะไกลการเข้ารหัสและอื่น ๆ ที่อาจเกิดขึ้นในอนาคต นอกจากนี้ยังมีความเป็นไปได้อื่น ๆ ในการปรับปรุงประสิทธิภาพรวมถึงการแยกวิเคราะห์ผลลัพธ์จากฝั่งอุปกรณ์เมื่อค่าโสหุ้ยการสื่อสารมีขนาดใหญ่กว่าการแยกวิเคราะห์สตริงผลลัพธ์

ข้อเสีย

ข้อเสียของการใช้ VTS shell driver แทน adb shell ได้แก่ :

  • ไบนารีเพิ่มเติม ไฟล์เอเจนต์ VTS จะต้องถูกพุชไปยังอุปกรณ์และล้างข้อมูลหลังจากดำเนินการทดสอบ
  • ต้องมีการเชื่อมต่อที่ใช้งานอยู่ หากการเชื่อมต่อ TCP ระหว่างโฮสต์และเอเจนต์สูญหายระหว่างการทดสอบ (เนื่องจากการตัดการเชื่อมต่อของ USB การปิดพอร์ตอุปกรณ์ขัดข้อง ฯลฯ ) ไม่ว่าจะโดยตั้งใจหรือไม่ตั้งใจคำสั่งเชลล์จะไม่สามารถส่งไปยังเอเจนต์ VTS ได้ แม้จะเปลี่ยนไปใช้ adb shell โดยอัตโนมัติผลลัพธ์และสถานะของคำสั่งก่อนที่จะตัดการเชื่อมต่อก็จะไม่เป็นที่รู้จัก

ตัวอย่าง

ตัวอย่างของการใช้คำสั่งเชลล์ในสคริปต์ทดสอบ Python ฝั่งโฮสต์ VTS:

  • รับวัตถุอุปกรณ์ Android:
    self.device = self.android_devices[0]
    
  • รับวัตถุเชลล์สำหรับอุปกรณ์ที่เลือก:
    self.shell = self.device.shell
    
  • ออกคำสั่งเชลล์เดียว:
    results = self.shell.Execute(‘ls')
    
  • ออกรายการคำสั่งเชลล์:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

วัตถุผลลัพธ์คำสั่ง

อ็อบเจ็กต์ส่งคืนจากการดำเนินการคำสั่งเชลล์คือพจนานุกรมที่มีคีย์ stdouts , stderrs และ return_codes ไม่ว่าคำสั่งเชลล์จะถูกจัดเตรียมไว้เป็นสตริงเดี่ยวหรือรายการของสตริงคำสั่งค่าแต่ละค่าของพจนานุกรมผลลัพธ์จะเป็นรายการเสมอ

ในการตรวจสอบรหัสส่งคืนของรายการคำสั่งสคริปต์ทดสอบต้องตรวจสอบดัชนี ตัวอย่าง:

asserts.assertFalse(any(results[‘return_codes']), ‘some command failed.')

อีกวิธีหนึ่งสคริปต์สามารถตรวจสอบดัชนีคำสั่งแต่ละรายการทีละรายการ ตัวอย่าง:

asserts.assertEqual(results[‘return_codes'][0], 0, ‘first command failed')
asserts.assertEqual(results[‘return_codes'][1], 0, ‘second command failed')