Chương 2 có trình bày các kỹ thuật thiết kế kiểm thử trong đó có kỹ thuật kiểm thử điều khiển luồng. Kiểm thử điều khiển luồng là một kỹ thuật thiết kế kiểm thửchủ yếu sử dụng trong kiểm thửđơn vị (Unit Test). Vì vậy tôi đã dùng kỹ thuật này để thiết kế các test case trong kiểm thử đơn vị cho phần mềm SSD.
Dựa theo kỹ thuật kiểm thử điều khiển luồng cùng tài liệu về mạch MKL46Z256 (tài liệu số 3 trong phần tài liệu tham khảo) tôi đã viết được “Tài liệu thiết kế chi tiết” của từng hàm. Chi tiết xin xem phần phụ lục A
Tôi sẽ trình bày chi tiết về việc thiết kế các tình huống kiểm thử cho hàm FlashEraseSector() – một hàm trong phần mềm điều khiển chuẩn SSD. Chức năng của hàm này là cho phép xoá tất cả địa chỉ của một hoặc nhiều sector trong bộ nhớ P-Flash và hàm này sẽ trả về lỗi nếu vùng được chọn để xoá ở trạng thái được bảo vệ (Protected).
Nhìn vào sơ đồ khối của hàm ta FlashEraseSector hình 3.6để xác định các đường đi kiểm thử dựa theo độ bao phủ cạnh. Tức là tôi sẽ tìm các đường đi bao phủ được các cạnh của hàm này ít nhất một lần.
BEGIN Call the FlashCommandSequence Check if target address is aligned? No END Return with returnCode Prepare passing parameters for FlashCommandSquence
for sector erase
FlashEraseSector()
Check if end address is within
valid range
No
Return code to state ‘invalid address’
Return code to state ‘invalid range’ Set Return code to
‘OK’ Check if size > 0 Check if return code is "OK" Yes Yes Yes No Check if size is aligned on sector size
Return code to state ‘invalid size’ Yes
Yes
No
Updated size and target address
No Check
if target address is within valid range
Yes
Return code to state ‘invalid range’ No
Đường đi số 1: Begin -> Set returnCode -> Check target address is valid range?-No -> Return error invalid range -> return returnCode -> End
Đường đi số 2: Begin -> Set returnCode -> Check target address is valid
range?-Yes -> Check target address is aligned?- No ->Return error invalid address - > return returnCode -> End
Đường đi số 3: Begin -> Set returnCode ->Check target address is valid
range?-Yes -> Check target address is aligned? -Yes -> Check size is aligned?- No -> Return error invalid size -> return returnCode -> End
Đường đi số 4: Begin -> Set returnCode -> Check target address is valid
range?-Yes -> Check target address is aligned? - Yes -> Check size is aligned?- Yes - > Check end address is valid range? - No -> Return error invalid range -> return returnCode -> End
Đường đi số 5: Begin -> Set returnCode -> Check target address is valid
range?-Yes -> Check target address is aligned? -Yes -> Check size is aligned?- Yes -> Check end address is valid range? - Yes -> Check size > 0? – No -> Return returnCode -> End
Đường đi số 6: Begin -> Set returnCode -> Check target address is valid
range?-Yes -> Check target address is aligned? -Yes -> Check size is aligned?- Yes -> Check end address is valid range? - Yes -> Check size > 0? - Yes -> Prepare passing parameters -> Call FlashCommandSequence -> Check returnCode is OK? - Yes -> Updated size and target address -> Check size>0? - Repeat or Not Repeat -> Return returnCode -> End
Đường đi số 7: Begin -> Set returnCode -> Check target address is valid
range?-Yes -> Check target address is aligned? -Yes -> Check size is aligned?- Yes -> Check end address is valid range? - Yes -> Check size>0?- Yes ->Prepare passing parameters -> Call FlashCommandSequence -> Check returnCode is OK? - No -> Return returnCode -> End
Sau khi đã xác định được các đường đi kiểm thử tôi tiến hành định rõ các tình huống kiểm thử từ các đường đi này. Ứng với 7 đường đi ở trên tôi có 7 trường hợp kiểm thử. Hàm FlashEraseSector() có prototype như sau:
UINT32 FlashEraseSector(PFLASH_SSD_CONFIG PSSDConfig, \ UINT32 destination, \
UINT32 size, \
pFLASHCOMMANDSEQUENCE FlashCommandSequence)
Để xác định các tham số đầu vào ta cần xác định các thông số: 1. Struct FLASH_SSD_CONFIG flashSSDConfig =
{
FTFx_REG_BASE, /* Địa chỉ bắt đầu của vùng thanh ghi : 0x40020000*/ PFLASH_BLOCK_BASE,/* Địa chỉ bắt đầu của PFlash: 0x00000000*/ PBLOCK_SIZE, /* Kích thước của PFlash: 0x00040000 – 256KB*/
NULL_CALLBACK /* Con trỏ null_callback */ };
2. „destination‟: /* Địa chỉ vùng PFlash mà người dùng muốn xóa */ 3. „size‟: /*kích thước vùng PFlash mà người dùng muốn xóa */
4. Call FlashCommandSequence: Thực hiện ghi chuỗi lệnh xuống Flash
Các thông số về flashSSDConfig, FlashCommandSequence là cố định nên tôi chỉ cần xác định đầu vào cho các tham số „destination‟ and „size‟ tương ứng với từng trường hợp kiểm thử.
Trƣờng hợp 1: FlashEraseSector() sẽ trả về lỗi nếu địa chỉ vùng PFlash được
truyền vào không hợp lệ tức là không nằm trong vùng PFlash.
Dữ liệu đầu vào:
'destination' = PFLASH_OUT_OF_RANGE (ví dụ: 0x00040004)
'size' =FTFx_PSECTOR_SIZE (0x400)
Dữ liệu đầu ra mong đợi: Trả về lỗi FTFx_ERR_RANGE
Trƣờng hợp 2: FlashEraseSector() sẽ trả về lỗi nếu địa chỉ vùng PFlash được
truyền vào không align theo sector size. Tức là địa chỉ đó không chia hết cho 0x400– kích thước của 1 sector.
Dữ liệu đầu vào:
'destination' = PFLASH_START_ADDR + 2*FTFx_PSECTOR_SIZE + 1 (ví dụ: 0x00000801 hoặc 0x00000802,…)
'size' = FTFx_PSECTOR_SIZE (0x400)
Dữ liệu đầu ra mong đợi: Trả về lỗi FTFx_ERR_ADDR
Trƣờng hợp 3: FlashEraseSector() sẽ trả về lỗi nếu kích thước vùng PFlash mà
người dùng muốn xóa được truyền vào không align theo sector size. Tức là kích thước (size) đó không chia hết cho 0x400 – kích thước của 1 sector.
Dữ liệu đầu vào:
'destination' = PFLASH_START_ADDR + 2*FTFx_PSECTOR_SIZE
'size' = FTFx_PSECTOR_SIZE + 1 (0x401) Dữ liệu đầu ra mong đợi: Trả về lỗi FTFx_ERR_SIZE
Trƣờng hợp 4: FlashEraseSector() sẽ trả về lỗi nếu kích thước vùng PFlash mà
người dùng muốn xóa được truyền vào là không hợp lệ. Tức là kích thước đó cộng với „destination‟ vượt quá giới hạn của vùng PFlash (kích thước vùng PFlash là 256KB – 0x40000)
Dữ liệu đầu vào:
'destination' = PFLASH_START_ADDR
'size' = PBLOCK_SIZE + FTFx_PSECTOR_SIZE (0x40400) Dữ liệu đầu ra mong đợi: Trả về lỗi FTFx_ERR_ RANGE
Trƣờng hợp 5: FlashEraseSector() sẽ trả về FTFx_OK nếu người dùng muốn
xóa vùng PFlash với kích thước = 0. Tức là truyền vào size = 0
'destination' = PFLASH_START_ADDR
'size' = 0x0
Dữ liệu đầu ra mong đợi: Trả về FTFx_OK
Trƣờng hợp 6: FlashEraseSector() sẽ trả về FTFx_OK nếu tất cả các tham số
truyền vào là hợp lệ và vùng PFlash mà người dùng muốn xóa ở trạng thái không bị bảo vệ - unprotected.
Dữ liệu đầu vào:
'destination' = PFLASH_START_ADDR + 2*FTFx_PSECTOR_SIZE
'size' = FTFx_PSECTOR_SIZE Dữ liệu đầu ra mong đợi: Trả về FTFx_OK
Trƣờng hợp 7: FlashEraseSector() sẽ trả về lỗi nếu vùng PFlash mà người
dùng muốn xóa ở trạng thái bảo vệ - protected.
Dữ liệu đầu vào:
'destination' = PFLASH_START_ADDR + 2*FTFx_PSECTOR_SIZE
'size' = 3*FTFx_PSECTOR_SIZE
Thiết lập trạng thái bảo vệ cho 1 số sector có thể dùng hàm PflashSetProtection()
Dữ liệu đầu ra mong đợi: Trả về lỗi FTFx_ERR_PVIOL
Vậy là tôi đã thiết kế được 7 trường hợp kiểm thử cho hàm FlashEraseSector, xác định được thông số đầu vào và dữ liệu đầu ra mong đợi cho từng trường hợp của hàm FlashEraseSector. Áp dụng như trên tôi tiến hành thiết kế các trường hợp kiểm thử cho các hàm khác của phần mềm SSD chi tiết các trường hợp kiểm thử của từng hàm xin xem phần phụ lục B. Trong đó hàm FlashCommandSequence() được các hàm khác gọi tới nên không cần xây dựng tập test case riêng cho hàm này nữa. Hai hàm PFlashGetProtection(), PflashSetProtection() được gộp chung trong một bộ test case.