1. Trang chủ
  2. » Luận Văn - Báo Cáo

Phương pháp sinh bộ kiểm thử tự động cho kiểm thử giao diện ứng dụng web

63 7 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 63
Dung lượng 2,16 MB

Nội dung

ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CÔNG NGHỆ HÀ KHÁNH TOÀN PHƢƠNG PHÁP SINH BỘ KIỂM THỬ TỰ ĐỘNG CHO KIỂM THỬ GIAO DIỆN ỨNG DỤNG WEB LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN Hà Nội - 2013 ĐẠI HỌC QUỐC GIA HÀ NỘI TRƢỜNG ĐẠI HỌC CƠNG NGHỆ HÀ KHÁNH TỒN PHƢƠNG PHÁP SINH BỘ KIỂM THỬ TỰ ĐỘNG CHO KIỂM THỬ GIAO DIỆN ỨNG DỤNG WEB Ngành: Công nghệ thông tin Chuyên ngành: Công nghệ phần mềm Mã số: 60 48 10 LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN NGƢỜI HƢỚNG DẪN KHOA HỌC: TS LÊ THANH HÀ Hà Nội - 2013 i LỜI CAM ĐOAN Tôi xin cam đoan công trình nghiên cứu tơi dƣới giúp đỡ lớn Giảng viên hƣớng dẫn Tiến sĩ Lê Thanh Hà, Tiến sĩ Phạm Ngọc Hùng Những nội dung nghiên cứu kết đề tài hoàn tồn trung thực Các trích dẫn từ nguồn tài liệu bên đƣợc liệt kê rõ ràng phần cuối luận văn Hà Nội, tháng 12 năm 2013 Học viên Hà Khánh Toàn ii LỜI CẢM ƠN Để hồn thành đề tài luận văn thạc sĩ cách hoàn chỉnh, bên cạnh nỗ lực cố gắng thân cịn có hƣớng dẫn nhiệt tình q Thầy Cơ, nhƣ động viên ủng hộ gia đình bạn bè suốt thời gian học tập, nghiên cứu thực luận văn thạc sĩ Xin chân thành bày tỏ lòng biết ơn sâu sắc đến Tiến sĩ Lê Thanh Hà, Tiến sĩ Phạm Ngọc Hùng, ngƣời dành nhiều thời gian tâm huyết hƣớng dẫn nghiên cứu hoàn thành luận văn thạc sĩ Xin gửi lời tri ân điều mà Thầy dành cho tơi Xin chân thành bày tỏ lịng biết ơn đến tồn thể q Thầy Cơ khoa Công Nghệ Thông Tin Trƣờng Đại Học Công Nghệ - Đại Học Quốc Gia Hà Nội tận tình truyền đạt kiến thức quý báu nhƣ tạo điều kiện thuận lợi cho suốt trình học tập, nghiên cứu thực đề tài luận văn Cuối cùng, xin chân thành bày tỏ lòng cảm ơn đến Ban lãnh đạo Hệ thống Đào tạo Lập trình viên Quốc tế Aprotrain-Aptech tạo điều kiện cho nhiều suốt trình làm việc, học tập thực đề tài luận văn thạc sĩ Mặc dù tơi cố gắng hoàn thiện luận văn tất nhiệt tình lực Tuy nhiên trình độ, kinh nghiệm khả chuyên mơn có hạn, chắn luận văn cịn nhiều thiếu sót Rất mong nhận đƣợc góp ý quý Thầy Cô bạn Hà Nội, tháng 12 năm 2013 Học viên Hà Khánh Toàn iii MỤC LỤC TRANG PHỤ BÌA LỜI CAM ĐOAN LỜI CẢM ƠN MỤC LỤC DANH MỤC CÁC TỪ VIẾT TẮT DANH MỤC CÁC BẢNG DANH MỤC CÁC HÌNH VẼ CHƢƠNG GIỚI THIỆU CHƢƠNG CƠ SỞ LÝ THUYẾT 2.1 Khái niệm Web Application 2.2 Các kỹ thuật kiểm thử 2.2.1 Kiểm thử hộp đen 2.2.3 Kiểm thử hộp xám 2.2.4 Kiểm thử dựa mơ hình 2.2.5 Kiểm thử sử dụng máy hữu hạn trạng thái 2.3 Các mức kiểm thử 11 2.3.1 Kiểm thử đơn vị 12 2.3.2 Kiểm thử tích hợp 12 2.3.3 Kiểm thử hệ thống 13 2.3.4 Kiểm thử chấp nhận 13 2.4 BỘ CÔNG CỤ SELENIUM – WEBDRIVER TRONG VIỆC KIỂM THỬ GIAO DIỆN ỨNG DỤNG WEB 13 2.4.1 Tổng quan Selenium 14 2.4.2 Selenium-RC (Remote Control) 14 2.4.3 Selenium (Selenium – Webdriver) 15 2.4.4 Một số Selenium-Webdriver API 15 CHƢƠNG PHƢƠNG PHÁP SINH BỘ KIỂM THỬ TỰ ĐỘNG CHO KIỂM THỬ GIAO DIỆN ỨNG DỤNG WEB 18 iv 3.1 Mục tiêu phƣơng pháp nghiên cứu 18 3.2 Tổng quan 18 3.3 Tạo ca kiểm thử cho ứng dụng Web 19 3.3.1 Xây dựng mơ hình máy hữu hạn trạng thái 19 3.3.2 Xây dựng mơ hình đồ thị cho máy hữu hạn trạng thái 27 3.3.3 Thực việc tạo ca kiểm thử 30 3.3.4 Thuật toán sinh ca kiểm thử 30 CHƢƠNG THỰC NGHIỆM 32 4.1 Phƣơng pháp thực 32 4.2 Xây dựng công cụ kiểm thử tự động 32 4.2.1 Mô tả công cụ kiểm thử 33 4.2.2 Xây dựng ứng dụng Web 34 4.2.3 Xây dựng máy hữu hạn trạng thái cho ứng dụng Web 38 4.3 Kết thử nghiệm chƣơng trình 41 4.4 Thảo luận 44 CHƢƠNG KẾT LUẬN 45 PHỤ LỤC 47 TÀI LIỆU THAM KHẢO 54 v DANH MỤC CÁC TỪ VIẾT TẮT Viết tắt Cụm từ đầy đủ Ý nghĩa FSM Finite State Machine Máy hữu hạn trạng thái HTTP Hypertext Transfer Protocol Giao thức truyền siêu văn WSDL Web Services Description Language Ngôn ngữ mô tả dịch vụ Web SOAP Simple Object Access Protocol Giao thức truy cập đối tƣợng đơn giản API Application Programming Interface Giao diện lập trình ứng dụng UML Unified Modeling Language Ngơn Ngữ Mơ Hình Hóa Thống Nhất SWEBOK Software Engineering Body of Knowledge Tổ chức quốc tế theo chuẩn ISO/IEC TR 19759:2005 vi DANH MỤC CÁC BẢNG Số hiệu bảng Tên bảng Trang 2.1 Bảng chuyển trạng thái 10 3.1 Bảng chuyển trạng thái trang login.aspx 20 3.2 Bảng chuyển trạng thái trang studentInformation.aspx 21 3.3 Bảng chuyển trạng thái trang resultStudent.aspx 22 3.4 Bảng chuyển trạng thái trang addMark.aspx 3.5 Bảng chuyển trạng thái trang logout.aspx 27 4.1 Các phần tử html trang login.aspx 38 4.2 Bảng trạng thái trang login.aspx 38 4.3 Bảng kiện trang login.aspx 38 4.4 Bảng biểu diễn trạng thái chuyển trang login.aspx 39 4.5 Các phần tử html trang studentInformation.aspx 39 4.6 Bảng trạng thái trang studentInformation.aspx 39 4.7 Bảng kiện trang studentInformation.aspx 39 4.8 Bảng biểu diễn trạng studentInformation.aspx 4.9 Các phần tử html trang resultStudent.aspx 40 4.10 Bảng trạng thái trang resultStudent.aspx 40 4.11 Bảng kiện trang resultStudent.aspx 40 4.12 Bảng biểu diễn resultStudent.aspx 4.13 Bảng trạng thái trang logout.aspx 41 4.14 Bảng kiện trang logout.aspx 41 4.15 Bảng biểu diễn trạng thái chuyển trang logout.aspx 41 trạng thái thái chuyển chuyển 24-25-26 trang trang 39 41 vii DANH MỤC CÁC HÌNH VẼ Số hiệu hình vẽ Tên hình vẽ Trang 2.1 Kiểm thử hộp đen 2.2 Một ví dụ kiểm thử hộp trắng 2.3 Sơ đồ luồng điều khiển đƣợc tạo từ chƣơng trình 2.4 Các bƣớc thực kiểm thử mơ hình 2.5 Mơ hình đồ thị máy FSM 11 3.1 Máy hữu hạn trạng thái cho trang login.aspx 27 3.2 Máy hữu hạn trạng thái cho trang studentInformation.aspx 28 3.3 Máy hữu hạn trạng thái cho trang ResultStudent.aspx 28 3.4 Máy hữu hạn trạng thái cho trang addMark.aspx 29 3.5 Máy hữu hạn trạng thái cho trang logout.aspx 30 3.6 Thuật toán duyệt đồ thị theo chiều sâu 31 4.1 Sơ đồ xây dựng toán 33 4.2 Giao diện chƣơng trình 34 4.3 Giao diện trang Login.aspx 35 4.4 Giao diện trang studentInformation.aspx 36 4.5 Giao diện trang resultStudent.aspx 36 4.6 Giao diện trang addMark.aspx 37 4.7 Giao diện trang logout.aspx 37 CHƢƠNG GIỚI THIỆU Ngày nay, phát triển Internet thúc đẩy nhu cầu cộng tác làm việc qua mạng sử dụng dịch vụ trực tuyến dần trở thành nhu cầu thiết yếu sống Xu hƣớng địi hỏi ứng dụng khơng hệ thống đơn lẻ máy chịu phụ thuộc vào tảng cố định nữa, mà chúng phải hệ thống linh hoạt giúp ngƣời dùng làm việc “mọi lúc, nơi” Do đó, việc phát triển ứng dụng Web xu hƣớng tất yếu ngành công nghiệp phần mềm Các ứng dụng Web đƣợc ứng dụng rộng rãi thực tế Càng ngày doanh nghiệp nói chung ngƣời nói riêng phụ thuộc vào ứng dụng Web làm để ứng dụng Web đáp ứng đƣợc nhu cầu Do đó, nhu cầu đảm bảo an tồn chất lƣợng sản phẩm phần mềm ứng dụng Web ngày trở nên cấp thiết Việc đảm bảo chất lƣợng phần mềm tốn khó tiêu tốn 50% cơng sức chi phí doanh nghiệp phần mềm Kiểm thử đƣợc quan tâm nhƣ phƣơng pháp chủ yếu để đảm bảo chất lƣợng sản phẩm phần mềm ứng dụng Web nói riêng sản phẩm phần mềm nói chung Trong thực tế, cơng ty gặp nhiều khó khăn, tốn thời gian chi phí cao cho việc kiểm thử ứng dụng Web Mặc dù họ thuê ngƣời kiểm thử có kỹ kiểm thử giỏi, song sai sót thiếu sót kiểm thử ứng dụng Web tránh khỏi phƣơng pháp kiểm thử ứng dụng Web thƣờng đƣợc thực thủ cơng Do đó, phƣơng pháp kiểm thử không đảm bảo phát tất lỗi Ngồi ra, việc kiểm thử thủ cơng ứng dụng Web tẻ nhạt tốn thời gian (đôi tƣơng tác ngƣời dùng lớn), đặc biệt thực kiểm thử qui hồi ứng dụng Kết ứng dụng Web tiềm ẩn nhiều lỗi sau triển khai cho khách hàng Trong kiểm thử ứng dụng Web, kiểm thử tƣơng tác giao diện ngƣời dùng vấn đề khó thƣờng đƣợc thực thủ công Trong thực tế, có thiết kế giao diện ngƣời dùng mơ tả việc thay đổi trạng thái hình ứng với tƣơng tác ngƣời dùng Các thay đổi trạng thái xảy trang Web từ trang Web sang trang Web khác Làm để đảm bảo việc cài đặt tuân thủ theo thiết kế mục đích kiểm thử tƣơng tác giao diện ngƣời dùng cho ứng dụng Web Các kỹ thuật kiểm thử tự động đƣợc biết đến nhƣ giải pháp tiềm để giải vấn đề Những kỹ thuật phát tất lỗi ứng dụng cách tạo thực tự động ca kiểm thử Kết là, tiết kiệm thời gian chi phí kiểm thử Tự động kiểm thử trình thực 40 studentName f_main error - - t_submit - - Tiếp theo máy hữu hạn trạng thái cho trang resultStudent.aspx Bảng 4.9 Các phần tử html trang resultStudent.aspx id Tên thẻ HTML Kiểu txtStudentName Textbox Giá trị mặc định - ddlKhoaHoc dropdownlist Chọn khóa học btnSubmit title_index title_error button title title title index error main Mơ tả Ơ nhập cho tên sinh viên Danh sách chọn khóa học Nút gửi liệu Tiêu đề trang Tiêu đề trang bị lỗi Tiêu đề trang thành công title_main Bảng 4.10 Bảng trạng thái trang resultStudent.aspx Tên trạng thái S_ResultStudent StudentName KhoaHoc stdName+KhoaHoc F_main Error null value Null value _ _ null null value value _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ value value value value _ _ Bảng 4.11 Bảng kiện trang resultStudent.aspx Tên kiện t_stdName Select_khoahoc del_stdName del_khoahoc t_submit Định danh Phần tử 1 Thao tác Mô tả addtext Select Deltext Noselect Click Nhập liệu văn vào nhập Chọn khóa học Xóa liệu nhập Bỏ chọn khóa học Gửi liệu lên server 41 Bảng 4.12 Bảng biểu diễn trạng thái chuyển trang resultStudent.aspx Result Student.aspx s_Result Student Student Name Khoahoc Student+K F_main hoaHoc error s_ResultStudent - t_StdName select_ khoahoc - - t_submit - - - t_submit - t_submit StudentName Khoahoc t_ StdName select_ khoahoc del_StdName del_khoahoc - - Student+KhoaHoc F_main error - - t_submit - Cuối máy hữu hạn trạng thái cho trang đăng xuất Trong trang không chứa phần tử html có trạng thái, kiện trạng thái chuyển đƣợc biểu diễn bảng 4.13, bảng 4.14 bảng 4.15 Bảng 4.13 Bảng trạng thái trang logout.aspx Tên trạng thái t_login_link - - Bảng 4.14 Bảng kiện trang logout.aspx Tên kiện t_login_link Phần tử html - Thao tác click vào liên kết Bảng 4.15 Bảng biểu diễn trạng thái chuyển trang logout.aspx Logout.aspx s_end F_login s_end - F_login t_login_link - 4.3 Kết thử nghiệm chƣơng trình Sau đƣa phần tử HTML, trạng thái, kiện, trạng thái chuyển mô tả vào chƣơng trình chạy thực nghiệm, kết thu đƣợc nhƣ sau: Đối với trang login.aspx, sau chạy thuật toán ta thu đƣợc kết nhƣ sau: với mƣời đƣờng kiểm thử Dữ liệu đầu vào: 42 Tổng số phần tử html: Tổng số trạng thái: Tổng số kiện: Tổng số trạng thái chuyển: 15 Tổng số ca kiểm thử: 11 Chƣơng trình đọc tệp thành cơng Test path 1: S_index*t_passwd=passwd Test path 2: S_index*t_submit=error Test path 3: S_index*t_passwd=passwd*t_reset=S_index Test path 4: S_index*t_passwd=passwd*t_usrname=usr+pass Test path 5: S_index*t_reset = S_index*t_usrname = usrname*t_reset = S_index Test path 6: S_index*t_reset = S_index*t_usrname = usrname*t_submit = error Test path 7: S_index*t_passwd = passwd*t_usrname = usr+pass*t_reset = S_index Test path 8: S_index*t_passwd usr+pass*del_passwd = usrname = passwd*t_usrname = Test path 9: S_index*t_reset = S_index*t_usrname = usrname*t_passwd = usr+pass*t_submit = F_main Test path 10: S_index*t_reset = S_index*t_usrname = usrname*t_submit = error*t_prev = S_index Test path 11: S_index*t_reset = S_index*t_usrname = usrname*t_passwd = usr+pass*del_usrname = passwd*t_submit=error Tiếp theo kết trang thông tin học viên ta thu đƣợc hai đƣờng kiểm thử: Dữ liệu đầu vào: Tổng số phần tử html: Tổng số trạng thái: Tổng số kiện: Tổng số trạng thái chuyển: 43 Tổng số ca kiểm thử: Test path 1: s_StudentInfo * StudentNameText = StudentName * submit = studentInformation.aspx Tức từ trạng thái ban đầu ngƣời dùng nhập tên học viên vào ô nhâp sau bấm vào nút Submit trang thơng tin học viên Ca kiểm thử thành cơng Test path 2: S_ StudentInfo * Submit = errorSt Ngƣời dùng từ trạng thái ban đầu bấm nút submit trạng thái lỗi Ca kiểm thử thành công Đối với trang resultStudent.aspx, sau chạy thuật toán ta thu đƣợc kết nhƣ sau: với năm đƣờng kiểm thử Dữ liệu đầu vào: Tổng số phần tử html: Tổng số trạng thái: Tổng số kiện: Tổng số trạng thái chuyển: 10 Tổng số ca kiểm thử: Test path 1: s_ResultStudent * select_khoahoc = KhoaHoc * t_stdnameText = StudentName+Khoahoc*Submit = resultStudent.aspx Tức từ trạng thái ban đầu ngƣời dùng chọn khóa học sau ngƣời dùng chọn tên học viên theo khóa bấm vào nút Submit trang kết học tập học viên Ca kiểm thử thành cơng Test path 2: S_ResultStudent * Select_khoahoc = Khoahoc*Submit = errorSt Ngƣời dùng từ trạng thái ban đầu chọn khóa học sau bấm nút submit trạng thái lỗi Ca kiểm thử thành công Test path 3: S_ResultStudent * t_StdNameText = StudentName * select_khoahoc = StudentName+Khoahoc*Submit = resultStudent.aspx Ngƣời dùng từ trạng thái ban đầu chọn tên học viên sau chọn khóa học bấm nút submit trạng kết học tập Ca kiểm thử thành công Test path 4: S_ResultStudent * t_StdNameText = StudentName * Submit = errorSt Ngƣời dùng từ trạng thái ban đầu chọn tên học viên sau bấm vào nút submit trạng thái lỗi Ca kiểm thử khơng thành công Test path 5: _ResultStudent * Submit = errorSt Ngƣời dùng từ trạng thái ban đầu bấm nút submit trạng thái lỗi Ca kiểm thử thành công 44 Cuối kết kết trang đăng xuất ta thu đƣợc đƣờng kiểm thử: Dữ liệu đầu vào: Tổng số phần tử html: Tổng số trạng thái: Tổng số kiện: Tổng số trạng thái chuyển: Tổng số ca kiểm thử: Test path 1: s_end * t_login_link = login.aspx Tức từ trạng thái ban đầu ngƣời dùng nhấp vào liên kết trang đăng nhập chuyển đến trang đăng nhập Ca kiểm thử thành công 4.4 Thảo luận Để kiểm tra tính đắn chƣơng trình kiểm thử, trang kết học tập tạo lỗi để kiểm thử xem chƣơng trình có phát lỗi hay khơng Nhƣ sau chạy chƣơng trình kiểm thử tự động cho trang kết học tập học viên sinh đƣợc năm ca kiểm thử có ca kiểm thử không thành công bốn ca kiểm thử thành công Đồng thời sau kiểm thử lại thủ công ca kiểm thử có ca kiểm thử không thành công Sau hiệu chỉnh lại trang kết ứng dụng Web, chạy lại chƣơng trình kiểm thử năm ca kiểm thử thành cơng Từ thấy đƣợc tính đắn chƣơng trình tự động kiểm thử 45 CHƢƠNG KẾT LUẬN Một hoạt động cơng ty việc đảm bảo chất lƣợng phần mềm kiểm thử giao diện ứng dụng Tuy nhiên, kiểm thử phần mềm nói chung kiểm thử giao diện nói riêng đƣợc biết đến nhƣ pha quan trọng nhất, tốn mắt xích yếu quy trình phát triển phần mềm Giải pháp phổ biến để giải vấn đề áp dụng phƣơng pháp kiểm thử tự động Các phƣơng pháp gồm hai pha chính: (i) sinh ca kiểm thử (ii) thực thi chúng nhằm phát lỗi/khiếm khuyết sản phẩm Những phƣơng pháp hứa hẹn hiệu việc đảm bảo chất lƣợng sản phẩm với thời gian nhanh chi phí thấp khả phát lỗi/khiếm khuyết tốt Tuy nhiên, phƣơng pháp kiểm thử tự động đƣợc áp dụng để kiểm thử mơ-đun chƣơng trình Làm để kiểm thử tự động cho giao diện ngƣời dùng tốn mở chƣa có giải pháp thỏa đáng Luận văn nghiên cứu đƣợc phƣơng pháp kiểm thử, kiểm thử tự động, kiểm thử dựa mơ hình cơng cụ hỗ trợ Tạo ca kiểm thử tự động cho trình kiểm thử giao diện ứng dụng Web cách sử dụng phƣơng pháp tiếp cận dựa mơ hình sử dụng máy hữu hạn trạng thái Luận văn xây dựng đƣợc mơ hình bảng chuyển ứng dụng Web Từ đó, xây dựng đƣợc máy hữu hạn trạng thái, sau áp dụng thuật tốn duyệt theo chiều sâu để từ máy hữu hạn trạng thái sinh đƣờng kiểm thử chƣơng trình dùng cơng cụ Selenium Webdriver để chạy đƣợc đƣờng kiểm thử Tiến hành cài đặt áp dụng cho số ứng dụng Web nhằm đánh giá tính thực tế hiệu phƣơng pháp nghiên cứu Nội dung luận văn nêu lên đƣợc nội dung kiểm thử kiểm thử giao diện ứng dụng Web Xây dựng thành cơng chƣơng trình kiểm thử tự động giao diện ứng dụng Web nhiên, chƣơng trình áp dụng đƣợc vào ứng dụng Web đơn giản với giao diện không nhiều thành phần phức tạp Thực tế ứng dụng Web thƣờng phức tạp, trang có trạng thái chuyển đến trạng thái khác trang đến trạng thái khác ngồi trang tùy thuộc vào vai trị ngƣời dùng Vì hƣớng nghiên cứu tơi tối ƣu hóa chƣơng trình xây dựng đƣợc thêm chức kiểm thử tự động ứng dụng Web có thành phần phức tạp Thêm nữa, với thuật toán quay lui duyệt đồ thị theo chiều sâu chƣa thực tối ƣu cải thiện thuật tốn tốt để tăng hiệu chƣơng trình Chƣơng trình chạy đƣợc thực việc kiểm thử cho trang, hƣớng nghiên cứu nghiên cứu để kiểm thử cho toàn ứng dụng Web cách ghép 46 ôtômat trang riêng rẽ lại với dùng trạng thái kết thúc ôtômat trạng thái ban đầu trang Mặt khác dùng phƣơng pháp để sử dụng cho phƣơng pháp kiểm thử khác nhƣ kiểm thử chịu tải, kiểm thử an ninh an toàn,… 47 PHỤ LỤC Lớp HTML element: Lớp miêu tả phần tử HTML với thuộc tính nhƣ ID, HTML_ID, kiểu phần tử HTML, giá trị phần tử HTML public class Element_html { private int id; private String html_id; private String type; private ArrayList values; public Element_html(int _id, String _html_id, String _type, ArrayList _values){ id=_id; html_id=_html_id; type=_type; values = _values; } public int getId(){ return id; } public String getHtml_id(){ return html_id; } public String getType(){ return type; } public String getValueAt(int i){ return values.get(i); } } Lớp danh sách phần tử html: Lớp miêu tả danh sách phần tử HTML public class Elem_html_list { 48 ArrayList arrElement; public Elem_html_list(){ arrElement = new ArrayList(); } public void addElement(Element_html _e){ arrElement.add(_e); } public Element_html getElementById(int id){ for (int i=0; i

Ngày đăng: 16/03/2021, 12:26

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN