TRÍ TUỆ NHÂN TẠO TRONG KIỂM THỬ PHẦN MỀM TỰ ĐỘNG 4 1.1 Giới thiệu chung
Xu thế sử dụng học máy trong kiểm thử tự động
Việc áp dụng trí tuệ nhân tạo (AI) trong phát triển phần mềm hiện vẫn ở mức độ tự chủ thấp hơn so với các lĩnh vực tiên tiến như hệ thống tự lái và điều khiển giọng nói AI chủ yếu được sử dụng trong các công cụ kiểm thử phần mềm nhằm tối ưu hóa quy trình phát triển, giúp vòng đời phát triển phần mềm trở nên hiệu quả hơn.
Học máy có khả năng tự động hóa và giảm bớt các nhiệm vụ thủ công trong quy trình phát triển và kiểm thử phần mềm Việc áp dụng công nghệ này giúp cải thiện khả năng quan sát và ra quyết định của con người trong kiểm thử thủ công, từ đó nâng cao hiệu quả công việc.
Hình 1.1: Trí tuệ nhân tạo 1
Hình 1.2: Xu thế trí tuệ nhân tạo trong kiểm thử tự động 2
Người kiểm thử cần có sự thông minh và khả năng quan sát kết quả, trong khi máy kiểm thử phải đạt hiệu suất cao Để nâng cao hiệu quả và giảm chi phí chất lượng, việc cải thiện kiểm thử phần mềm thông qua hành vi kiểm thử tự động thông minh, có khả năng bắt chước hành vi con người, là rất cần thiết.
1 https://www.edureka.co/blog/types-of-artificial-intelligence/
2 https://viblo.asia/p/kiem-thu-tu-dong-ung-dung-tri-tue-nhan-tao-ai-ai-test-automation-maGK7W8OKj2
Quá trình áp dụng đầu vào trong ứng dụng học máy bao gồm việc so sánh kết quả với mong đợi đầu ra, tương tự như cách mà các thuật toán học máy hoạt động Một tập đầu vào được cung cấp cho thuật toán đào tạo, cùng với câu trả lời đúng trong quá trình học tập có giám sát Hệ thống học máy lặp đi lặp lại việc cấu hình lại "nội bộ của bộ não", cải thiện khả năng cung cấp các câu trả lời chính xác dựa trên tập đầu vào Nhờ đó, các hệ thống học máy đang được nghiên cứu và phát triển mang lại lợi ích trực tiếp cho việc tự động hóa kiểm thử phần mềm.
Kiểm thử tự động truyền thống yêu cầu con người viết các dòng lệnh để thực hiện và so sánh kết quả, trong khi kiểm thử tự động ứng dụng trí tuệ nhân tạo cho phép công cụ tự động tạo ca kiểm thử và thực hiện so sánh Ví dụ, trong trường hợp kiểm thử xác minh phần tử “VIEW MORE”, công cụ Selenium chỉ thực hiện so sánh nội dung “verify text” và “verify not text”, đòi hỏi nhiều dòng lệnh để đạt độ chính xác cao Ngược lại, các công cụ trí tuệ nhân tạo như Applitools hay Testim.io rút gọn dòng lệnh và thực hiện so sánh dựa trên nhiều tiêu chí như màu sắc và nội dung, thậm chí đến từng điểm ảnh Đối với các trường hợp phức tạp như dữ liệu biểu đồ bảng, kiểm thử tự động truyền thống gặp khó khăn, nhưng với công cụ trí tuệ nhân tạo như Testcomplete, việc viết ca kiểm thử trở nên đơn giản hơn rất nhiều.
Hình 1.3: Ví dụ bộ lệnh Selenium
Hình 1.4: Ví dụ bộ lệnh Applitools
Trí tuệ nhân tạo và học máy đang được áp dụng rộng rãi trong kiểm thử phần mềm, bao gồm kiểm thử xác minh giao diện, kiểm thử API và kiểm thử bảo mật Các công cụ tích hợp trí tuệ nhân tạo có khả năng tự động sinh ca kiểm thử, chỉ cần người dùng chỉ định vị trí cần kiểm tra Khi mã nguồn thay đổi, học máy có thể xác định số lượng ca kiểm thử tối thiểu cần thiết để kiểm tra sự thay đổi đó Hơn nữa, học máy giúp tạo ra các ca kiểm thử đáng tin cậy hơn bằng cách quan sát và học hỏi từ sự thay đổi của ứng dụng, từ đó tự động quyết định bộ định vị nào nên được sử dụng để xác định các phần tử trong quá trình kiểm thử.
Hình 1.5: Phạm vi nghiên cứu của luận văn 3
3 http://uploads.pnsqc.org/2017/papers/AI-and-Machine-Learning-for-Testers-Jason-Arbon.pdf
Luận văn nghiên cứu về việc ứng dụng học máy trong kiểm thử giao diện tự động, nhằm xác minh các phần tử Chương 2 sẽ trình bày chi tiết về một số công cụ tích hợp trí tuệ nhân tạo và cách chúng sử dụng học máy trong quá trình này.
Huấn luyện học máy trong kiểm thử giao diện tự động
Hiện nay, Machine Learning (ML) đang được khám phá và ứng dụng trong lĩnh vực kiểm thử phần mềm Đề tài này theo định hướng của Jason Arbon, giám đốc điều hành của công ty phần mềm test.ai, người đã có kinh nghiệm làm việc tại Google và Microsoft, tập trung vào việc sử dụng ML trong kiểm thử giao diện.
1.3.1 Huấn luyện học máy: Nhận dạng trạng thái ứng dụng
Nhận dạng trạng thái ứng dụng có thể được thực hiện bằng cách cung cấp cho máy nhiều màn hình và nhãn tương ứng với từng trạng thái Ví dụ, màn hình đăng nhập và nhãn, màn hình kết quả tìm kiếm và nhãn Bằng cách dạy máy nhận diện trạng thái ứng dụng giống như người kiểm thử, máy có thể chọn kiểu tập đầu vào phù hợp cho ứng dụng Đầu tiên, hàng ngàn ảnh chụp màn hình của ứng dụng thực tế được thu thập và phân loại theo nhóm trạng thái giao diện người dùng, sau đó tiến hành ghi nhãn cho mỗi màn hình.
Khi tất cả các nhẫn đã được lưu, một kho dữ liệu đã ghi nhãn đã sẵn sàng để huấn luyện
Trong chương trình Machine Learning (ML), hàng ngàn trang được hiển thị, với đầu vào là sự kết hợp giữa các điểm ảnh trong ảnh chụp màn hình và các phần tử DOM.
Hình 1.6: Huấn luyện học máy trong kiểm thử tự động 4
• Tập đầu vào huấn luyện học máy: Ảnh, thông tin phần thử DOM
• Tập đầu ra mong đợi huấn luyện học máy: nhãn chính xác
4 http://uploads.pnsqc.org/2017/papers/AI-and-Machine-Learning-for-Testers-Jason-Arbon.pdf
Quá trình đào tạo máy học có thể mất nhiều giờ để tính toán, trong đó hệ thống sẽ xác định sự thành công của việc ghi nhãn từng màn hình Mỗi khi máy học phát hiện một màn hình bị ghi nhãn sai, nó sẽ điều chỉnh cấu trúc bên trong và lặp lại quá trình cho đến khi đạt được kết quả ghi nhãn tốt nhất Tuy nhiên, nguồn dữ liệu đào tạo thưa thớt, không chính xác hoặc không rõ ràng có thể cản trở khả năng học tập của máy học.
Khi quá trình hoàn tất, hệ thống Machine Learning (ML) có khả năng chấp nhận ảnh chụp màn hình hoặc ảnh chụp nhanh của Document Object Model (DOM) của ứng dụng mà không cần nhãn chính xác cho các màn hình, bao gồm cả những màn hình đã được huấn luyện và những màn hình chưa từng thấy trước đó.
Chất lượng ghi nhãn của Machine Learning (ML) được thể hiện qua "Ma trận nhầm lẫn", một biểu đồ mô tả tần suất mà các nhãn bị nhầm lẫn với nhau Ma trận này hiển thị các nhãn trên từng trục, giúp người dùng dễ dàng nhận biết sự chính xác và sai sót trong quá trình phân loại Ví dụ về ma trận nhầm lẫn được minh họa trong hình 1.7.
Hình 1.7: Ma trận nhầm lẫn 5
1.3.2 Huấn luyện học máy: Áp dụng tập đầu vào
Bước tiếp theo trong việc dạy máy học (ML) là xác định hành động chính xác dựa trên trạng thái màn hình ứng dụng Một hành động đơn lẻ bao gồm các "phần tử" và "đầu vào"; ví dụ, phần tử có thể là hộp tìm kiếm, trong khi đầu vào là hành động nhập văn bản tìm kiếm như "Hà Nội" Để đạt được hiệu quả, dữ liệu huấn luyện cần phải rất lớn, bao gồm tất cả các phần tử của màn hình, nhãn và đầu ra tương ứng.
5 http://uploads.pnsqc.org/2017/papers/AI-and-Machine-Learning-for-Testers-Jason-Arbon.pdf
• Dữ liệu huấn luyện đầu vào: [“nhãn màn hình”:tìm kiếm, “phần tử”: nút, hộp văn bản]
• Dữ liệu huấn luyện đầu ra: [“hộp văn bản”: nhập văn bản, “nút bấm”: xuống dòng… ]
Học cách tạo ra hành động trên các phần tử giống con người tương tự như quá trình đào tạo phân loại nhãn Khi nội dung màn hình và phần tử cụ thể được hiển thị, mạng sẽ gợi ý một hành động nhất định Nếu hành động được gợi ý không hợp lý, mạng sẽ tự điều chỉnh và tiếp tục cải thiện cho đến khi đạt được những hành vi giống con người trong ứng dụng.
1.3.3 Thực thi ML: Áp dụng thế giới thật
Ngày nay, Machine Learning (ML) có khả năng thông minh trong việc quyết định hành động dựa trên trạng thái của ứng dụng ML thực hiện điều này bằng cách khởi chạy ứng dụng trong trình giả lập hoặc trên thiết bị, chụp ảnh màn hình và tải DOM hiện tại thông qua kết nối gỡ lỗi Trình điều khiển ứng dụng sẽ gọi đến trình điều khiển nền tảng cụ thể để yêu cầu dữ liệu và chuyển thông tin này đến ML để đưa ra quyết định tiếp theo.
ML đã quyết định bước tiếp với đầu ra là cặp phần tử và tên hành động, cho phép trình điều khiển ứng dụng tìm kiếm phần tử trên màn hình và thực hiện hành động tương ứng Với hai phần ML được huấn luyện, hệ thống có khả năng thông minh để khám phá bất kỳ ứng dụng nào mà không cần huấn luyện mới Điều này giúp tự động phát hiện sự cố hoặc vấn đề hiệu suất mà trước đây chỉ có thể thực hiện qua hướng dẫn của con người hoặc thông qua hàng ngàn tập lệnh kiểm tra giao diện người dùng Cách tiếp cận này mang lại hiệu quả cao trong việc tối ưu hóa quy trình kiểm thử.
ML này có thể được áp dụng ngay lập tức cho tất cả các ứng dụng, loại bỏ sự cần thiết phải can thiệp của con người trong việc sử dụng ứng dụng hoặc viết các tập lệnh kiểm tra.
1.3.4 Huấn luyện học máy: Xác minh hành vi
Hiện nay, các robot học máy (ML) có khả năng điều khiển ứng dụng thông minh tương tự như con người Tuy nhiên, vấn đề xác minh hành vi của chúng vẫn cần được giải quyết Có ba phương pháp chính giúp robot ML xác minh xem ứng dụng có hành vi đúng hay sai.
• Tự động kiểm tra chức năng phổ biến, có thể phát hiện vấn đề
• Huấn luyện học máy dựa trên các ví dụ mẫu về lỗi
• Con người kiểm tra các luồng trước đó, sau đó các người máy sẽ thông báo bất kỳ sự khác biệt nào trong lần chạy tiếp theo
Kiểm tra tự động chức năng phổ biến là bước xác minh đầu tiên trong quy trình kiểm tra ứng dụng, giúp phát hiện lỗi hiệu quả Mỗi bước kiểm tra, trình điều khiển ứng dụng sẽ rà soát và phát hiện các sự cố, lỗi hoặc hộp thoại lỗi để đảm bảo chất lượng ứng dụng.
Huấn luyện học máy có thể tự động phân loại màn hình lỗi trong trình tự bằng cách sử dụng các ví dụ lỗi trước đó Với số lượng lớn các ví dụ tương tự, máy học nhanh chóng nhận diện các điều kiện dẫn đến lỗi, chẳng hạn như màn hình có ít phần tử hoặc hộp thoại chứa các từ khóa phổ biến như “sorry”, “try again”, và “oops” trong ứng dụng.
Phương thức phát hiện lỗi hiệu quả nhất là ghi lại tất cả ảnh chụp màn hình, DOM và chuỗi hành động trong mỗi bài thử nghiệm của ứng dụng Con người có thể nhanh chóng xác minh xem hành vi đó có vượt qua hay thất bại Khi thực hiện các lần chạy tiếp theo, việc so sánh dữ liệu giữa các lần chạy cũ và mới sẽ giúp phát hiện các vấn đề.
• Việc chạy giống hệt nhau, ứng dụng vẫn hoạt động chính xác
• Lần chạy không giống nhau và lỗi mới trong hoạt động ứng dụng
• Lần chạy không giống nhau nhưng phát hiện ra phần tử hoặc đường dẫn mới trong ứng dụng Con người xem xét chức năng chính xác, và/hoặc lỗi
GIỚI THIỆU VỀ CÁC CÔNG CỤ
Applitools
Applitools chuyên về kiểm thử trực quan, đảm bảo giao diện hiển thị đúng như mong đợi Nó cung cấp nhiều API cho các ngôn ngữ lập trình và khung làm việc, cho phép tạo kiểm thử trực quan cho từng thành phần GUI hoặc toàn bộ màn hình.
Trong quá trình kiểm thử, Applitools API tạo ra ảnh chụp màn hình và tải lên máy chủ chuyên dụng để so sánh Thuật toán thị giác máy tính (CV) sẽ báo cáo các sự khác biệt có thể nhận thấy Quản lý kiểm thử đôi mắt cho phép xem xét chi tiết kết quả, giúp phê duyệt, từ chối hoặc bỏ qua các thay đổi, đồng thời nhóm các thay đổi tương tự để tăng tốc quá trình bảo trì.
Applitools hoạt động như thế nào?
• Khung kiểm thử tự động: cài đặt trên máy cục bộ của người dùng để tạo, chạy ca kiểm thử
• Applitools SDK: cài đặt trên máy cục bộ của người dùng, định nghĩa các nguyên tắc DOM, CSS của các phần tử khi chạy ca kịch bản
• Lưới giao diện Applitools (tên tiếng anh là Applitools Visual Gird): nằm trên đám mây Applitools, ca kiểm thử được chạy trên lưới giao diện
• AI trực quan Applitools (tên tiếng anh là Applitools Visual AI) hay còn gọi là
“Eyes”: nằm trên đám mây Applitools, so sánh sự khác biệt về giao diện và thông báo kết quả
6 https://applitools.com/tutorials/selenium-ide
• Phân tích nguyên nhân góc Applitools (tên tiếng anh là Applitools Root Cause Analysis): nằm trên đám mây Applitools, quản lý kết quả so sánh
Hình 2.1: Applitools - hoạt động như thế nào 7
Khi ca kiểm thử đầu tiên được thực hiện trên ứng dụng, máy chủ AI sẽ lưu trữ ảnh chụp màn hình dưới dạng ảnh cơ sở (baseline) Trong lần kiểm thử tiếp theo, ảnh chụp màn hình mới sẽ được gọi là ảnh kiểm tra (checkpoint) Eyes sẽ tiến hành so sánh giữa ảnh cơ sở và ảnh kiểm tra để đưa ra quyết định chính xác.
Thị giác máy tính là công nghệ tiên tiến giúp máy tính hiểu và phân tích hình ảnh giống như con người Với sự hỗ trợ của AI được xử lý trên nền tảng đám mây Applitools, các thuật toán này có khả năng phát hiện và báo cáo những khác biệt quan trọng trong giao diện người dùng mà mắt người có thể nhận thấy.
Công nghệ của Applitools cho phép xác nhận cấu trúc của trang web vẫn giữ nguyên mặc dù nội dung có thể thay đổi Eyes so sánh một chuỗi hình ảnh kiểm tra với chuỗi hình ảnh cơ sở, cho phép linh hoạt trong việc thêm hoặc xóa các điểm kiểm tra mà không cần liên kết tĩnh giữa chúng.
Eyes giúp bạn phát hiện sự khác biệt trong văn bản bằng cách tìm ra hình ảnh đã được thêm hoặc xóa, cùng với hình ảnh có đường cơ sở tương ứng Ngoài ra, Eyes cho phép bạn xác minh cả hai điểm kiểm tra hiện có và đảm bảo rằng tập hợp các hình ảnh cơ sở vẫn chính xác.
7 https://applitools.com/tutorials/selenium-java.html
AI không thể phân biệt giữa tính năng mới và lỗi thực sự, vì vậy nó sẽ chờ đợi sự xác nhận thủ công từ con người để đánh dấu là thành công hoặc thất bại.
Khi thực hiện ca kiểm thử, Eyes tiến hành xác minh toàn bộ chuỗi ảnh kiểm tra so với chuỗi ảnh cơ sở Kết quả kiểm tra sẽ hiển thị một chuỗi các bước, trong đó mỗi bước thể hiện một điểm kiểm tra bị thiếu, một điểm kiểm tra mới, một điểm kiểm tra phù hợp với đối tác cơ sở hoặc một điểm khác biệt so với đối tác đó.
Ví dụ, chuỗi ảnh cơ sở bao gồm 5 ảnh:
Hình 2.2: Applitools - ví dụ ảnh cơ sở
Và chuỗi ảnh kiểm tra:
Hình 2.3: Applitools - ví dụ ảnh kiểm tra
Chuỗi ảnh kiểm tra đã có sự thay đổi với ảnh B bị xóa, ảnh C được thay thế bằng ảnh C1, và hai ảnh mới F và G được thêm vào Trong khi đó, các ảnh A, D, E vẫn giữ nguyên Eyes sẽ nhận diện sự khác biệt và tương đồng giữa hai chuỗi ảnh này.
• Giống: Eyes tìm thấy ảnh cơ sở và ảnh kiểm tra giống nhau
• Khác: Eyes tìm thấy ảnh cơ sở và ảnh kiểm tra về cơ bản là khớp nhau nhưng có một phần khác biệt
• Thiếu: Eyes không tìm thấy ảnh kiểm tra tương ứng với ảnh cơ sở
• Mới: Eyes phát hiện ra ảnh cơ sở mới.
Testim.io
Testim.io là một công cụ kiểm thử tự động dựa trên học máy, giúp các nhà phát triển soạn thảo, thực hiện và bảo trì các ca kiểm thử một cách hiệu quả Chạy trên đám mây Amazon, người dùng có thể dễ dàng tạo bài kiểm tra chỉ trong vài phút, đồng thời thực hiện hàng ngàn ca kiểm thử song song trên nhiều trình duyệt khác nhau Ngoài ra, Testim.io còn tích hợp linh hoạt với các công cụ CI/CD và các công cụ cộng tác hiện có, mang lại sự tiện lợi tối đa cho quy trình phát triển phần mềm.
Công cụ đã giới thiệu khái niệm định vị thông minh, sử dụng trí tuệ nhân tạo để phân tích thời gian thực tất cả các đối tượng DOM trên trang và trích xuất thông tin cần thiết.
AI phân tích 15 đối tượng và thuộc tính của chúng để xác định chiến lược tối ưu cho việc xác định vị trí một phần tử cụ thể.
Việc thay đổi thuộc tính của một yếu tố bởi nhà phát triển không làm gián đoạn quá trình thử nghiệm, giúp các thử nghiệm trở nên ổn định hơn Nhờ đó, việc soạn thảo và thực hiện các bài kiểm tra tự động trở nên nhanh chóng và hiệu quả hơn rất nhiều.
Bộ định vị thông minh của Testim.io là một ma trận bộ chọn liên quan đến các phần tử cụ thể Khi người dùng tương tác với một phần tử trong quá trình ghi, thuật toán của Testim.io sẽ phân tích hàng trăm thuộc tính liên quan và gán trọng số cho chúng để xác định duy nhất thành phần đó.
Hình 2.4: Testim.io - bộ định vị thông minh
Bộ định vị thông minh của Testim.io học hỏi từ mỗi lần chạy thử, giúp xác định thành phần ngay cả khi một số thuộc tính thay đổi Nhờ vào khả năng này, nếu phần tử được thay đổi nhưng vẫn hoạt động, bộ định vị sẽ tìm thấy nó và đảm bảo bài kiểm tra không bị lỗi.
Khi nhấp vào “VIEW MORE”, các thuộc tính liên quan sẽ được đưa vào bộ định vị thông minh, bao gồm thuộc tính của phần tử “View More” cũng như các thuộc tính cha và con liên quan Các thuộc tính này sẽ được tính toán và gán trọng số để tối ưu hóa trải nghiệm người dùng.
8 https://help.testim.io/docs/testim-overview
9 https://www.testim.io/blog/author-execute-automated-tests/
10 https://help.testim.io/docs/working-with-locators
16 vào đó, AI đưa ra quyết định rằng ca kiểm thử kích vào phần tử “VIEW MORE” có thành công hay không.
TestComplete
TestComplete là công cụ kiểm thử tự động chức năng do SmartBear phát triển, cho phép người kiểm tra tạo bài kiểm tra tự động cho ứng dụng trên giao diện cục bộ, trình duyệt và hệ điều hành Với công nghệ nhận dạng đối tượng bằng AI, TestComplete đảm bảo quy trình kiểm thử trở nên ổn định và dễ dàng mở rộng khi mã nguồn thay đổi.
TestComplete hoạt động như thế nào?
Khi ghi lại các bài kiểm tra, TestComplete tự động thêm các đối tượng vào kho lưu trữ bản đồ tên, và bạn cũng có thể thêm chúng thủ công trong quá trình thiết kế Mỗi đối tượng sẽ được TestComplete gán các tiêu chí mô tả trong ứng dụng Trong quá trình ánh xạ, TestComplete sẽ so sánh các đối tượng với kho lưu trữ bản đồ tên và chỉ ánh xạ những đối tượng chưa được ánh xạ.
Khi thực hiện thử nghiệm, TestComplete sử dụng kho lưu trữ bản đồ tên để xác định các đối tượng trong ứng dụng của bạn Nếu TestComplete không tìm thấy một đối tượng do thay đổi thuộc tính hoặc sự trùng lặp giá trị thuộc tính, thử nghiệm sẽ không thành công Để khắc phục, bạn cần cập nhật các tiêu chí ánh xạ bằng cách sử dụng các thuộc tính duy nhất và ổn định để nhận diện đối tượng.
TestComplete thường nhận diện các cửa sổ dựa trên thuộc tính như tên lớp, chú thích và định danh Tuy nhiên, trong một số trường hợp, khi không thể truy cập vào các thuộc tính này, TestComplete sẽ sử dụng kỹ thuật nhận dạng ký tự quang học (OCR) để nắm bắt nội dung của các phần tử.
Hình ảnh được chụp và chuyển đổi thành ký tự máy có thể đọc được Công cụ này nhận diện văn bản từ giao diện người dùng và từ các tập tin được tải lên.
11 https://smartbear.com/product/testcomplete/features/gui-object-recognition/
TestComplete gửi dữ liệu nhận dạng đến dịch vụ web orc.dev.smartbear.com của SmartBear, nơi các yêu cầu được chuyển tiếp tới API Google Vision Kết quả nhận dạng sau đó được trả về TestComplete.
Mabl
Mabl là một công cụ kiểm thử tự động phần mềm, ứng dụng công nghệ học máy để hỗ trợ các nhóm kỹ thuật trong việc kiểm tra hồi quy Nó thu thập dữ liệu quan trọng như thời gian chạy thử, thời gian tải trang và ảnh chụp màn hình để hiển thị các thay đổi trực quan trong ứng dụng Những dữ liệu này được sử dụng để đào tạo các mô hình học máy, giúp người dùng nhận biết tình trạng tốt hay xấu của ứng dụng khi có sự thay đổi.
Mabl hoạt động như thế nào?
Khi người dùng sử dụng tiện ích “Trainer” để ghi lại ca kiểm thử, ảnh màn hình baseline sẽ được lưu lại Trong các lần thực hiện kiểm thử tương tự sau đó, ảnh chụp màn hình sẽ được so sánh với ảnh baseline để phát hiện các thay đổi Những thay đổi trực quan sẽ được đánh dấu và gắn nhãn cảnh báo, giúp người dùng dễ dàng nhận biết.
AI và ML được áp dụng để nắm bắt toàn bộ quy trình, bao gồm hệ thống, mã lệnh, thực thi kiểm thử và phát hiện lỗi Khi nhiều ca kiểm thử được thực hiện, Mabl có khả năng học hỏi nhiều hơn về hệ thống và tự động hóa mọi quy trình.
Mabl là một giải pháp AI được phát triển với sự hỗ trợ từ bộ công cụ đám mây của Google Nó sử dụng "Cloud ML Engine" để đào tạo mô hình thị giác và thời gian chạy, "Dataflow" để xử lý dữ liệu kiểm thử, và "Lighthouse" để theo dõi các chỉ số hiệu suất của ứng dụng.
Mabl phát hiện lỗi bằng cách xây dựng một mô hình và so sánh kết quả kiểm thử với mô hình đó Nó đánh giá sự thay đổi và tạo ra một chỉ số chất lượng để xác định xem kết quả kiểm thử có cần thông báo lỗi hay không Học tập gia tăng được áp dụng từ các lần chạy kiểm thử trước đó giúp cải thiện chất lượng và xử lý biến thiên thời gian Khi người dùng chấp nhận hoặc từ chối thông tin từ Mabl, họ đang cung cấp dữ liệu huấn luyện cho máy học, từ đó nâng cao chất lượng và cập nhật mô hình.
12 https://www.mabl.com/features
Học máy giúp phát hiện lỗi trực quan và cải thiện hiệu năng ứng dụng bằng cách chụp ảnh màn hình của các trang web trong quá trình thử nghiệm Mabl so sánh các ảnh chụp màn hình để thông báo cho người dùng về sự thay đổi, đồng thời học cách loại trừ các khu vực động, nơi có các thành phần thay đổi thường xuyên Mô hình thời gian chạy cũng được cập nhật liên tục sau mỗi ca kiểm thử.
Khi có các thay đổi mới, các mô hình sẽ kết hợp chúng dưới dạng thử nghiệm hoặc hành trình Để cải thiện độ chính xác, người dùng có thể sử dụng nút "Cập nhật đường cơ sở" để cập nhật trực quan cho một bước cụ thể hoặc cho toàn bộ hành trình của ứng dụng.
THỰC NGHIỆM
Phương thức thực nghiệm
Học viên sẽ tiến hành mô phỏng các lỗi giao diện thường gặp trên các phần tử và thực hiện kiểm thử bằng các công cụ đã đề cập ở chương III để xác định khả năng phát hiện lỗi Đồng thời, kiểm thử cũng sẽ được thực hiện trên Selenium, một công cụ không sử dụng trí tuệ nhân tạo, nhằm mục đích so sánh hiệu quả giữa các công cụ.
Một trang web được học viên thiết kế để thực nghiệm
• Trang chủ: https://hoantrantb90.wixsite.com/food/ là trang blog về thức ăn
• Thành phần: Những thành phần quen thuộc của giao diện như nút, hộp văn bản, hộp lựa chọn, thanh thực đơn, biểu đồ được đưa vào trang web
Giao diện trang web bao gồm các phần chính như sau: trang chủ (hình 3.1), trang "Portfolio" (hình 3.2), trang "Book" (hình 3.3), trang "Block" (hình 3.4), trang "Join Us" (hình 3.5) và trang "About" (hình 3.6).
Hình 3.1: Trang giao diện chủ
Hình 3.2: Trang giao diện “Portfolio”
Hình 3.3: Trang giao diện “Book”
Hình 3.4: Trang giao diện “Blog”
Hình 3.5: Trang giao diện “Join Us”
Hình 3.6: Trang giao diện “About”
Lần lượt các phần tử giao diện của trang web thực nghiệm được kiểm thử theo quá trình từ bước 1 đến bước 5
• [Bước 1 trên trang web] Các phẩn tử giao diện được xây dựng đúng, chuẩn với thiết kế giao diện người dùng
Bước 2 trong quy trình kiểm thử yêu cầu ghi lại các ca kiểm thử trên giao diện theo đúng thiết kế Sau khi hoàn thành, dữ liệu cơ sở sẽ được lưu lại để làm căn cứ so sánh cho các lần kiểm thử tiếp theo Các ca kiểm thử này sẽ được thực hiện trên các phần tử giao diện cơ bản như văn bản, hình ảnh, nút bấm, hộp nhập văn bản, hộp lựa chọn, thanh thực đơn và biểu đồ.
Học viên chủ động tạo ra lỗi giao diện trên trang web thực nghiệm bằng cách thay đổi hình dạng, nội dung và màu sắc của các phần tử Các thay đổi này bao gồm việc điều chỉnh nội dung, hình thức, màu sắc và vị trí của các thành phần trên trang.
Chạy lại ca kiểm thử ở bước 2 với dữ liệu kiểm tra là dữ liệu hiện tại của ứng dụng đã được thay đổi, sau đó so sánh với dữ liệu cơ sở ban đầu để đưa ra kết quả.
• [Bước 5 trên công cụ] Kiểm tra kết quả chạy ca kiểm thử xem công cụ có phát hiện được sự thay đổi của phần tử giao diện hay không
Một số định nghĩa kết quả chạy lại ca kiểm thử:
− P: thông qua (tên tiếng anh là Pass), công cụ không tìm ra lỗi của cả kiểm thử
− F: phát hiện thất bại (tên tiếng anh là Fail), công cụ tìm ra lỗi của ca kiểm thử
− P(D): phát hiện thay đổi hay còn gọi là thông qua nhưng phát hiện có một phần không khớp với kết quả mong đợi (tên tiếng anh là P-Pass, D-Different)
3.1.4 Nhật ký ca kiểm thử mẫu
Tiêu đề ca kiểm thử: Kiểm tra nút “VIEW MORE”
Kịch bản ca kiểm thử:
[Bước 1] Trên trang chủ web, nút “VIEW MORE” hiển thị đúng thiết kế
[Bước 2] Ghi lại ca kiểm thử cho nút “VIEW MORE”:
1 Mở trang https://hoantrantb90.wixsite.com/food/
2 Kích vào nút “VIEW MORE”
[Bước 3] Thực hiện thay đổi thuộc tính nút “VIEW MORE”: tăng cỡ chữ để phần hiển thị “VIEW MORE” không được đầy đủ
[Bước 4] Chạy lại các ca kiểm thử
[Bước 5] Kiểm tra công cụ có phát hiện được sự thay đổi giao diện hay không
Kết quả mong đợi: Sự thay đổi giao diện được phát hiện
Nhật ký ca kiểm thử trên các công cụ đã tìm hiểu:
[Bước 1] Trên trang chủ web, nút “VIEW MORE” hiển thị như hình 3.7
[Bước 2] Ghi lại ca kiểm thử cho nút “VIEW MORE” trên các công cụ như hình 3.8, hình 3.9, hình 3.10 và hình 3.11
Hình 3.8: Applitools - Kịch bản ca kiểm thử
Hình 3.9: Testim.io - Kịch bản ca kiểm thử
Hình 3.10: Testcomplete -Kịch bản ca kiểm thử
Hình 3.11: Mabl -Kịch bản ca kiểm thử
[Bước 3] Thực hiện thay đổi thuộc tính nút “VIEW MORE”: tăng cỡ chữ để phần hiển thị “VIEW MORE” không được đầy đủ như hình 3.12
Hình 3.12: Giao diện thay đổi
[Bước 4] Chạy lại các ca kiểm thử
[Bước 5] Kiểm tra kết quả chạy của mỗi công cụ như hình 3.13, hình 3.14, hình 3.15 và hình 3.16
Hình 3.13: Applitools - Kết quả ca kiểm thử
Hình 3.14: Testim.io - Kết quả ca kiểm thử
Hình 3.15: Testcomplete - Kết quả ca kiểm thử
Hình 3.16: Mabl - Kết quả ca kiểm thử
Kiểm tra văn bản
Tiêu đề ca kiểm thử: Kiểm tra nội dung văn bản đoạn giới thiệu của trang chủ
Kịch bản ca kiểm thử:
[Bước 1] Trên trang chủ, đoạn văn bản đoạn giới thiệu hiển thị đúng thiết kế [Bước 2] Ghi lại ca kiểm thử:
1 Mở trang https://hoantrantb90.wixsite.com/food/
2 Kích chuột vào phần đoạn văn bản giới thiệu của trang chủ
3 Bôi đen đoạn văn bản giới thiệu của trang chủ
Trên trang web, bạn có thể thực hiện các thay đổi thuộc tính của đoạn văn bản như giảm cỡ chữ 50%, tăng cỡ chữ 50%, thay đổi màu chữ, đổi phông chữ, và chỉnh sửa nội dung để loại bỏ từ thừa hoặc bổ sung từ thiếu.
[Bước 4] Chạy lại các ca kiểm thử
[Bước 5] Kiểm tra công cụ có phát hiện được sự thay đổi giao diện hay không Kết quả như bảng 3.1 (F, P, P(D) được giải thích ở phần 3.1.3)
Bảng 3.1: Kiểm tra nội dung văn bản
Thay đổi thuộc tính phần tử giao diện
Kết quả chạy lại ca kiểm thử sau khi thuộc tính thay đổi
Kiểm tra ảnh
Tiêu đề ca kiểm thử: Kiểm tra ảnh biểu trưng (tên tiếng anh là logo) của trang chủ
Kịch bản ca kiểm thử:
[Bước 1] Trên trang chủ, ảnh biểu trưng hiển thị đúng thiết kế
[Bước 2] Ghi lại ca kiểm thử:
1 Mở trang https://hoantrantb90.wixsite.com/food/
2 Kích chuột vào ảnh biểu trưng của trang chủ
[Bước 3] Trên trang web, thực hiện các thay đổi thuộc tính như mục thay đổi thuộc tính giao diện phần tử của bảng 3.2
[Bước 4] Chạy lại các ca kiểm thử
[Bước 5] Kết quả như bảng 3.2 (F, P, P(D) được giải thích ở phần 3.1.3)
Thay đổi thuộc tính phần tử giao diện
Kết quả chạy lại ca kiểm thử sau khi thuộc tính thay đổi
1 Thay đổi kích cỡ ảnh F P P(D) P P P
Kiểm tra nút
Tiêu đề ca kiểm thử: Kiểm tra nút “VIEW MORE” ở trang chủ
Kịch bản ca kiểm thử:
[Bước 1] Trên trang chủ, nút “VIEW MORE” hiển thị đúng thiết kế
[Bước 2] Ghi lại ca kiểm thử:
1 Mở trang https://hoantrantb90.wixsite.com/food/
2 Kích chuột vào nút “VIEW MORE”
[Bước 3] Trên trang web, thực hiện các thay đổi thuộc tính của nút (phần thay đổi thuộc tính phần tử giao diện của bảng 3.3)
[Bước 4] Chạy lại các ca kiểm thử
[Bước 5] Kiểm tra công cụ có phát hiện được sự thay đổi giao diện hay không Kết quả như bảng 3.3 (F, P, P(D) được giải thích ở phần 3.1.3)
STT Thay đổi thuộc tính phần tử giao diện
Kết quả chạy lại ca kiểm thử sau khi thuộc tính thay đổi
1 Đổi màu nút "View More" F P P(D) P P P(D)
2 Đổi cỡ chứ của nút “VIEW
3 Đổi cỡ chứ của nút “VIEW
4 Đổi nội dung của nút
“VIEW MORE” sang từ đồng nghĩa ( See More, Nhìn, Xem)
5 Đổi nội dung của nút
“VIEW MORE” sang từ khác nghĩa
Thay nút “VIEW MORE” bằng button khác, cùng nội dung
Thay nút “VIEW MORE” bằng button khác, khác nội dung
Chuyển vị trí nút “VIEW
Chuyển vị trí nút “VIEW
11 Đổi nút “VIEW MORE” sang có animation F P P P P P
MORE” và vị trí khác nhau F P P P p P
Nhân đôi nút “VIEW MORE” và vị trí đè lên nhau
Không dùng nút, thay bằng hộp chọn nhưng vẫn giữ nguyên nội dung
16 Xóa phần nội dung của nút
17 Kích thước nút bị giảm
18 Kích thước nút bị giảm
19 Kích thước nút bị tăng 50% F P P(D) P p P
Kiểm tra hộp nhập văn bản
Tiêu đề ca kiểm thử: Kiểm tra hộp điền tên của trang “Join Us”
Kịch bản ca kiểm thử:
[Bước 1] Trên trang “Join Us”, hộp văn bản “Name” hiển thị đúng thiết kế
[Bước 2] Ghi lại ca kiểm thử:
1 Mở trang https://hoantrantb90.wixsite.com/food/
2 Kích vào mục “Join Us”
4 Điền thông tin vào hộp “Name”
[Bước 3] Trên trang “Join Us”, thực hiện các thay đổi thuộc tính của hộp văn bản
“Name”: (phần thay đổi thuộc tính phần tử giao diện của bảng 3.4)
[Bước 4] Chạy lại các ca kiểm thử
[Bước 5] Kiểm tra công cụ có phát hiện được sự thay đổi giao diện hay không Kết quả như bảng 3.4 (F, P, P(D) được giải thích ở phần 3.1.3)
Bảng 3.4: Kiểm tra hộp nhập văn bản
STT Thay đổi thuộc tính phần tử giao diện
Kết quả chạy lại ca kiểm thử sau khi thuộc tính thay đổi
1 Sửa mô tả của hộp
3 Hộp "Name" bị đổi kích thước F P P(D) P F P
4 Hộp "Name" bị mất bên trái F P P(D) P p P(D)
5 Hộp "Name" bị mất bên phải F P P(D) P F P
6 Chữ của hộp "Email" đè vào hộp "Name" F P P(D) F F P(D)
7 Hộp "Name" bị nút submit đè F P P(D) F F P(D)
8 Hộp "Name" bị biến dạng F P P(D) P(D) F P(D)
9 Hộp "Name" bị thay đổi vị trí F P P P F P
Kiểm tra hộp lựa chọn
Tiêu đề ca kiểm thử: Kiểm tra hộp lựa chọn “Portion” của trang “Join Us”
Kịch bản ca kiểm thử:
[Bước 1] Trên trang “Join Us”, hộp lựa chọn “Portion” hiển thị đúng thiết kế
[Bước 2] Ghi lại ca kiểm thử:
1 Mở trang https://hoantrantb90.wixsite.com/food/
2 Kích vào mục “Join Us”
3 Kích vào hộp lựa chọn “Portion”
4 Lựa chọn một lựa chọn trong các lựa chọn được hiển thị
[Bước 3] Trên trang web, thực hiện các thay đổi thuộc tính của đoạn văn bản (phần thay đổi thuộc tính phần tử giao diện của bảng 3.5)
[Bước 4] Chạy lại các ca kiểm thử
[Bước 5] Kiểm tra công cụ có phát hiện được sự thay đổi giao diện hay không Kết quả như bảng 3.5 (F, P, P(D) được giải thích ở phần 3.1.3)
Bảng 3.5: Kiểm tra hộp lựa chọn
STT Thay đổi thuộc tính phần tử giao diện
Kết quả chạy lại ca kiểm thử sau khi thuộc tính thay đổi
1 Cỡ chữ của thanh menu quá nhỏ(5) F P P(D) P F P(D)
Cỡ chữ của thanh menu quá lớn(70) và bị trào khỏi khung
3 Đổi vị trí phần tử
5 Đổi thanh menu sang có animation F P P P P P
Kiểm tra thanh thực đơn
Tiêu đề ca kiểm thử: Kiểm tra thực đơn “Portfolio” của thanh thực đơn
Kịch bản ca kiểm thử:
[Bước 1] Trên trang web, thanh thực đơn hiển thị đúng các thực đơn “Home”,
“Portfolio”, “Book”, “Blog”, “Join Us”, “About”
[Bước 2] Ghi lại ca kiểm thử:
1 Mở trang https://hoantrantb90.wixsite.com/food/
2 Kích vào thực đơn “Portfolio”
[Bước 3] Trên trang web, thực hiện các thay đổi thuộc tính của đoạn văn bản: (phần thay đổi thuộc tính phần tử giao diện của bảng 3.6)
[Bước 4] Chạy lại các ca kiểm thử
[Bước 5] Kiểm tra công cụ có phát hiện được sự thay đổi giao diện hay không Kết quả như bảng 3.6 (F, P, P(D) được giải thích ở phần 3.1.3)
Bảng 3.6: Kiểm tra thanh thực đơn
STT Thay đổi thuộc tính phần tử giao diện
Kết quả chạy lại ca kiểm thử sau khi thuộc tính thay đổi
1 Thay đổi màu nền của hộp lựa chọn F P P(D) P p P(D)
2 Đổi nội dung của các lựa chọn sang từ khác nghĩa F P P(D) P(D) F P(D)
3 Đổi nội dung của các lựa chọn sang từ cùng nghĩa F P P(D) P(D) F P(D)
Thay bằng hộp lựa chọn khác cùng nội dung F F P P F P
Thay bằng hộp lựa chọn khác và khác nội dung F F P(D) P(D) F F
6 Chuyển vị trí của hộp lựa chọn F P P P F P
9 Kéo dài hộp lựa chọn đến hết trang F P P(D) P(D) p P(D)
10 Thu hẹp hộp lựa chọn còn
Kiểm tra biểu đồ
Tiêu đề ca kiểm thử: Kiểm tra biểu đồ của trang “About”
Kịch bản ca kiểm thử:
[Bước 1] Trên trang “About”, biểu đồ “Food Article” hiển thị đúng thiết kế
[Bước 2] Ghi lại ca kiểm thử:
1 Mở trang https://hoantrantb90.wixsite.com/food/
3 Kích vào biểu đồ “Food Article”
[Bước 3] Trên trang web, thực hiện các thay đổi thuộc tính của đoạn văn bản: (phần thay đổi thuộc tính phần tử giao diện của bảng 3.3)
[Bước 4] Chạy lại các ca kiểm thử
Bước 5 là kiểm tra xem công cụ có phát hiện được sự thay đổi giao diện hay không, với kết quả được trình bày trong bảng 3.7 Các ký hiệu F và P được giải thích trong phần 3.1.3, trong khi NA thể hiện kết quả thất bại do công cụ không tìm thấy thuộc tính của biểu đồ, bất kể có thay đổi hay không.
Bảng 3.7: Kiểm tra thanh biểu đồ
STT Thay đổi thuộc tính phần tử giao diện
Kết quả chạy lại ca kiểm thử sau khi thuộc tính thay đổi
1 Thay đổi dữ liệu F NA NA P F NA
Đánh giá kết quả kiểm thử
Khi một phần tử giao diện được thay đổi, mục tiêu chính của việc chạy ca kiểm thử là phát hiện sự thay đổi đó Dưới đây là bảng thống kê số lượng ca kiểm thử đã phát hiện sự thay đổi của các phần tử giao diện cho từng công cụ.
− Tổng số ca phát hiện ra sự thay đổi giao diện theo bảng 3.8
Bảng 3.8: Kết quả tổng số ca
Số ca phát hiện lỗi 10 5 9 39 8
Số ca không phát hiện lỗi nhưng có cảnh báo thay đổi 0 36 11 0 27
Số ca không phát hiện lỗi 43 12 33 14 18
Tổng số ca thực hiện 53 53 53 53 53
− Số ca phát hiện ra sự thay đổi giao diện được phân theo loại phần tử theo bản 3.9
Bảng 3.9: Kết quả theo loại phần tử
Nội dung văn bản 0 6 0 6 6 6 Ảnh 0 2 0 2 0 2
− Số ca phát hiện ra thay đổi giao diện được phân theo loại thay đổi theo bảng 3.10
Bảng 3.10: Kết quả theo loại thay đổi
Tổng số ca kiểm thử thực hiện là 53, được phân nhóm theo các hạng mục thay đổi giao diện như bảng 3.8 và bảng 3.9 để thống kê Từ đó, tỉ lệ cho từng hạng mục sẽ được tính toán.
Tỷ lệ phát hiện thất bại =Số ca phát hiện thất bại
Tổng số ca thực hiện
Tỷ lệ phát hiện thay đổi =Số ca phát hiện thay đổi
Tổng số ca thực hiện
Tỷ lệ thông qua = Số ca thông qua
Tổng số ca thực hiện Dưới đây là bảng tỉ lệ phát hiện thay đổi của từng hạng mục theo đơn vị phần trăm:
Biểu đồ 3.1 cho thấy tổng số ca phát hiện sự thay đổi giao diện, trong đó Applitools và Testcomplete có tỷ lệ phát hiện lỗi và thay đổi cao nhờ vào kỹ thuật so sánh đòi hỏi độ chính xác giao diện cao Ngược lại, Testim.io chỉ dựa vào định vị phần tử, dẫn đến việc phát hiện ít lỗi và thay đổi giao diện hơn.
Biểu đồ 3.1: Kết quả tổng số ca theo phần trăm
Số lượng ca phát hiện sự thay đổi giao diện được phân loại theo từng loại phần tử như thể hiện trong bảng 3.11 và biểu đồ 3.2 Tuy nhiên, Testim.io không phát hiện được sự thay đổi nội dung văn bản.
Thông quaPhát hiện thay đổiPhát hiện thất bại
Applitools, Testcomplete và Mabl sử dụng công nghệ khác nhau để phát hiện sự thay đổi nội dung, trong đó Applitools và Mabl dựa vào ảnh màn hình và DOM để nhận diện các thay đổi văn bản hiệu quả Tuy nhiên, việc xác minh các phần tử biểu đồ lại gặp nhiều khó khăn do tính phức tạp của thuộc tính phần tử Testcomplete nổi bật là công cụ duy nhất có khả năng xác minh phần tử biểu đồ nhờ vào công nghệ nhận dạng ký tự quang học, cho phép chuyển đổi ảnh màn hình biểu đồ thành ngôn ngữ máy có thể đọc và xác định dữ liệu cần thiết mà không phụ thuộc vào các thuộc tính như định danh hay đường dẫn.
Tỷ lệ phát hiện = Số ca phát hiện thất bại + Số ca phát hiện thay đổi
Tổng số ca thực hiện
Bảng 3.11: Kết quả tổng số ca theo phần trăm
Phân loại Selenium Applitools Testim.io Test
Số ca phát hiện sự thay đổi giao diện được phân loại theo bảng 3.12 và biểu đồ 3.3 Testcomplete có khả năng xác định 100% vị trí phần tử giao diện thay đổi, nhưng không phát hiện được thay đổi màu sắc do chỉ dịch dữ liệu nội dung Tương tự, Testim cũng không nhận diện được thay đổi màu sắc vì xác minh dựa vào định vị Trong khi đó, Applitools phát hiện thay đổi màu sắc và nội dung với độ chính xác gần như tuyệt đối, còn Mabl có độ chính xác khá cao.
Bảng 3.12: Kết quả loại thay đổi theo phần trăm
Phân loại Selenium Applitools Testim.io Test
Biểu đồ 3.2: Kết quả loại phần tử theo phần trăm
Nội dung văn bản Ảnh Nút Hộp văn bản Thanh thực đơn
Applitools Testim.io Test Complete Mabl
Biểu đồ 3.3: Kết quả loại thay đổi theo phần trăm
So sánh các công cụ
Sau thời gian nghiên cứu và trải nghiệm các công cụ thông qua bản dùng thử, học viên đã thực hiện các so sánh trong bản 3.13 dựa trên kết quả kiểm thử và thống kê được trình bày ở mục 4.9.
Bảng 3.13: So sánh các công cụ STT Hạng mục Applitools Testim.io TestComplete Mabl
1 Mục đích kiểm thử GUI GUI GUI GUI
2 Platform Web Web Web, Mobile,
3 Cài đặt Tiện ích mở rộng
Tiện ích mở rộng Chương trình Tiện ích mở rộng
4 Trường hợp Kiểm tra Kiểm tra giao Kiểm tra biểu Kiểm tra giao
Văn bản Vị trí Màu sắc Phần tử
Applitools Testim.io Test Complete Mabl
41 sử dụng tốt nhất chính xác đến đơn vị điểm ảnh diện người dùng đồ, tập tin pdf diện người dùng
5 AI Thị giác máy tính Học máy
Thị giác máy tính và học máy
Bộ định vị thông minh
Nhận dạng ký tự quang học
Mô hình học máy của Google
7 Bảo trì ca kiểm thử Tự động Tự động Tự động Tự động
Thời gian chạy ca kiểm thử
Chạy ca kiểm thử trên môi trường cục bộ
Chạy ca kiểm thử trên môi trường lưới giao diện
Chrome, Firefox, IE, Edge, Safari
Chrome, Firefox, IE, Edge, Safari
12 Gỡ lỗi Tự động Tự động Tự động Tự động
13 Đưa ra quyết định Không Có Có Có
Số bài đánh giá trên
Garter- trang đánh giá công nghệ
Garter- trang đánh giá công nghệ
Số bài đánh giá của đồng nghiệp học viên
17 Đánh giá theo đồng nghiệp học viên 4.3/5 4.1/5 4.5/5 4.0/5
18 Đánh giá của học viên 4.3/5 4.0/5 4.3/5 4.0/5
Kết quả đánh giá theo đồng nghiệm của học viên được đính kèm cuối mục tài liệu tham khảo