Tổng quan nghiên cứu

Trong kỹ nghệ phần mềm hiện đại, hơn 80% các hệ thống thông tin doanh nghiệp được triển khai trên nền tảng ứng dụng Web, trong đó Java Enterprise Edition (Java EE) đóng vai trò là một trong những giải pháp nền tảng phổ biến nhất cho các hệ thống quy mô lớn như ngân hàng, y tế và tài chính. Tuy nhiên, theo các nghiên cứu thực nghiệm trong ngành phần mềm, hoạt động bảo trì và kiểm thử hồi quy thường chiếm tới gần 50% tổng chi phí và thời gian của toàn bộ vòng đời phát triển phần mềm. Khi phần mềm trải qua các đợt nâng cấp hoặc sửa lỗi, việc áp dụng phương pháp kiểm thử lại toàn bộ (retest-all) truyền thống gây lãng phí nghiêm trọng về tài nguyên máy chủ và nhân lực kiểm thử.

Vấn đề cốt lõi đặt ra là làm thế nào để xác định chính xác các thành phần bị tác động khi mã nguồn thay đổi, từ đó tối ưu hóa bộ ca kiểm thử hồi quy mà không bỏ sót lỗi tiềm ẩn. Nghiên cứu này giải quyết bài toán trên bằng cách phát triển phương pháp phân tích ảnh hưởng của sự thay đổi (Change Impact Analysis - CIA) toàn diện, kết nối từ tầng logic nghiệp vụ Java Core, tầng trung gian Java Servlet, tầng dữ liệu Hibernate/JDBC đến tầng giao diện người dùng JavaServer Pages (JSP).

Mục tiêu cụ thể của luận văn là hoàn thiện mô hình đồ thị phụ thuộc Java Dependency Graph (JDG), mở rộng bộ công cụ Java Change Impact Analysis (JCIA) nhằm tự động phát hiện tập thay đổi (Change Set) và tập ảnh hưởng (Impact Set), đồng thời xây dựng cơ chế tự động phân loại kiểm thử hồi quy thành kiểm thử đơn vị, kiểm thử tích hợp và kiểm thử giao diện. Nghiên cứu được thực hiện và nghiệm thu tại Trường Đại học Công nghệ – Đại học Quốc gia Hà Nội vào năm 2018, áp dụng thực nghiệm trực tiếp trên hệ thống Web Java EE Quản lý bệnh viện với 7 phân hệ chức năng chuyên sâu. Kết quả nghiên cứu chứng minh giải pháp giúp cắt giảm từ 45% đến hơn 60% số lượng ca kiểm thử cần thực thi lại, đồng thời duy trì độ bao phủ lỗi đạt 100% trên các thành phần bị ảnh hưởng.

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

Khung lý thuyết áp dụng

Nghiên cứu được xây dựng dựa trên sự tích hợp của hai nền tảng lý thuyết và mô hình kỹ thuật chính:

Thứ nhất là lý thuyết phân tích ảnh hưởng sự thay đổi (Change Impact Analysis - CIA) và thuật toán lan truyền thay đổi WAVE-CIA. Lý thuyết này cho phép định lượng mức độ tác động của một chỉnh sửa mã nguồn từ mức độ trực tiếp (Impact Level 1) đến các mức lan truyền gián tiếp (Level 2, Level 3). Để hiện thực hóa lý thuyết này, nghiên cứu áp dụng kỹ thuật Cây cấu trúc trừu tượng (Abstract Syntax Tree - AST) thông qua bộ thư viện Java Development Tools (JDT), kết hợp cấu trúc Đồ thị phụ thuộc Java EE (Java Dependency Graph - JDG) để mô hình hóa toàn bộ mối quan hệ giữa các lớp, phương thức, thuộc tính và tệp cấu hình XML.

Thứ hai là mô hình kiến trúc Model - View - Controller (MVC) trong Java Servlet và lý thuyết Đồ thị chuỗi (String Graph) phục vụ dự đoán câu truy vấn cơ sở dữ liệu động. Hệ thống khái niệm cốt lõi bao gồm:

  • Change Set (Tập thay đổi): Tập hợp các phần tử mã nguồn bị thêm mới, sửa đổi hoặc xóa bỏ giữa hai phiên bản phần mềm.
  • Impact Set (Tập ảnh hưởng): Tập hợp các thành phần mã nguồn, giao diện hoặc bảng cơ sở dữ liệu có khả năng bị tác động tiêu cực bởi các phần tử trong Change Set.
  • Object Relational Mapping (ORM): Kỹ thuật ánh xạ quan hệ đối tượng trong Hibernate, kết nối các thực thể Java với bảng dữ liệu thông qua tệp cấu hình XML và Annotation.
  • Đồ thị chuỗi (String Graph): Cấu trúc đồ thị có hướng biểu diễn sự biến đổi của chuỗi ký tự thông qua các phép toán khởi tạo (INIT) và phép toán gộp (CONCAT) nhằm giải mã chính xác các câu truy vấn JDBC động.

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

Nghiên cứu sử dụng phương pháp phân tích tĩnh mã nguồn (Static Code Analysis) kết hợp so sánh cây cấu trúc AST hai phiên bản. Cỡ mẫu thực nghiệm bao gồm toàn bộ mã nguồn của hệ thống Web Quản lý bệnh viện với hơn 16 ca kiểm thử phức tạp, hàng chục tệp JSP, lớp Java Servlet, Data Access Object (DAO), Entity và các bảng cơ sở dữ liệu quan hệ.

Phương pháp chọn mẫu là chọn mẫu có chủ đích (purposive sampling), tập trung vào các module chứa đầy đủ các tương tác đa tầng: quan hệ kế thừa, quan hệ phụ thuộc biến/hàm, cấu trúc nhúng thẻ <%@include%>, giao thức truyền nhận HTTP Request/Response qua Session, và các giao dịch xử lý tính toán tài chính phức tạp. Lý do lựa chọn phương pháp phân tích tĩnh mã nguồn là khả năng quét toàn diện 100% không gian mã nguồn mà không phụ thuộc vào trạng thái runtime của máy chủ, giúp phát hiện lỗi cấu trúc ở giai đoạn sớm nhất. Toàn bộ quy trình từ xây dựng giải thuật, phát triển phần mềm mở rộng đến đánh giá thực nghiệm được triển khai liên tục trong khung thời gian 12 tháng.

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

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

Quá trình thực nghiệm công cụ JCIA mở rộng trên hệ thống quản lý bệnh viện đã mang lại bốn phát hiện quan trọng:

Thứ nhất, công cụ đã trích xuất thành công 100% các phụ thuộc ẩn giữa giao diện JSP và mã nguồn Java Servlet. Thông qua việc phân tích tệp web.xml và Annotation @WebServlet, hệ thống tự động nhận diện chính xác các luồng dữ liệu từ thẻ <form action="LoginService"> và các câu lệnh request.getParameter(), giúp thu hẹp phạm vi ảnh hưởng giao diện xuống còn đúng 3 tệp JSP cốt lõi thay vì phải rà soát toàn bộ hàng chục trang giao diện của hệ thống.

Thứ hai, mô hình Đồ thị chuỗi (String Graph) đã giải mã thành công các câu truy vấn SQL động trong JDBC và Hibernate với độ chính xác đạt khoảng 95%. Hệ thống tự động xác định chính xác các bảng dữ liệu bị tác động sau mệnh đề FROM và JOIN, giúp các kỹ sư nhận biết ngay lập tức sự thay đổi của cấu trúc bảng dữ liệu sẽ lan truyền đến những lớp DAO và Entity nào.

Thứ ba, cơ chế phân loại tự động đã chia tách hoàn toàn các thành phần cần kiểm thử thành 3 nhóm độc lập: kiểm thử đơn vị (chiếm khoảng 40% các phương thức không có phụ thuộc ngoài), kiểm thử tích hợp (chiếm khoảng 60% các phương thức có quan hệ gọi chéo), và kiểm thử giao diện.

Thứ tư, khi thực hiện kiểm thử hồi quy cho nghiệp vụ tính tiền thuốc có bảo hiểm y tế (Health Insurance), công cụ đã giúp giảm tới 55% số lượng ca kiểm thử dư thừa, đồng thời phát hiện chính xác 100% các lỗi logic phát sinh do việc thay đổi kiểu dữ liệu từ int sang long tại các trường định danh ID.

Thảo luận kết quả

Các kết quả thực nghiệm đạt được bắt nguồn từ việc công cụ JCIA mở rộng đã giải quyết triệt để bài toán phân tích phụ thuộc đa ngôn ngữ (Polyglot Dependency Analysis) trong ứng dụng Java EE. Các công cụ quản lý phiên bản truyền thống chỉ dừng lại ở việc so sánh văn bản từng dòng lệnh, hoàn toàn không có khả năng hiểu ngữ nghĩa của mã nguồn. Ngược lại, JCIA mở rộng phân tích trực tiếp trên cây AST và duyệt hậu thứ tự, cho phép phát hiện sự thay đổi ở cấp độ thuộc tính và phương thức một cách chuẩn xác.

Để trình bày trực quan các kết quả phân tích, dữ liệu có thể được thể hiện thông qua một bảng tổng hợp đối sánh giữa hai phiên bản mã nguồn, chỉ rõ số lượng tệp trong Change Set và Impact Set cho từng phân hệ (nhân viên, bệnh nhân, đặt phòng, bán thuốc). Đồng thời, một biểu đồ cột trực quan có thể biểu diễn thời gian thực thi kiểm thử: trong khi phương pháp kiểm thử lại toàn bộ tiêu tốn 100% thời gian chạy máy, phương pháp kiểm thử hồi quy có chọn lọc dựa trên JCIA kết hợp công cụ tự động hóa Ranorex chỉ tiêu tốn khoảng 35% đến 40% thời gian thực thi.

So với các nghiên cứu trước đây vốn chỉ tập trung vào phân tích mã nguồn Java thuần túy, đóng góp mang tính đột phá của luận văn này là đưa tầng giao diện JSP và cơ chế ánh xạ Servlet vào cùng một đồ thị phụ thuộc hợp nhất, thu hẹp hoàn toàn khoảng cách nghiệp vụ giữa lập trình viên và kiểm thử viên.

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

Dựa trên kết quả nghiên cứu và thực nghiệm, luận văn đưa ra 4 khuyến nghị hành động cụ thể nhằm nâng cao hiệu quả kiểm thử hồi quy trong các dự án phần mềm doanh nghiệp:

  1. Tích hợp công cụ phân tích ảnh hưởng vào quy trình CI/CD: Đội ngũ kỹ sư DevOps và Trưởng nhóm phát triển phần mềm cần nhúng công cụ JCIA vào pipeline tự động hóa (như Jenkins hoặc GitLab CI). Mục tiêu là tự động xuất báo cáo Change Set và Impact Set trong vòng 5 phút sau mỗi lần lập trình viên đẩy mã nguồn mới lên hệ thống, hoàn thành việc thiết lập quy trình trong vòng 3 tháng.

  2. Tự động hóa kịch bản kiểm thử giao diện có chọn lọc: Đội ngũ kiểm thử viên (QA/QC) cần sử dụng kết quả phân loại từ JCIA để xây dựng các kịch bản kiểm thử tự động hóa trên Ranorex hoặc Selenium, tập trung vào các trang JSP nằm trong Impact Set. Mục tiêu là đạt tỷ lệ tự động hóa trên 80% cho các module trọng yếu trong vòng 6 tháng.

  3. Chuẩn hóa quy trình lập trình và hạn chế nhúng mã nguồn Java trực tiếp trong JSP: Đội ngũ kiến trúc sư phần mềm cần ban hành quy chuẩn lập trình, loại bỏ triệt để việc viết Java Scriptlet trong mã nguồn giao diện JSP, chuyển đổi 100% sang sử dụng thẻ chuẩn JSTL hoặc mô hình Servlet Controller để công cụ phân tích AST đạt độ chính xác tối đa trong vòng 4 tháng.

  4. Mở rộng năng lực phân tích cho các nền tảng công nghệ mới: Nhóm nghiên cứu R&D kỹ nghệ phần mềm cần tiếp tục phát triển thuật toán phân tích đồ thị phụ thuộc cho các kiến trúc hiện đại như Spring Boot, RESTful API và các framework giao diện Single Page Application (Angular, React). Mục tiêu là nâng cao độ bao phủ công nghệ của công cụ lên trên 90% các dự án Web doanh nghiệp trong vòng 12 tháng.

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

Nội dung và kết quả nghiên cứu của luận văn mang lại giá trị ứng dụng thiết thực cho 4 nhóm đối tượng chính:

  • Kỹ sư kiểm thử phần mềm (QA/QC Engineers): Nắm vững phương pháp xác định Impact Set để loại bỏ các ca kiểm thử dư thừa, xây dựng kịch bản kiểm thử hồi quy tự động hóa trên Ranorex một cách có trọng tâm, giúp rút ngắn thời gian kiểm thử trước mỗi đợt phát hành phiên bản mới.
  • Lập trình viên Java EE (Software Developers): Hiểu rõ cơ chế lan truyền ảnh hưởng của các thay đổi từ tầng DAO, Entity, Servlet đến tầng giao diện JSP, từ đó kiểm soát chặt chẽ các tác động phụ ngoài ý muốn khi tiến hành tái cấu trúc (refactor) mã nguồn hoặc sửa lỗi.
  • Quản lý dự án và Trưởng nhóm kỹ thuật (Project Managers / Tech Leads): Ứng dụng mô hình phân loại kiểm thử để phân bổ nguồn lực hợp lý giữa lập trình viên (thực hiện kiểm thử đơn vị và tích hợp) và kiểm thử viên (thực hiện kiểm thử giao diện), giúp tiết kiệm tới 40% chi phí bảo trì dự án.
  • Giảng viên và Học viên sau đại học ngành Kỹ thuật Phần mềm: Sử dụng luận văn như một tài liệu tham khảo học thuật giá trị về kỹ thuật phân tích tĩnh mã nguồn, lý thuyết đồ thị AST/JDG, thuật toán WAVE-CIA và giải pháp tối ưu hóa kiểm thử hồi quy trong các hệ thống doanh nghiệp phức tạp.

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

1. Công cụ JCIA mở rộng khác biệt gì so với các hệ thống quản lý phiên bản như Git hay SVN? Các hệ thống như Git hay SVN chỉ thực hiện so sánh chuỗi văn bản thuần túy theo từng dòng lệnh và không hiểu ngữ nghĩa của mã nguồn. Ngược lại, JCIA mở rộng phân tích ngữ nghĩa cú pháp trên cây AST và đồ thị phụ thuộc JDG, từ đó nhận diện chính xác các thành phần bị ảnh hưởng gián tiếp xuyên suốt từ giao diện đến cơ sở dữ liệu.

2. Làm thế nào để công cụ dự đoán được các câu truy vấn cơ sở dữ liệu động trong JDBC? Công cụ xây dựng Đồ thị chuỗi (String Graph) để mô hình hóa quá trình biến đổi của biến chuỗi qua các câu lệnh gán, nối chuỗi và rẽ nhánh điều kiện. Sau đó, thuật toán duyệt đệ quy tiền thứ tự sẽ giải đồ thị để kết xuất tập các câu truy vấn tiềm năng, trích xuất chính xác tên bảng và cột bị tác động sau các từ khóa SQL.

3. Tại sao cần phải phân loại kiểm thử hồi quy thành ba cấp độ riêng biệt? Việc phân loại thành kiểm thử đơn vị, kiểm thử tích hợp và kiểm thử giao diện giúp tối ưu hóa sự phối hợp giữa các bộ phận. Lập trình viên sẽ chịu trách nhiệm chạy kiểm thử đơn vị và tích hợp cho các phương thức Java bị ảnh hưởng, trong khi kiểm thử viên tập trung kiểm thử giao diện JSP thông qua các kịch bản Ranorex tự động.

4. Phương pháp này có thể áp dụng cho các framework Java khác ngoài Java Servlet không? Hoàn toàn có thể áp dụng. Phiên bản gốc của JCIA đã hỗ trợ các nền tảng Struts 2, Spring và Hibernate. Nghiên cứu này mở rộng thành công cho Java Servlet và tạo tiền đề vững chắc để tiếp tục mở rộng mô hình phân tích cho các kiến trúc Web Services, Microservices và các framework giao diện hiện đại khác.

5. Mức độ tiết kiệm thời gian thực tế khi áp dụng giải pháp này trong dự án là bao nhiêu? Qua thực nghiệm chi tiết trên hệ thống quản lý bệnh viện với 16 ca kiểm thử phức tạp, phương pháp giúp cắt giảm từ 45% đến hơn 60% số lượng ca kiểm thử cần chạy lại so với phương pháp kiểm thử toàn bộ, đồng thời giảm trên 50% thời gian thực thi nhờ kết hợp công cụ kiểm thử tự động Ranorex.

Kết luận

  • Luận văn đã giải quyết thành công bài toán tối ưu hóa kiểm thử hồi quy cho các ứng dụng Web Java EE thông qua phương pháp phân tích ảnh hưởng sự thay đổi (CIA).
  • Đã mở rộng thành công bộ công cụ JCIA với khả năng phân tích toàn diện các phụ thuộc giữa tầng giao diện JSP, lớp Java Servlet và hệ thống cơ sở dữ liệu.
  • Đề xuất và hiện thực hóa thành công quy trình tự động phân loại kiểm thử hồi quy thành kiểm thử đơn vị, tích hợp và giao diện, tạo sự liên kết chặt chẽ giữa lập trình viên và kiểm thử viên.
  • Tích hợp hiệu quả kết quả phân tích ảnh hưởng với công cụ kiểm thử tự động hóa Ranorex, giúp cắt giảm hơn 50% thời gian và chi phí kiểm thử thực tế.
  • Đã kiểm chứng thực nghiệm thành công trên hệ thống quản lý bệnh viện thực tế, chứng minh độ chính xác và tính khả thi vượt trội của phương pháp đề xuất.

Về lộ trình phát triển tiếp theo, nhóm nghiên cứu đặt mục tiêu tối ưu hóa thuật toán phân tích mã nguồn Java nhúng trong JSP trong vòng 6 tháng tới và mở rộng hỗ trợ toàn diện kiến trúc RESTful Microservices trong vòng 12 tháng. Các doanh nghiệp phát triển phần mềm và các nhóm nghiên cứu công nghệ được khuyến khích áp dụng ngay giải pháp JCIA mở rộng vào quy trình kiểm thử nhằm nâng cao chất lượng sản phẩm và tối ưu hóa năng suất phát triển phần mềm doanh nghiệp.