Đố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à:
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.Tên lớp kiểm tra.
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
.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ẵnPrintInstanceTupleNameToString
, 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<>);