Đối với một giao diện HAL, có thể có nhiều cách triển khai. Để kiểm thử từng phiên bản cho một quy trình triển khai HAL, cách tiêu chuẩn là viết một GTest được tham số hoá 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 mỗi phiên bản. Trong phương thức SetUp
, dịch vụ có thể được tạo thực thể 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 thức kiểm thử, hãy dùng macro TEST_P
như trong ví dụ sau:
TEST_P(UsbHidlTest, setCallback) {
...
}
Khởi tạo 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:
InstantiationName
, có thể là bất cứ thứ gì phù hợp với bài kiểm thử của bạn.PerInstance
là một tên phổ biến.Tên lớp kiểm thử.
Một tập hợp tên thực thể mà bạn có thể truy xuất từ phương thức tích hợp, ví dụ:
getAllHalInstanceNames
.Phương thức in tên phương thức kiểm thử.
PrintInstanceNameToString
là một tên tích hợp mà bạn có thể dùng để biên dịch tên kiểm thử dựa trên tên phiên bản và tên phương thức kiểm thử.
Kiểm thử bằng nhiều dữ liệu đầu vào
GTest hỗ trợ các bộ giá trị cho kiểm thử theo tham số giá trị. Khi một kiểm thử HAL yêu cầu kiểm thử bằng nhiều đầu vào (ví dụ: một kiểm thử có nhiều giao diện), bạn có thể viết một GTest có 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, 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.
Để khởi tạo bộ kiểm thử, macro INSTANTIATE\_TEST\_CASE\_P
cũng được dùng, với 2 điểm khác biệt:
- Đối số thứ ba là một tập hợp các bộ dữ liệu (thay vì 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ợpPrintInstanceTupleNameToString
, có thể xử lý các bộ 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<>);