คำสั่ง Shell อุปกรณ์

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

ใช้ ADB shell

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

  • รับออบเจ็กต์อุปกรณ์ Android โดยทำดังนี้
    self.device = self.android_devices[0]
    
  • ออกคำสั่ง Shell เดียว:
    result = self.device.adb.shell(‘ls')
    

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

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

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

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

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

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

ข้อดี

ข้อดีของการใช้ไดรเวอร์เชลล์ VTS แทน adb shell ได้แก่

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

ข้อเสีย

ข้อเสียของการใช้ไดรเวอร์เชลล์ VTS แทน adb shell มีดังนี้

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

ตัวอย่าง

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

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

ออบเจ็กต์ผลลัพธ์ของคำสั่ง

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

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

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')