State-Based Testing Là Gì?
Kiểm thử dựa trên trạng thái – State-based testing (hay State Transition Testing) là một loại kiểm thử phần mềm dựa trên sự chuyển đổi giữa các trạng thái của hệ thống. Trong phương pháp này, hệ thống được xem xét như một tập hợp các trạng thái và các sự kiện (events) hoặc hành động (actions) có thể xảy ra, và kiểm thử được thiết kế để kiểm tra các sự chuyển trạng thái và hành vi của hệ thống trong mỗi trường hợp chuyển đổi.
Kiểm thử dựa vào trạng thái có thể sử dụng làm một quy trình chính thức để lấy các thử nghiệm từ mô hình. Để đạt được phạm vi bao phủ trạng thái/chuyển tiếp, quy trình lấy thử nghiệm đảm bảo các quy tắc sau đây:
- Các bước kiểm tra phải có nơi bắt đầu và nơi kết thúc. Bởi trong các tình huống mà trạng thái ban đầu và trạng thái kết thúc giống nhau, bạn có thể muốn cho phép các chuỗi trạng thái và chuyển tiếp đi qua trạng thái ban đầu nhiều lần.
- Từ trạng thái ban đầu kiểm thử, hãy xác định chuỗi kết hợp sự kiện/điều kiện dẫn đến trạng thái kết thúc. Đối với mỗi quá trình chuyển đổi, hãy xác định hành động dự kiến mà hệ thống sẽ thực hiện. Đây là kết quả mong đợi.
- Khi truy cập từng trạng thái và duyệt qua từng chuyển đổi, hãy đánh dấu trạng thái đó đã được đảm bảo. Cách dễ nhất là in sơ đồ chuyển đổi trạng thái và sau đó đánh dấu từng nút và mũi tên đã đã được kiểm thử.
- Lặp lại bước 2, 3 cho đến khi tất cả các trạng thái đã được truy cập và tất cả các chuyển tiếp được kiểm thử. Nói cách khác, mọi nút và mũi tên đã được đánh dấu hết.
Xây Dựng Test Case Dựa Vào Sơ Đồ Chuyển Đổi Trạng Thái
Hình dưới đây mô tả sơ đồ chuyển đổi trạng thái mua sắm trực tuyến từ một ứng dụng thương mại điện tử. Nó cho thấy sự tương tác của hệ thống với khách hàng, từ quan điểm của khách hàng.
Áp dụng kỹ thuật kiểm thử dựa vào trạng thái cho ứng dụng thương mại điện tử bên trê, chúng ta có quy tắc một test case phải xác định trạng thái bắt đầu và trạng thái kết thúc. Tiếp theo, hãy tạo test case đầu tiên:
- (browsing, click link, display, add to cart, selection dialog, continue shopping, display, add to cart, selection dialog, checkout, login dialog, login[bad], error, login[good], purchase dialog, purchase[bad], error, purchase[good], confirmation, resume shopping, display, abandon, left)
Bạn có thể dễ dàng quan sát các trạng thái và chuyển đổi đã được kiểm thử trong sơ đồ bên trên bởi chúng đã được đánh dấu bằng nét đứt. Theo đó, sau kiểm thử này, hầu hết các trạng thái và chuyển đổi đã được đề cập, nhưng không phải tất cả. Chúng ta cần tạo thêm một số test case nữa:
- (browsing, add to cart, selection dialog, abandon, <no action>, left)
- (browsing, add to cart, selection dialog, checkout, login dialog, abandon, <no action>, left)
- (browsing, add to cart, selection dialog, checkout, login dialog, login[good], purchase dialog, abandon, <no action>, left)
- (browsing, add to cart, selection dialog, continue shopping, display, add to cart, selection dialog, checkout, login dialog, login[good], purchase dialog, purchase[good], confirmation, go elsewhere, <no action>, left)
Switch Coverage Là Gì?
Switch coverage đề cập đến mức độ mà tất cả các sự chuyển trạng thái hoặc các trường hợp chuyển đổi đều được kiểm tra trong quá trình kiểm thử. Nó đảm bảo rằng tất cả các kịch bản chuyển đổi có thể xảy ra đều đã được kiểm tra một cách toàn diện.
Tiếp tục với ứng dụng mua sắm trực tuyến đề cập bên trên. Hình vẽ dưới đây mô tả cách chúng ta có thể tạo chuỗi chuyển tiếp bằng cách sử dụng khái niệm về phạm vi chuyển đổi – switch coverage.
Ở phía trên của hình, bạn sẽ thấy quá trình chuyển đổi giống như trước đây. Ngoại trừ việc thay thế các nhãn trạng thái và chuyển đổi bằng các chữ cái và số. Bảng chứa 2 loại cột. Một chứa các cặp trạng thái/chuyển tiếp mà chúng đa phải bao phủ để đạt được mức bao phủ 0-switch. Cột 1-switch phức tạp hơn một chút.
Với một tập hợp trạng thái/chuyển đổi tuần tự như được trình bày, bất kể là 0-switch, 1-switch, 2-switch thậm trí cao hơn. Làm cách nào để chúng ta xây dựng bộ test case để bao phủ các chuỗi đó và đạt được mức độ bao phủ mong muốn? Một lần nữa, chúng ta sẽ xây dựng dựa trên một tập hợp các thử nghiệm hiện có được tạo từ sơ đồ chuyển đổi trạng thái:
- Bắt đầu với một tập hợp các kiểm thử (bao gồm quy tắc trạng thái bắt đầu và kết thúc), xuất phát từ sơ đồ chuyển đổi trạng thái, đạt được phạm vi bao phủ trạng thái/chuyển đổi.
- Xây dựng bảng chuyển đổi bằng cách sử dụng kỹ thuật được hiển thị trước đó. Khi bạn đã có, hãy xác nhận rằng các bài kiểm tra bao gồm tất cả các ô trong cột 0-switch.
- Bây giờ, sử dụng các trình tự 0-switch nếu cần, xây dựng một thử nghiệm đạt đến trạng thái mà từ đó một trình tự chuyển đổi bậc cao hơn. Kiểm tra xem trạng thái này khiến bạn rơi vào trạng thái nào. Lý tưởng nhất là một trình tự chuyển đổi bậc cao chưa được khám phá khác bắt nguồn từ trạng thái này, nhưng nếu không, hãy xem liệu bạn có thể sử dụng trình tự 0-switch để đạt đến trạng thái như vậy hay không. Bạn đang lục lọi trong sơ đồ chuyển đổi trạng thái để tìm cách che phủ trình tự bậc cao hơn. Lặp lại điều này cho bài kiểm tra hiện tại cho đến khi bài kiểm tra phải kết thúc.
- Khi bạn xây dựng test case, hãy đánh dấu các trình tự chuyển đổi là được bao gồm sau khi bạn đưa chúng vào một bài kiểm tra.
- Lặp lại bước 3 và 4 cho đến khi tất cả các trình tự chuyển đổi đã được thực hiện.
Kỹ thuật này để tạo ra các bài kiểm thử về phạm vi chuyển đổi bậc cao hơn. Tuy nhiên, nếu điều quan trọng nhất là tạo số lượng test case tối thiểu, thì bạn nên tìm cách giảm số lượng bài kiểm tra đã tạo hoặc sửa đổi các quy trình phái sinh được đưa ra ở đây để bắt đầu lại từ đầu thay vì xây dựng dựa trên một tập hợp các bài kiểm tra 0-switch hiện có.
Chúng ta cần đề cập đôi điều về thuật toán này để đưa ra các thử nghiệm bao phủ chuyển đổi bậc cao hơn, cũng như thuật toán được đưa ra trước đây cho các thử nghiệm bao phủ hàng. Cả hai đều được xây dựng trên một bộ thử nghiệm hiện có để đạt được mức độ bao phủ trạng thái/chuyển tiếp. Điều đó hiệu quả từ quan điểm thiết kế thử nghiệm. Nó cũng thận trọng từ quan điểm thực hiện kiểm thử vì chúng ta đề cập đến những nội dung ít thách thức hơn trước rồi mới chuyển sang những bài kiểm tra khó hơn. Tuy nhiên, rất có thể, bắt đầu từ đầu, một tập hợp thử nghiệm nhỏ hơn có thể được xây dựng, cho cả tình huống bao phủ hàng và tình huống bao phủ 1-switch. Nếu điều quan trọng nhất là tạo ra số lượng thử nghiệm tối thiểu thì bạn nên tìm cách giảm bớt các thử nghiệm được tạo hoặc sửa đổi các quy trình phái sinh được đưa ra ở đây để bắt đầu lại từ đầu thay vì xây dựng trên một bộ thử nghiệm 0-switch hiện có .
Khả Năng Áp Dụng
Kiểm tra chuyển đổi trạng thái có thể áp dụng cho bất kỳ phần mềm nào đã xác định trạng thái và có các sự kiện sẽ gây ra sự chuyển đổi giữa các trạng thái đó (ví dụ: thay đổi màn hình). Kiểm tra chuyển đổi trạng thái có thể được sử dụng ở bất kỳ cấp độ kiểm tra nào. Phần mềm nhúng, phần mềm web và bất kỳ loại phần mềm giao dịch nào đều là những ứng cử viên sáng giá cho loại thử nghiệm này. Các hệ thống điều khiển, ví dụ như bộ điều khiển đèn giao thông, cũng là những ứng cử viên sáng giá cho loại thử nghiệm này.
Hạn Chế/ Khó Khăn
Xác định các trạng thái thường là phần khó khăn nhất trong việc xác định sơ đồ chuyển trạng thái hoặc bảng chuyển trạng thái. Khi đối tượng thử nghiệm có giao diện người dùng, các màn hình khác nhau được hiển thị cho người dùng thường được biểu thị bằng các trạng thái. Đối với phần mềm nhúng, các trạng thái có thể phụ thuộc vào trạng thái của phần cứng.
Ngoài các trạng thái, đơn vị cơ bản của thử nghiệm chuyển đổi trạng thái là chuyển đổi riêng lẻ. Đơn giản chỉ cần kiểm tra tất cả các chuyển đổi đơn lẻ sẽ tìm thấy một số loại lỗi chuyển đổi trạng thái, nhưng có thể tìm thấy nhiều lỗi hơn bằng cách kiểm tra các chuỗi chuyển đổi. Một chuyển đổi duy nhất được gọi là 0-switch; một chuỗi gồm hai lần chuyển tiếp liên tiếp được gọi là 1-switch; một chuỗi gồm ba lần chuyển đổi liên tiếp được gọi là 2-switch, v.v. Nói chung, N-switch đại diện cho N+1 lần chuyển tiếp liên tiếp. Với việc N tăng lên, số lượng N-switch tăng rất nhanh, gây khó khăn cho việc đạt được phạm vi phủ sóng của N-switch với số lượng thử nghiệm nhỏ, hợp lý.
Mức Độ Bao Phủ
Giống như các loại kỹ thuật kiểm thử khác, có một hệ thống phân cấp về mức độ bao phủ. Mức độ bao phủ tối thiểu được chấp nhận là đã kiểm tra mọi trạng thái và vượt qua mọi quá trình chuyển đổi ít nhất một lần.
Phạm vi chuyển đổi 100% (còn được gọi là phạm vi 0-switch 100%) sẽ đảm bảo rằng mọi trạng thái đều được truy cập và mọi chuyển đổi đều được đi qua, trừ khi thiết kế hệ thống hoặc mô hình chuyển đổi trạng thái (sơ đồ hoặc bảng) bị lỗi. Tùy thuộc vào mối quan hệ giữa các trạng thái và chuyển đổi, có thể cần phải duyệt qua một số chuyển đổi nhiều lần để thực hiện các chuyển đổi khác cùng một lúc.
Thuật ngữ “phạm vi bao phủ của N-switch” liên quan đến số lượng thiết bị chuyển mạch được bao phủ có độ dài N+1, tính bằng phần trăm của tổng số thiết bị chuyển mạch có độ dài đó. Ví dụ: để đạt được phạm vi phủ sóng 100% 1-switch yêu cầu mọi chuỗi hợp lệ của hai lần chuyển đổi liên tiếp đã được thử nghiệm ít nhất một lần. Thử nghiệm này có thể gây ra một số loại lỗi mà phạm vi bao phủ 0-switch 100% sẽ bỏ qua.
“Round-trip coverage” áp dụng cho các tình huống trong đó chuỗi chuyển tiếp tạo thành vòng lặp. Đạt được phạm vi bao phủ roundtrip 100% khi tất cả các vòng lặp từ bất kỳ trạng thái nào trở về cùng trạng thái đã được kiểm tra cho tất cả các trạng thái mà vòng lặp bắt đầu và kết thúc. Vòng lặp này không thể chứa nhiều hơn một lần xuất hiện của bất kỳ trạng thái cụ thể nào (ngoại trừ trạng thái ban đầu/cuối cùng).
Đối với bất kỳ cách tiếp cận nào trong số này, mức độ bao phủ thậm chí còn cao hơn sẽ cố gắng bao gồm tất cả các chuyển đổi không hợp lệ được xác định trong bảng chuyển đổi trạng thái. Yêu cầu về phạm vi kiểm tra chuyển đổi trạng thái phải xác định xem có bao gồm các chuyển đổi không hợp lệ hay không. Việc thiết kế các trường hợp thử nghiệm để đạt được phạm vi mong muốn được hỗ trợ bởi sơ đồ chuyển đổi trạng thái hoặc bảng chuyển đổi trạng thái cho đối tượng thử nghiệm cụ thể. Thông tin này cũng có thể được trình bày trong bảng hiển thị các chuyển đổi N-switch cho một giá trị cụ thể của N.
Quy trình thủ công có thể được áp dụng để xác định các mục cần đề cập (ví dụ: chuyển tiếp, trạng thái hoặc N-switches). Một phương pháp được đề xuất là in sơ đồ chuyển trạng thái và bảng chuyển trạng thái rồi sử dụng bút mực hoặc bút chì để đánh dấu các mục được đề cập cho đến khi phạm vi được yêu cầu hiển thị. Cách tiếp cận này sẽ trở nên quá tốn thời gian đối với các sơ đồ và bảng chuyển trạng thái phức tạp hơn. Do đó, nên sử dụng một công cụ để hỗ trợ kiểm tra chuyển đổi trạng thái.
Loại Lỗi Phát Hiện
Các khuyết tật điển hình bao gồm:
- Loại sự kiện hoặc giá trị không chính xác
- Loại hành động hoặc giá trị không chính xác
- Trạng thái ban đầu không chính xác
- Không thể đạt được một số trạng thái thoát
- Không thể vào các trạng thái bắt buộc
- Các trạng thái bổ sung (không cần thiết)
- Không thể thực hiện chính xác một số chuyển đổi hợp lệ
- Khả năng thực hiện các chuyển đổi không hợp lệ
- Điều kiện bảo vệ sai
Trong quá trình tạo mô hình chuyển trạng thái, các lỗi có thể được tìm thấy trong tài liệu đặc tả. Các loại khiếm khuyết phổ biến nhất là thiếu sót (tức là không có thông tin về điều gì sẽ thực sự xảy ra trong một tình huống nhất định) và mâu thuẫn.