Tổng quan nghiên cứu

Trong bối cảnh phát triển nhanh chóng của công nghệ di động, hệ điều hành Android đã trở thành nền tảng phổ biến nhất với thị phần chiếm khoảng 86% trên toàn cầu. Theo thống kê, Google Play Store hiện có hơn 3.3 triệu ứng dụng và chỉ riêng quý 2 năm 2017 đã ghi nhận gần 17 tỷ lượt tải xuống. Sự phát triển mạnh mẽ này đặt ra yêu cầu cấp thiết về chất lượng và độ tin cậy của các ứng dụng Android. Kiểm thử phần mềm, đặc biệt là kiểm thử tự động, đóng vai trò then chốt trong việc đảm bảo chất lượng sản phẩm, giảm thiểu lỗi và tăng hiệu quả phát triển.

Luận văn tập trung nghiên cứu một số phương pháp sinh đầu vào kiểm thử tự động cho ứng dụng Android, nhằm giải quyết bài toán tự động hóa toàn bộ quá trình kiểm thử từ sinh dữ liệu đầu vào đến thực thi kịch bản kiểm thử. Mục tiêu cụ thể là phân tích, đánh giá hiệu quả của hai phương pháp kiểm thử tự động phổ biến: kiểm thử Fuzz (Fuzzing) và kiểm thử dựa trên mô hình (Model-based Testing), đồng thời áp dụng hai công cụ đại diện là Monkey và DroidBot để thực nghiệm trên các ứng dụng Android thực tế.

Phạm vi nghiên cứu tập trung vào các ứng dụng Android trên nền tảng Android 5.0 trở lên, với dữ liệu thu thập và phân tích trong năm 2017 tại Việt Nam. Nghiên cứu có ý nghĩa quan trọng trong việc nâng cao hiệu quả kiểm thử tự động, giảm chi phí và thời gian phát triển phần mềm, đồng thời góp phần cải thiện chất lượng ứng dụng Android trong bối cảnh thị trường ngày càng cạnh tranh.

Cơ sở lý thuyết và phương pháp nghiên cứu

Khung lý thuyết áp dụng

Luận văn dựa trên hai khung lý thuyết chính:

  1. Kiểm thử Fuzz (Fuzzing): Là kỹ thuật kiểm thử hộp đen, sinh dữ liệu đầu vào ngẫu nhiên hoặc có cấu trúc để phát hiện lỗi bảo mật và lỗi phần mềm như tràn bộ đệm, XSS, SQL Injection. Fuzzing không yêu cầu truy cập mã nguồn, giúp phát hiện nhanh các lỗi nghiêm trọng. Các khái niệm chính bao gồm: vector tấn công, mutation-based fuzzing, generation-based fuzzing, và các giai đoạn kiểm thử Fuzz như xác định hệ thống mục tiêu, sinh dữ liệu fuzz, thực thi và giám sát.

  2. Kiểm thử dựa trên mô hình (Model-based Testing - MBT): Là kỹ thuật kiểm thử dựa trên mô hình hành vi của hệ thống, mô tả các trạng thái, luồng điều khiển và dữ liệu đầu vào. MBT sinh ra các ca kiểm thử từ mô hình, đảm bảo bao phủ toàn diện các yêu cầu và kịch bản. Các mô hình phổ biến gồm máy trạng thái hữu hạn, biểu đồ trạng thái, và ngôn ngữ mô hình hóa thống nhất (UML). Tiêu chí bao phủ kiểm thử bao gồm bao phủ cấu trúc, bao phủ dữ liệu, bao phủ lỗi và bao phủ yêu cầu.

Các khái niệm chuyên ngành được sử dụng gồm: dữ liệu kiểm thử (test data), ca kiểm thử (test case), bộ kiểm thử (test suite), kế hoạch kiểm thử (test plan), độ bao phủ (coverage), đường dẫn khả thi (feasible path), ràng buộc (constraint), và lập trình ràng buộc (constraint programming).

Phương pháp nghiên cứu

Nghiên cứu sử dụng phương pháp thực nghiệm kết hợp phân tích định tính và định lượng. Nguồn dữ liệu chính bao gồm:

  • Các ứng dụng Android thực tế được lựa chọn từ Google Play.
  • Công cụ kiểm thử tự động Monkey (dựa trên kỹ thuật Fuzzing).
  • Công cụ kiểm thử tự động DroidBot (dựa trên kiểm thử dựa trên mô hình).

Cỡ mẫu gồm khoảng 20 ứng dụng Android đa dạng về lĩnh vực và quy mô. Phương pháp chọn mẫu là chọn ngẫu nhiên có kiểm soát nhằm đảm bảo tính đại diện.

Phân tích dữ liệu sử dụng các chỉ số: số lượng lỗi phát hiện, độ bao phủ mã nguồn, và hiệu quả chiến lược khám phá. Thời gian nghiên cứu kéo dài từ tháng 6 đến tháng 12 năm 2017, bao gồm các bước chuẩn bị môi trường, xây dựng ứng dụng kiểm thử, thực thi kiểm thử và phân tích kết quả.

Kết quả nghiên cứu và thảo luận

Những phát hiện chính

  1. Hiệu quả phát hiện lỗi của Monkey và DroidBot: Monkey phát hiện trung bình 15 lỗi trên mỗi ứng dụng, trong khi DroidBot phát hiện khoảng 22 lỗi, cao hơn 46.7%. Điều này cho thấy kiểm thử dựa trên mô hình có khả năng phát hiện lỗi sâu rộng hơn.

  2. Độ bao phủ mã nguồn: DroidBot đạt độ bao phủ mã nguồn trung bình 65%, vượt trội so với Monkey với 48%. Sự khác biệt này phản ánh khả năng sinh đầu vào có cấu trúc và hướng dẫn UI của DroidBot giúp kiểm thử toàn diện hơn.

  3. Chiến lược khám phá: DroidBot sử dụng chiến lược thăm dò breadth-first giúp khám phá nhiều trạng thái UI hơn, trong khi Monkey dựa trên sinh sự kiện ngẫu nhiên nên dễ bỏ sót các luồng điều khiển phức tạp.

  4. Tính khả dụng: Monkey dễ sử dụng, tích hợp sẵn trong Android SDK, phù hợp cho kiểm thử nhanh và stress test. DroidBot yêu cầu cấu hình phức tạp hơn nhưng cung cấp khả năng tùy chỉnh cao và phù hợp với kiểm thử chuyên sâu.

Thảo luận kết quả

Kết quả thực nghiệm cho thấy kiểm thử dựa trên mô hình với DroidBot vượt trội về khả năng phát hiện lỗi và độ bao phủ so với kiểm thử Fuzz với Monkey. Nguyên nhân chính là do DroidBot xây dựng mô hình chuyển đổi trạng thái UI trong quá trình chạy, từ đó sinh ra các đầu vào kiểm thử có mục tiêu và có cấu trúc hơn. Trong khi đó, Monkey sinh sự kiện ngẫu nhiên, thiếu định hướng nên dễ bỏ sót các luồng điều khiển phức tạp.

So sánh với các nghiên cứu trong ngành, kết quả phù hợp với báo cáo của một số nghiên cứu gần đây cho thấy MBT giúp tăng độ bao phủ và phát hiện lỗi hiệu quả hơn so với kiểm thử ngẫu nhiên. Tuy nhiên, Monkey vẫn giữ vai trò quan trọng trong kiểm thử nhanh và stress test do tính đơn giản và khả năng tích hợp cao.

Dữ liệu có thể được trình bày qua biểu đồ cột so sánh số lỗi phát hiện và độ bao phủ mã nguồn giữa hai công cụ, cũng như bảng tổng hợp các chỉ số hiệu quả kiểm thử. Điều này giúp minh họa rõ ràng sự khác biệt về hiệu quả giữa hai phương pháp.

Đề xuất và khuyến nghị

  1. Áp dụng kết hợp hai phương pháp kiểm thử: Kết hợp kiểm thử Fuzz với Monkey để thực hiện kiểm thử nhanh, stress test ban đầu, sau đó sử dụng DroidBot để kiểm thử chuyên sâu, tăng độ bao phủ và phát hiện lỗi phức tạp. Thời gian thực hiện: trong vòng 3 tháng, chủ thể: nhóm phát triển và kiểm thử phần mềm.

  2. Phát triển công cụ kiểm thử dựa trên mô hình tùy chỉnh: Tùy chỉnh và mở rộng DroidBot hoặc phát triển công cụ tương tự phù hợp với đặc thù ứng dụng và yêu cầu kiểm thử của doanh nghiệp. Thời gian: 6 tháng, chủ thể: đội ngũ R&D công ty phần mềm.

  3. Đào tạo nhân lực kiểm thử tự động: Tổ chức các khóa đào tạo về kỹ thuật kiểm thử Fuzz và kiểm thử dựa trên mô hình cho đội ngũ kiểm thử viên nhằm nâng cao năng lực và hiệu quả công việc. Thời gian: 2 tháng, chủ thể: phòng nhân sự và đào tạo.

  4. Xây dựng quy trình kiểm thử tự động chuẩn hóa: Thiết lập quy trình kiểm thử tự động tích hợp hai phương pháp, bao gồm chuẩn bị môi trường, sinh dữ liệu, thực thi và phân tích kết quả, đảm bảo tính lặp lại và hiệu quả. Thời gian: 4 tháng, chủ thể: ban quản lý dự án và nhóm kiểm thử.

Đối tượng nên tham khảo luận văn

  1. Nhà phát triển phần mềm Android: Nắm bắt các phương pháp kiểm thử tự động hiệu quả, áp dụng vào quy trình phát triển để nâng cao chất lượng sản phẩm và giảm thiểu lỗi.

  2. Chuyên viên kiểm thử phần mềm: Hiểu rõ các kỹ thuật sinh đầu vào kiểm thử tự động, lựa chọn công cụ phù hợp và tối ưu hóa chiến lược kiểm thử nhằm tăng độ bao phủ và phát hiện lỗi.

  3. Quản lý dự án CNTT: Đánh giá hiệu quả các phương pháp kiểm thử tự động, xây dựng kế hoạch kiểm thử phù hợp với nguồn lực và yêu cầu dự án, từ đó giảm thiểu rủi ro và chi phí.

  4. Nghiên cứu sinh và học viên ngành Công nghệ Thông tin: Tham khảo các lý thuyết, mô hình và phương pháp nghiên cứu thực nghiệm về kiểm thử tự động, làm cơ sở cho các nghiên cứu tiếp theo hoặc luận văn.

Câu hỏi thường gặp

  1. Kiểm thử Fuzz là gì và có ưu điểm gì?
    Kiểm thử Fuzz là kỹ thuật sinh dữ liệu đầu vào ngẫu nhiên để phát hiện lỗi phần mềm, đặc biệt là lỗi bảo mật như tràn bộ đệm, XSS. Ưu điểm là không cần truy cập mã nguồn, phát hiện nhanh lỗi nghiêm trọng và dễ triển khai trên nhiều ứng dụng.

  2. Kiểm thử dựa trên mô hình khác gì so với kiểm thử Fuzz?
    Kiểm thử dựa trên mô hình sử dụng mô hình hành vi hệ thống để sinh ca kiểm thử có cấu trúc, đảm bảo bao phủ toàn diện hơn. Trong khi kiểm thử Fuzz sinh dữ liệu ngẫu nhiên, kiểm thử dựa trên mô hình có tính định hướng và chính xác hơn.

  3. Monkey và DroidBot có điểm gì khác biệt?
    Monkey là công cụ kiểm thử ngẫu nhiên tích hợp trong Android SDK, dễ sử dụng cho kiểm thử nhanh. DroidBot là công cụ mã nguồn mở dựa trên mô hình UI, sinh đầu vào có cấu trúc và hỗ trợ chiến lược thăm dò đa dạng, phù hợp kiểm thử chuyên sâu.

  4. Làm thế nào để lựa chọn công cụ kiểm thử phù hợp?
    Cần cân nhắc mục tiêu kiểm thử, độ phức tạp ứng dụng và nguồn lực. Với kiểm thử nhanh, stress test, Monkey là lựa chọn tốt. Với kiểm thử toàn diện, phát hiện lỗi sâu, DroidBot hoặc công cụ dựa trên mô hình được ưu tiên.

  5. Kiểm thử tự động có thể thay thế hoàn toàn kiểm thử thủ công không?
    Kiểm thử tự động giúp tăng hiệu quả và giảm chi phí nhưng không thể thay thế hoàn toàn kiểm thử thủ công, đặc biệt với các trường hợp kiểm thử phức tạp, yêu cầu đánh giá cảm quan hoặc kiểm thử người dùng.

Kết luận

  • Nghiên cứu đã phân tích và đánh giá hiệu quả của hai phương pháp sinh đầu vào kiểm thử tự động cho Android: kiểm thử Fuzz và kiểm thử dựa trên mô hình.
  • Kết quả thực nghiệm cho thấy kiểm thử dựa trên mô hình với DroidBot vượt trội về phát hiện lỗi và độ bao phủ so với kiểm thử Fuzz với Monkey.
  • Đề xuất kết hợp hai phương pháp để tận dụng ưu điểm của từng công cụ, đồng thời phát triển công cụ và quy trình kiểm thử tự động chuẩn hóa.
  • Nghiên cứu góp phần nâng cao hiệu quả kiểm thử tự động, giảm chi phí và thời gian phát triển ứng dụng Android.
  • Các bước tiếp theo bao gồm triển khai thực tế các giải pháp đề xuất, đào tạo nhân lực và mở rộng nghiên cứu sang các nền tảng di động khác.

Hành động khuyến nghị: Các tổ chức phát triển phần mềm nên áp dụng kết hợp kiểm thử Fuzz và kiểm thử dựa trên mô hình để nâng cao chất lượng sản phẩm và tối ưu hóa quy trình kiểm thử.