Các lệnh shell thiết bị

Trong quá trình kiểm thử VTS, các lệnh shell được dùng để thực thi tệp nhị phân kiểm thử phía mục tiêu, để lấy/đặt thuộc tính, biến môi trường và thông tin hệ thống, cũng như để khởi động/dừng khung Android. Bạn có thể thực thi các lệnh shell thiết bị VTS bằng lệnh adb shell hoặc trình điều khiển shell VTS chạy trên thiết bị (nên dùng).

Sử dụng shell ADB

Các chương trình kiểm thử yêu cầu tắt cổng USB hoặc khởi động lại thiết bị trong quá trình kiểm thử phải sử dụng shell ADB vì trình điều khiển shell VTS không hoạt động nếu không có kết nối USB liên tục. Bạn có thể gọi shell ADB từ đối tượng AndroidDevice trong tập lệnh kiểm thử Python. Ví dụ:

  • Lấy đối tượng thiết bị Android:
    self.device = self.android_devices[0]
    
  • Phát một lệnh shell duy nhất:
    result = self.device.adb.shell(‘ls')
    

Sử dụng trình điều khiển shell VTS

Trình điều khiển shell VTS là một tệp nhị phân của tác nhân chạy trên thiết bị và thực thi các lệnh shell. Theo mặc định, VTS sử dụng trình điều khiển shell nếu trình điều khiển đó đang chạy trên thiết bị vì phương thức này có độ trễ thấp hơn so với khi sử dụng lệnh adb shell.

Hình 1. Trình điều khiển vỏ VTS.

Khung VTS hỗ trợ kiểm thử nhiều thiết bị, trong đó mỗi thiết bị Android được biểu thị dưới dạng một đối tượng AndroidDevice trong trình chạy cơ sở. Theo mặc định, khung VTS đẩy các tệp nhị phân của trình điều khiển shell VTS và tác nhân VTS đến từng thiết bị Android và thiết lập kết nối TCP với các tác nhân VTS trên các thiết bị đó.

Để thực thi lệnh shell, tập lệnh Python phía máy chủ sẽ thực hiện lệnh gọi hàm đến đối tượng ShellMirror bên trong đối tượng AndroidDevice. Đối tượng ShellMirror đóng gói văn bản lệnh shell vào một thông báo protobuf và gửi thông báo đó (thông qua kênh TCP) đến tác nhân VTS trên thiết bị Android. Sau đó, tác nhân chạy trên thiết bị sẽ chuyển tiếp lệnh shell đến trình điều khiển shell VTS thông qua ổ cắm Unix.

Khi nhận được lệnh shell, trình điều khiển shell VTS sẽ thực thi lệnh đó thông qua nohup trên shell thiết bị để tránh bị treo. Sau đó, Stdout, stderr và mã trả về sẽ được truy xuất từ nohup và gửi lại cho tác nhân VTS. Cuối cùng, tác nhân sẽ trả lời máy chủ bằng cách gói(các) kết quả lệnh vào một thông báo protobuf.

Ưu điểm

Sau đây là các ưu điểm của việc sử dụng trình điều khiển shell VTS thay vì adb shell:

  • Độ tin cậy. Trình điều khiển shell VTS sử dụng nohup để thực thi các lệnh theo chế độ cài đặt mặc định. Vì các kiểm thử VTS chủ yếu là kiểm thử HAL và nhân cấp thấp hơn, nên nohup đảm bảo các lệnh shell không bị treo trong quá trình thực thi.
  • Hiệu suất. Mặc dù lệnh adb shell lưu một số kết quả vào bộ nhớ đệm (chẳng hạn như liệt kê các tệp trong một thư mục), nhưng lệnh này có hao tổn kết nối khi thực hiện các tác vụ như thực thi tệp nhị phân kiểm thử. Trình điều khiển vỏ VTS duy trì kết nối đang hoạt động trong suốt quá trình kiểm thử, vì vậy, chi phí duy nhất là giao tiếp qua USB. Trong quá trình kiểm thử, việc sử dụng trình điều khiển shell VTS để thực thi một lệnh có 100 lệnh gọi đến tệp nhị phân gtest trống nhanh hơn khoảng 20% so với việc sử dụng adb shell; sự khác biệt thực tế lớn hơn vì hoạt động giao tiếp của shell VTS có nhật ký chi tiết.
  • Lưu giữ trạng thái. Trình điều khiển shell VTS duy trì một phiên đầu cuối cho mỗi tên đầu cuối (tên đầu cuối mặc định là mặc định). Các biến môi trường được đặt trong một phiên dòng lệnh chỉ có sẵn cho các lệnh tiếp theo trong cùng một phiên.
  • Mở rộng được. Giao tiếp lệnh shell giữa khung VTS và trình điều khiển thiết bị được gói trong protobuf để bật tính năng nén, điều khiển từ xa, mã hoá, v.v. trong tương lai. Ngoài ra, bạn cũng có thể cải thiện hiệu suất theo những cách khác, bao gồm cả việc phân tích cú pháp kết quả phía thiết bị khi mức hao tổn giao tiếp lớn hơn mức phân tích cú pháp chuỗi kết quả.

Nhược điểm

Sau đây là những hạn chế của việc sử dụng trình điều khiển shell VTS thay vì adb shell:

  • Tệp nhị phân bổ sung. Bạn phải đẩy các tệp của tác nhân VTS vào thiết bị và dọn dẹp sau khi thực thi kiểm thử.
  • Cần có kết nối đang hoạt động. Nếu kết nối TCP giữa máy chủ và tác nhân bị mất trong quá trình kiểm thử (do ngắt kết nối USB, tắt cổng, sự cố thiết bị, v.v.) một cách cố ý hoặc ngoài ý muốn, thì lệnh shell sẽ không thể truyền đến tác nhân VTS. Ngay cả khi tự động chuyển sang adb shell, kết quả và trạng thái của lệnh trước khi ngắt kết nối sẽ không xác định.

Ví dụ

Ví dụ về cách sử dụng các lệnh shell trong tập lệnh kiểm thử Python phía máy chủ của VTS:

  • Lấy đối tượng thiết bị Android:
    self.device = self.android_devices[0]
    
  • Lấy đối tượng shell cho thiết bị đã chọn:
    self.shell = self.device.shell
    
  • Phát một lệnh shell duy nhất:
    results = self.shell.Execute(‘ls')
    
  • Phát lệnh liệt kê các lệnh shell:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

Đối tượng kết quả lệnh

Đối tượng trả về từ quá trình thực thi lệnh shell là một từ điển chứa các khoá stdouts, stderrsreturn_codes. Bất kể lệnh shell được cung cấp dưới dạng một chuỗi hay một danh sách các chuỗi lệnh, mỗi giá trị của từ điển kết quả luôn là một danh sách.

Để xác minh mã trả về của danh sách lệnh, tập lệnh kiểm thử phải kiểm tra các chỉ mục. Ví dụ:

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

Ngoài ra, tập lệnh có thể kiểm tra từng chỉ mục lệnh riêng lẻ. Ví dụ:

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