GTest được tham số hoá để kiểm thử HAL

Đối với giao diện HAL, có thể có nhiều cách triển khai. Để kiểm thử từng bản sao cho việc triển khai HAL, cách tiêu chuẩn là viết một GTest được tham số hoá bằng giá trị.

Thiết lập kiểm thử cơ bản

GTest phải kế thừa lớp cơ sở testing::TestWithParam, trong đó tham số là tên của từng thực thể. Trong phương thức SetUp, bạn có thể tạo bản sao dịch vụ dựa trên tên thực thể, như minh hoạ trong đoạn mã sau.

// The main test class for the USB hidl HAL
class UsbHidlTest : public testing::TestWithParam<std::string> {

 virtual void SetUp() override {
   usb = IUsb::getService(GetParam());
   ASSERT_NE(usb, nullptr);
...
 }

Đối với mỗi phương pháp kiểm thử, hãy sử dụng macro TEST_P như trong ví dụ sau:

TEST_P(UsbHidlTest, setCallback) {
...
}

Tạo bản sao của bộ bằng macro INSTANTIATE_TEST_SUITE_P, như trong ví dụ sau:

INSTANTIATE_TEST_SUITE_P(
       PerInstance, UsbHidlTest,
       testing::ValuesIn(android::hardware::getAllHalInstanceNames(IUsb::descriptor)),
       android::hardware::PrintInstanceNameToString);

Các đối số bao gồm:

  1. InstantiationName, có thể là bất kỳ giá trị nào khớp với kiểm thử của bạn. PerInstance là một tên phổ biến.

  2. Tên lớp kiểm thử.

  3. Một tập hợp tên thực thể có thể được truy xuất từ phương thức tích hợp, ví dụ: getAllHalInstanceNames.

  4. Phương thức để in tên phương thức kiểm thử. PrintInstanceNameToString là một tên tích hợp sẵn mà bạn có thể sử dụng để biên dịch tên kiểm thử dựa trên tên thực thể và tên phương thức kiểm thử.

Kiểm thử với nhiều dữ liệu đầu vào

GTest hỗ trợ các bộ dữ liệu cho các kiểm thử được tham số hoá theo giá trị. Khi quy trình kiểm thử HAL yêu cầu kiểm thử bằng nhiều dữ liệu đầu vào (ví dụ: kiểm thử với nhiều giao diện), bạn có thể viết GTest với tuple làm tham số kiểm thử. Bạn có thể tìm thấy mã đầy đủ trong VtsHalGraphicsMapperV2_1TargetTest.

So với GTest có một tham số kiểm thử duy nhất, chương trình kiểm thử này cần sử dụng tuple làm tham số kiểm thử như trong ví dụ sau:

class GraphicsMapperHidlTest
   : public ::testing::TestWithParam<std::tuple<std::string, std::string>> {
 protected:
   void SetUp() override {
       ASSERT_NO_FATAL_FAILURE(mGralloc = std::make_unique<Gralloc>(std::get<0>(GetParam()),
                                                                    std::get<1>(GetParam())));

}

Nếu cần các tham số phức tạp hơn, bạn nên sử dụng cấu trúc và các hàm ToString GTest tuỳ chỉnh.

Để tạo bản sao cho bộ kiểm thử, bạn cũng sử dụng macro INSTANTIATE\_TEST\_CASE\_P, với hai điểm khác biệt:

  • Đối số thứ ba là một tập hợp các bộ dữ liệu (so với một tập hợp các chuỗi trong trường hợp cơ bản).
  • Phương thức biên dịch tên kiểm thử cần hỗ trợ tuple. Bạn có thể sử dụng phương thức tích hợp PrintInstanceTupleNameToString. Phương thức này có thể xử lý các bộ dữ liệu gồm các chuỗi, như trong ví dụ sau:
INSTANTIATE_TEST_CASE_P(
       PerInstance, GraphicsMapperHidlTest,
       testing::Combine(
               testing::ValuesIn(
                       android::hardware::getAllHalInstanceNames(IAllocator::descriptor)),
           testing::ValuesIn(android::hardware::getAllHalInstanceNames(IMapper::descriptor))),
       android::hardware::PrintInstanceTupleNameToString<>);