Đối với những người mới vào nghành phát triển phần mềm, thuật ngữ “test case” thường còn khá xa lạ. Vậy test case là gì? Làm thế nào để tạo test case chất lượng? Bài viết dưới đây sẽ cung cấp các chi tiết về vấn đề này.
Test case là gì?
Test case, hay còn được gọi là kịch bản kiểm thử, được sử dụng để kiểm tra những tình huống có thể xảy ra trong quá trình sử dụng phần mềm hoặc chức năng của phần mềm, từ đó xác định xem chúng hoạt động đúng hay không.
Một test case mô tả các yếu tố sau:
- Dữ liệu đầu vào (Input)
- Hành động hoặc sự kiện (Action/Event)
- Kết quả dự kiến (Expected response)
Mức độ chi tiết của một bộ test case phụ thuộc vào ngữ cảnh dự án và quy mô công ty sản xuất phần mềm.
Test case thường được phát triển trên các công cụ như Excel và Word. Việc chuẩn bị test case càng sớm giúp phát hiện lỗi nhanh chóng và rút ngắn thời gian thiết kế phần mềm.
Vai trò của test case
Vai trò chính của test case là đảm bảo tính năng của phần mềm hoặc chức năng được thiết kế hoạt động đúng như mong đợi. Đây là bước quan trọng đầu tiên trong quá trình kiểm thử mà mọi tester đều cần thực hiện. Nếu việc xây dựng test case không đảm bảo chất lượng, có thể gây ra sai sót và ảnh hưởng đến các bước kiểm thử tiếp theo.
Bên cạnh vai trò chính này, test case còn có vai trò quan trọng trong việc:
- Đảm bảo phạm vi kiểm thử.
- Phát hiện các lỗi, bug, thiếu sót trong tính năng và giúp cải thiện chất lượng phần mềm. Quá trình vận hành, bảo trì và cập nhật dễ dàng hơn.
- Giúp xác định liệu phần mềm đã đáp ứng đầy đủ các yêu cầu của người dùng hay chưa. Nếu chưa, lập trình viên có thể xem xét và sửa lại trước khi đưa sản phẩm ra thị trường.
- Tester có thể thực hiện nhiều test case cùng lúc để có cái nhìn toàn diện về phần mềm.
- Test case có thể được tái sử dụng vô tận trong tương lai, miễn là tester cảm thấy phù hợp.
Cấu trúc của một test case
Để thực hành thành thạo việc tạo test case, bạn cần hiểu rõ cấu trúc của một bản kiểm thử bao gồm những thành phần nào. Mặc dù cấu trúc test case có thể khác nhau tùy thuộc vào dự án và công ty, nhưng dưới đây là các thành phần chính mà bạn có thể gặp khi xây dựng test case:
- ID test case: Giá trị dùng để xác định thứ tự của test case. ID có thể bao gồm chữ và số được đánh dấu theo thứ tự tăng dần.
- Mô tả test case: Mô tả mục đích của test case là kiểm tra chức năng nào. Ở mục này, Tester sẽ mô tả công việc thực hiện.
- Dữ liệu kiểm thử: Dữ liệu cần chuẩn bị để thực hiện việc kiểm thử, có thể có hoặc không tùy thuộc vào quy mô dự án. Dữ liệu có thể được lưu dưới dạng tên hoặc đường dẫn tới file.
- Các bước thực hiện: Mô tả các bước thực hiện kiểm thử chi tiết. Tuy nhiên, Tester nên mô tả một cách ngắn gọn và rõ ràng. Đồng thời không bỏ qua các sự kiện thiết yếu để có thể thực hiện lại khi có lỗi xảy ra.
- Kết quả mong đợi: Hiển thị kết quả mong đợi từ các bước kiểm thử. Kết quả mong đợi thường dựa trên yêu cầu của khách hàng hoặc tài liệu chuyên môn.
- Kết quả thực tế: Hiển thị kết quả thực tế từ các bước kiểm thử trên môi trường hệ thống, thường là “pass”, “fail” hoặc “pending”.
Những nhóm chính của test case
Hiện nay, test case được chia thành 4 nhóm chính sau:
- GUI test case: Bao gồm tất cả các test case được xây dựng để kiểm tra giao diện người dùng đồ họa.
- Positive test case: Bao gồm các test case tích cực, những bước kiểm tra đúng và hợp lệ.
- Negative test case: Bao gồm các test case tiêu cực, các bước kiểm tra không đúng hoặc không hợp lệ.
- Combination test case: Bao gồm các test case ở giữa hai loại positive và negative. Các test case này có thể có nhiều bước đúng và sai xen kẽ, nhưng cuối cùng kết quả luôn đúng.
Những loại test case phổ biến hiện nay
Hiện nay, có nhiều loại test case khác nhau phục vụ cho các nhu cầu kiểm thử khác nhau của tester. Tùy thuộc vào giai đoạn phát triển của phần mềm mà bạn sẽ chọn loại test case phù hợp.
Test case chức năng (Functionality Test Case)
Test case chức năng giúp xác định sự thành công hoặc thất bại của một chức năng được thiết kế trong phần mềm. Những test case này yêu cầu phần mềm cho phép kiểm thử mà không cần truy cập vào cấu trúc bên trong của phần mềm.
Chúng có thể được viết và chạy sớm trong giai đoạn phát triển, ngay khi những chức năng đầu tiên đã được hoàn thành. Chúng có thể được viết bằng mã code nếu yêu cầu. Test case chức năng nên được lặp lại mỗi khi có thay đổi trong chức năng của phần mềm.
Test case giao diện người dùng (User Interface Test Case)
Test case giao diện người dùng được sử dụng để xác minh các thành phần của giao diện người dùng có hoạt động đúng như mong đợi không. Loại test case này giúp kiểm tra về cú pháp, thẩm mỹ, lỗi dịch thuật, link hoặc bất cứ thành phần nào mà người dùng có thể thấy trên giao diện.
Những test case này thường được thiết kế bởi nhóm Designer và nhóm Tester. Những test case này sẽ chạy khi phần mềm hoàn thiện, giao diện người dùng đã được kết nối với cơ sở dữ liệu để kiểm tra tính tương thích và hoạt động tốt trên nhiều trình duyệt.
Test case hiệu suất (Performance Test Case)
Test case hiệu suất được sử dụng để kiểm tra hiệu năng của phần mềm, cụ thể là thời gian phản hồi và hiệu năng hoạt động của ứng dụng. Test case này cho phép kiểm tra thời gian cần thiết để hệ thống phản hồi một hành động theo các tiêu chí rõ ràng.
Test case hiệu suất thường được Tester viết và chạy tự động trong suốt quá trình phát triển phần mềm. Chúng giúp xác định ứng dụng hoạt động thực tế như thế nào cũng như những trường hợp cụ thể mà ứng dụng không hoạt động hiệu quả. Từ đó, lập trình viên có thể xem xét để cải thiện hiệu suất ứng dụng.
Test case tích hợp (Integration Test Case)
Test case tích hợp được sử dụng để xem xét sự tương tác giữa các module với nhau. Mục đích chính của test case này là đảm bảo giao diện giữa các module tương thích và hoạt động tốt nhất trong mọi điều kiện.
Test case tích hợp thường được phối hợp xây dựng bởi nhóm Tester và nhóm Development. Tester sẽ xác định phạm vi cần kiểm thử. Trong khi đó, developer cung cấp dữ liệu đầu vào cho từng trường hợp kiểm thử. Cuối cùng, một trong hai nhóm sẽ kiểm tra xem các module hoạt động độc lập có thể tổ chức làm việc cùng nhau hay không.
Test case tính khả dụng (Usability Test Case)
Test case tính khả dụng, hay còn được gọi là task hoặc scenarios, yêu cầu Tester phải hoàn thành các nhiệm vụ hoặc kịch bản yêu cầu. Test case này giúp Tester tiếp cận và trải nghiệm sản phẩm, dịch vụ của người dùng theo cách tự nhiên nhất. Các trường hợp test được xác định bởi cả nhóm Designer – Tester và phải được triển khai trước khi tiến hành User Acceptance Test Case (Kiểm thử chấp nhận người dùng).
Test case cơ sở dữ liệu (Database Test Case)
Test case cơ sở dữ liệu được sử dụng để kiểm tra các số liệu, hướng đi trong cơ sở dữ liệu của ứng dụng. Test case này được thực hiện để đảm bảo rằng lập trình viên xử lý và lưu trữ dữ liệu trong cơ sở dữ liệu một cách nhất quán và an toàn.
Để thực hiện Test case cơ sở dữ liệu, Tester cần hiểu rõ về ứng dụng, cơ sở dữ liệu ứng dụng cũng như các quy trình cần thiết cho việc lưu trữ và quản trị dữ liệu. Thông thường, Tester sẽ sử dụng truy vấn SQL để xây dựng những test case này.
Test case bảo mật (Security Test Case)
Test case bảo mật được sử dụng để đảm bảo rằng ứng dụng được phân quyền dữ liệu và hạn chế xâm nhập ở những nơi cần thiết. Từ đó, giữ an toàn cho dữ liệu. Test case này kiểm tra thâm nhập, mức độ xác thực, mã hóa dữ liệu của ứng dụng và thường được thực hiện bởi nhóm bảo mật.
Test case chấp nhận người dùng (User Acceptance Test Case)
Test case chấp nhận người dùng được sử dụng để kiểm tra môi trường sử dụng của người dùng cuối. Mục đích của những test case này là xác minh rằng ứng dụng có thể đáp ứng được nhu cầu của người dùng ở mọi lĩnh vực. Test case này cần được xây dựng với các lĩnh vực, ngành nghề và sát nhập với thực tế nhất.
Những người thực hiện User Acceptance Test Case là quản lý dự án hoặc nhóm Tester. Đây là bước kiểm thử cuối cùng và quan trọng nhất trước khi sản phẩm được công bố và đưa vào sản xuất thực tế.
Các kỹ thuật test case điển hình
Để tạo ra test case chất lượng, bạn có thể áp dụng các kỹ thuật sau:
Kỹ thuật test case tĩnh (Static Testing Technique)
Kỹ thuật test case tĩnh là phương pháp kiểm thử thủ công thông qua giấy bút mà không cần chạy phần mềm trực tiếp. Kiểm thử tĩnh thường được thực hiện bằng tay hoặc sử dụng các công cụ kiểm thử. Quá trình này thực hiện kiểm tra code, yêu cầu kỹ thuật, tài liệu thiết kế, mã nguồn, kịch bản thử nghiệm, v.v. để đảm bảo tính chính xác và khả thi của chúng.
Các kỹ thuật test case tĩnh thông thường bao gồm:
- Đánh giá không chính thức: Mô tả quá trình kiểm thử không chính thức, trong đó tài liệu kiểm thử được xem xét và nhận xét.
- Phiên họp đánh giá: Một phương pháp chia sẻ thông tin, hướng dẫn, giải thích, truyền tải thông tin để giúp các thành viên tham gia kiểm thử hiểu rõ về phần mềm, ứng dụng. Điều này giúp họ nhận ra và phát hiện các lỗi có thể tồn tại trong phần mềm. Kỹ thuật này thường được tổ chức thành một cuộc họp và các thông tin được ghi chép và lưu trữ lại.
- Thanh tra: Phương pháp kiểm thử tập trung vào việc đánh giá và thảo luận về các yếu tố kỹ thuật của ứng dụng, phần mềm. Điều này giúp đưa ra các phương hướng giải quyết, thay thế kỹ thuật, sửa lỗi,… để tối ưu hoá ứng dụng.
- Kiểm tra: Phương pháp kiểm thử giúp xác định những khiếm khuyết còn tồn tại. Người kiểm tra thực hiện kiểm tra xem các tài liệu công việc đã hoàn thành tới đâu.
Kỹ thuật test case động (Dynamic Testing Technique)
Kỹ thuật test case động là phương pháp kiểm thử thông qua việc sử dụng máy chạy phần mềm. Với phương pháp này, mã đã được triển khai, đầu vào đã được cung cấp và kết quả (đầu ra) đã được quan sát. Kiểm thử động so sánh kết quả thực tế này với kết quả mong đợi ban đầu để xác định xem phần mềm có đáp ứng các yêu cầu hay không.
Các kỹ thuật test case động bao gồm 3 nhóm chính sau:
1. Kỹ thuật dựa trên bản mô tả (Specification-based)
Đây là nhóm kỹ thuật kiểm thử tập trung vào các yếu tố ngoại vi như cách thiết kế, cách vận hành,… Tester có thể kiểm tra mà không ảnh hưởng đến cấu trúc bên trong của phần mềm.
Các kỹ thuật cụ thể thuộc nhóm này bao gồm:
- Phân vùng tương đương (Equivalence Partitioning): Đầu vào được chia thành các lớp dữ liệu với các điều kiện tương đương để thực hiện các ca kiểm thử.
- Phân tích giá trị biên (Boundary Value Analysis): Tester kiểm tra giá trị biên của dữ liệu vào và ra theo cách tiếp cận 2 giá trị (các test case sử dụng 4 giá trị biên) và 3 giá trị (sử dụng 6 giá trị biên).
- Bảng quyết định (Decision Table Testing): Được sử dụng khi có nhiều điều kiện vào và ra. Phương pháp này giúp tiết kiệm thời gian thực thi chương trình mà vẫn đảm bảo bao quát toàn bộ các điều kiện vào và ra.
- Chuyển đổi trạng thái (State Transition Testing): Dùng để kiểm tra các thay đổi trạng thái của phần mềm, ứng dụng dựa trên dữ liệu vào hợp lệ và không hợp lệ.
- Kiểm thử trường hợp sử dụng (Use cases Testing): Được sử dụng để xác định toàn bộ trường hợp thử đang được thực hiện trên toàn bộ hệ thống. Từ đó giúp phát hiện và khắc phục các lỗi từ việc kiểm thử tích hợp.
2. Kỹ thuật dựa trên cấu trúc (Structure-based)
Đây là nhóm kỹ thuật được sử dụng để kiểm thử cấu trúc và cách hoạt động của ứng dụng. Để thực hiện được kỹ thuật này, Tester cần am hiểu về lập trình để có thể xác định các input và output chính xác.
Những kỹ thuật dựa trên cấu trúc bao gồm:
- Kiểm thử câu lệnh (Statement testing): Tester kiểm tra cách vận hành của mã nguồn bằng cách thực thi mọi câu lệnh ít nhất một lần theo các điều kiện đúng.
- Kiểm thử quyết định (Decision testing): Được sử dụng để kiểm tra xem chương trình có câu lệnh nào không thể truy cập hoặc gây bất thường không. Tester bắt đầu từ điểm quyết định và đi theo luồng điều khiển để kiểm tra kết quả quyết định.
- Kiểm thử điều kiện (Condition testing): Sử dụng để kiểm tra các biểu thức Boolean bằng cách thực thi chúng ít nhất một lần với giá trị đúng và giá trị sai.
- Kiểm thử đa điều kiện (Multiple condition testing): Sử dụng để kiểm tra toàn bộ các tổ hợp điều kiện có thể của quyết định. Số lượng tổ hợp tương ứng với số test case cần thực hiện và được tính bằng 2 mũi thừa bậc N (N là số điều kiện).
3. Kỹ thuật dựa trên kinh nghiệm (Experience-based)
Nhóm kỹ thuật dựa trên kinh nghiệm được thiết kế dựa trên kiến thức, kinh nghiệm và năng lực chuyên môn của Tester.
Những kỹ thuật cụ thể của nhóm này bao gồm:
- Kiểm thử thăm dò (Exploratory testing): Tester thực hiện việc thăm dò phần mềm, thiết kế và thực hiện quá trình kiểm thử. Quá trình này không theo các bước cụ thể, mà tuỳ thuộc vào kinh nghiệm của từng Tester.
- Phỏng đoán lỗi (Error guessing): Tester phỏng đoán các lỗi tiềm ẩn có thể tồn tại trong phần mềm dựa trên kinh nghiệm của mình.
Hướng dẫn viết test case chất lượng
Đối với những người chưa biết cách viết test case chất lượng, bạn có thể tuân thủ theo 5 bước sau để đạt được kết quả tốt:
- Xác định mục đích: Tìm hiểu nhu cầu và mong muốn của khách hàng. Đặt ra mục tiêu và tiêu chuẩn cụ thể cho test case để giúp phần mềm đáp ứng các yêu cầu này.
- Xác định hiệu suất: Am hiểu về lập trình để xác định chức năng của module đang được kiểm thử, cách tương tác giữa thành phần trong module, v.v. Tính toán hiệu suất kiểm thử dựa trên những thông tin này.
- Xác định yêu cầu phi chức năng: Ngoài yêu cầu về phần cứng, cấu trúc hệ thống, bảo mật dữ liệu, yêu cầu phi chức năng cũng rất quan trọng với một phần mềm hoặc ứng dụng. Liệt kê tất cả các yêu cầu phi chức năng có thể xuất hiện và tiến hành kiểm thử.
- Xác định biểu mẫu: Mỗi phần mềm, ứng dụng sẽ có các biểu mẫu test case khác nhau. Tuy nhiên, nó thường chứa các yếu tố giao diện người dùng (UI), chức năng, khả năng tương thích và hiệu suất của phần mềm.
- Xác định tương tác giữa module: Hiểu rõ cách các module tương tác với nhau. Điều này giúp tối ưu quá trình test và đảm bảo rằng test case bao phủ toàn bộ các module liên kết.
Tổng kết
Test case đóng một vai trò quan trọng trong quá trình kiểm thử và yêu cầu tester tuân thủ các nguyên tắc để tiết kiệm thời gian và công sức. Khi đã sử dụng một cách thành thạo, test case là một công cụ cực kỳ hữu ích giúp phát triển phần mềm. Nếu bạn có bất kỳ câu hỏi hoặc muốn chia sẻ kinh nghiệm về việc viết test case hiệu quả, hãy để lại bình luận dưới đây để chúng ta có thể thảo luận.