gtest được tham số hóa cho thử nghiệm HAL

Đối với giao diện HAL, có thể có nhiều cách triển khai. Để kiểm tra từng trường hợp triển khai HAL, cách tiêu chuẩn là viết gtest có tham số giá trị .

Thiết lập thử nghiệm 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 phiên bản. Trong phương thức SetUp , dịch vụ có thể được khởi tạo dựa trên tên phiên bản, như minh họa 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 thử nghiệm, hãy sử dụng macro TEST_P như trong ví dụ bên dưới.

TEST_P(UsbHidlTest, setCallback) {
...
}

Khởi tạo bộ phần mềm bằng macro INSTANTIATE_TEST_SUITE_P , như trong ví dụ bên dưới.

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

Các đối số là:

  1. InstantiationName , có thể là bất cứ thứ gì phù hợp với thử nghiệm của bạn. PerInstance là một tên phổ biến.

  2. Tên lớp kiểm tra.

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

  4. Phương pháp in tên phương pháp thử nghiệm. PrintInstanceNameToString là tên dựng sẵn mà bạn có thể sử dụng để biên dịch tên thử nghiệm dựa trên tên phiên bản và tên phương thức thử nghiệm.

Kiểm tra với nhiều đầu vào

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

So với gtest có một tham số thử nghiệm duy nhất, thử nghiệm này cần sử dụng tuple làm tham số thử nghiệm như trong ví dụ bên dưới.

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à hàm gtest ToString tùy chỉnh.

Để khởi tạo bộ thử nghiệm, macro INSTANTIATE\_TEST\_CASE\_P cũng được sử dụng, với hai điểm khác biệt:

  • Đối số thứ ba là tập hợp các bộ dữ liệu (so với 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 tra cần hỗ trợ tuple . Bạn có thể sử dụng phương thức dựng sẵn PrintInstanceTupleNameToString , phương thức này có thể xử lý các bộ chuỗi, như trong ví dụ bên dưới.
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<>);