1. Trang chủ
  2. » Công Nghệ Thông Tin

Phân tích khả năng kiểm thử chương trình hướng đối tượng Java

5 5 0

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

THÔNG TIN TÀI LIỆU

Nội dung

Bài viết tập trung nghiên cứu và phân tích các độ đo KNKT hướng đối tượng đề xuất việc áp dụng các độ đo phân tích khả năng kiểm thử chương trình hướng đối tượng Java.

ISSN 1859-1531 - TẠP CHÍ KHOA HỌC VÀ CƠNG NGHỆ ĐẠI HỌC ĐÀ NẴNG, SỐ 12(97).2015, QUYỂN 25 PHÂN TÍCH KHẢ NĂNG KIỂM THỬ CHƯƠNG TRÌNH HƯỚNG ĐỐI TƯỢNG JAVA TESTABILITY ANALYSIS OF JAVA OBJECT - ORIENTED PROGRAMS Nguyễn Thị Thúy Hồi1, Nguyễn Thanh Bình2 Trường Cao đẳng Công nghệ, Đại học Đà Nẵng; thuy.hoai@yahoo.com Trường Đại học Bách khoa, Đại học Đà Nẵng; ntbinh@dut.udn.vn Tóm tắt - Kiểm thử phần mềm hoạt động nhằm đảm bảo chất lượng phần mềm Tuy nhiên, phần mềm lớn phức tạp, hoạt động kiểm thử địi hỏi nhiều thời gian cơng sức Vì vậy, việc sớm có thơng tin chương trình cần thiết cho trình kiểm thử nhằm nâng cao chất lượng sản phẩm phần mềm Việc phân tích khả kiểm thử (PTKNKT) phần mềm giúp đánh giá sớm chi phí kiểm thử, nghĩa thơng tin phần mềm dễ dàng hay khó khăn kiểm thử Khi phương pháp phát triển hướng đối tượng đời phương pháp phân tích truyền thống khơng cịn phù hợp đặc thù riêng phương pháp Trong báo này, tập trung nghiên cứu phân tích độ đo KNKT hướng đối tượng Từ đó, chúng tơi đề xuất việc áp dụng độ đo PTKNKT chương trình hướng đối tượng Java Các độ đo tích hợp vào cơng cụ Eclipse, tính cách tự động, thử nghiệm cho số chương trình thực tế mang lại thơng tin hữu ích Abstract - Testing software is one of the activities which plays an im portant role in the process of software development and is used to measure the quality of software However, with large and com plex software, testing requires a lot of time and effort Therefore, getting information from early software testing is necessary to improve the quality of software Testability analysis can help the programm ers measure the cost of testing earlier and getting more testing information whether it will be easy or complex when testing Currently, after the method of objectoriented programming was introduced, the old ones are no longer appropriate due to their own characteristics of In this article, we focus on studying the testability analysis that is based on metrics and we propose the application of the metrics into analyzing testability of Java object-oriented programs The m easures are integrated into Eclipse tool and autom atically calculated These metrics are applied to some Java applications and the results m ay help designers get useful inform ation Từ khóa - chất lượng phần mềm; phân tích khả kiểm thử; độ đo; phần mềm hướng đối tượng; chương trình hướng đối tượng Java Key words - quality of software; testability; metrics; objectoriented software, Java object-oriented program s Đặt vấn đề Phân tích KNKT phần mềm Kiểm thử phần mềm hoạt động quan trọng tiến trình phát triển phần mềm nhằm mục đích giải đáp thắc mắc liệu chương trình có lỗi hay không? 2.1 Khái niệm PTKNKT phần mềm hoạt động đánh giá khó khăn thực kiểm thử, tập trung tìm xác suất phát lỗi chương trình KNKT phần mềm khả phần mềm dễ dàng hay phức tạp thực kiểm thử không Hoạt động nhằm đánh giá chất lượng bên phần mềm giúp người thiết kế cải tiến chất lượng mã nguồn hay kiểm thử viên lập kế hoạch phân bố nguồn tài nguyên kiểm thử cách hợp lý Kết hoạt động PTKNKT cho biết phần mềm dàng hay phức tạp kiểm thử Với phần mềm lớn phức tạp việc thực thủ tục kiểm thử địi hỏi nhiều thời gian cơng sức Việc sớm có thơng tin hệ thống chương trình, nghĩa thông tin phần mềm dễ dàng hay phức tạp kiểm thử, công việc đặt lên hàng đầu nhằm giảm rủi ro đánh giá sớm chi phí thực kiểm thử Những thơng tin có nhờ hoạt động PTKNKT phần mềm PTKNKT phần mềm hoạt động đánh giá khó khăn thực kiểm thử, tập trung tìm xác suất phát lỗi chương trình Trước đây, nhiều độ đo McCabe, Halstead [2]… sử dụng để đánh giá độ phức tạp khả kiểm thử (KNKT) hàm thủ tục theo phương pháp phát triển hướng chức Tuy nhiên, phương pháp phát triển hướng đối tượng (HĐT) đời phép đo khơng cịn phù hợp tính đặc thù riêng phương pháp Vì vậy, thực tiễn địi hỏi phải có phép đo phù hợp để đánh giá khả kiểm thử phần mềm phát triển HĐT cách xác Việc đời độ đo sử dụng cho chương trình phát triển HĐT dựa vào mã nguồn, số lượng lớp, phương thức, lớp mối quan hệ lớp giúp công việc đánh giá KNKT phần mềm hướng đối tượng xác hiệu 2.2 Các phương pháp PTKNKT phần mềm Để giảm bớt thời gian chi phí cho giai đoạn kiểm thử, công việc PTKNKT thực nhằm trả lời câu hỏi kiểm thử viên có nên thực kiểm thử phần mềm hay yêu cầu cải tiến chất lượng phần mềm Do đó, hoạt động cần phải có phương pháp đánh giá phần mềm xác hiệu Trong phần này, chúng tơi trình bày số phương pháp đánh giá KNKT phần mềm 2.2.1 Phương pháp PTKNKT miền Chương trình có KNKT theo miền [3] khơng tồn tính khơng qn đầu vào-ra, hay nói cách khác có khả kiểm thử dễ dàng KNKT miền liên quan đến khả quan sát khả điều khiển Một thủ tục có KNKT miền có khả quan sát khả điều khiển Các chương trình khơng có KNKT gây khó 26 Nguyễn Thị Thúy Hồi, Nguyễn Thanh Bình khăn cho trình kiểm thử KNKT miền định nghĩa khả dễ dàng chỉnh sửa chương trình để tăng khả quan sát điều khiển 2.2.2 Phương pháp PTKNKT dựa độ nhạy Để đo KNKT, khái niệm độ nhạy định nghĩa [4]: độ nhạy vị trí S dự đốn xác suất lỗi vị trí S gây cố cho phần mềm với miền đầu vào định Phương pháp phân tích độ nhạy hay cịn gọi phương pháp phân tích PIE gồm phân tích thực thi, phân tích ảnh hưởng phân tích lan truyền PIE có tính chất động u cầu thực thi mã nguồn Các liệu đầu vào lựa chọn ngẫu nhiên từ miền liệu vào Trạng thái tính tốn mã nguồn liệu vào so sánh ngược với trạng thái mã nguồn tương tự Java xây dựng dựa tảng C C++ ngôn ngữ vừa biên dịch vừa thông dịch Mục tiêu nhà thiết kế Java cho phép người lập trình viết chương trình lần chạy phần cứng khác Ngơn ngữ Java có đặc điểm quan trọng tính đóng gói, tính thừa kế tính đa hình Từ phương pháp PTKNKT phần mềm HĐT đặc điểm ngôn ngữ Java, đề xuất áp dụng số độ đo PTKNKT phần mềm phát triển theo phương pháp HĐT Java Bảng [7] [8] Bảng Các độ đo sử dụng đánh giá KNKT phần mềm HĐT Metric Độ đo Coupling Factor (CF) Độ đo phụ thuộc Lack of Cohension of Methods Độ đo gắn kết yếu phương thức Cyclomatic Complexity Độ phức tạp vịng Attribute Hiding Factor (AHF) Độ đo thuộc tính ẩn Method Hiding Factor (MHF) Độ đo phương thức ẩn Depth of Inheritance Tree (DIT) Độ sâu thừa kế Number of Children (NOC) Số lượng lớp Weighted Methods Per Class (WMC) Độ phức tạp phương thức lớp Method Inheritance Factor (MIF) Độ đo phương thức thừa kế Attribute Inheritance Factor (AIF) Độ đo thuộc tính thừa kế 3.1.1 Phương pháp sử dụng độ đo dựa đặc tính phần mềm HĐT Nested Block Depth (NBT) Độ đo tính độ sâu khối mã nguồn lồng Kết độ đo đánh giá KNKT dễ dàng nhận lỗi tồn giai đoạn thiết kế lập trình trước Từ đặc thù riêng phương pháp phát triển phần mềm HĐT, sáu độ đo đề xuất để đánh giá KNKT phần mềm HĐT [8]: Number of Classes Số lượng lớp Lines of Code Số dịng lệnh Phân tích KNKT phần mềm HĐT Có nhiều phương pháp PTKNKT phần mềm phát triển theo phương pháp HĐT Mỗi phương pháp có ưu nhược điểm riêng Mục trình bày tổng quan phương pháp phân tích KNKT phần mềm HĐT 3.1 Các phương pháp PTKNKT sử dụng độ đo mã nguồn Tính thừa kế che dấu liệu hai đặc điểm đem đến chế thiết kế mạnh mẽ cho phương pháp phát triển phần mềm HĐT Vì vậy, phương pháp PTKNKT sử dụng độ đo mã nguồn đời dựa đặc điểm phương pháp phát triển phần mềm HĐT + Độ đo 1: tính độ rộng phương thức lớp; + Độ đo 2: tính độ sâu thừa kế; + Độ đo 3: tính số lớp con; + Độ đo 4: tính số lượng liên kết lớp đối tượng; + Độ đo 5: tính số lần phản hồi lớp; + Độ đo 6: tính liên kết yếu phương thức 3.1.2 Phương pháp down- calling Down-calling [6] kỹ thuật dùng để đảm bảo tính quán lớp Hầu hết ngơn ngữ lập trình quan tâm đến cú pháp phương thức, không quan tâm đến ngữ nghĩa không cung cấp phương pháp đánh giá chúng cách thống Down-calling chế dùng để bảo đảm mặt cú pháp ngữ nghĩa quán phương thức không đa hình phương thức đa hình tất lớp dẫn xuất dùng thể lớp dẫn xuất thay cho thể lớp sở Do đó, dẫn xuất lớp thừa kế phương thức khơng đa hình thực thi Các độ đo sử dụng phân tích KNKT chương trình HĐT Java Ngơn ngữ lập trình Java nhanh chóng trở thành ngơn ngữ lập trình lập trình viên chuyên nghiệp 4.1 Độ đo khả liên kết yếu phương thức Độ đo LCOM tính cách đếm số cặp phương thức gọi đến biến thành phần giống lớp trừ số cặp phương thức không gọi đến biến thành phần giống với phương thức lại 4.2 Các độ đo liên quan đến tính đóng gói 4.2.1 Độ đo khả che dấu thuộc tính Cơng thức sau: AHF   TC i 1 Ah  Ci   TC i 1 Ad  Ci  Trong đó: TC  tổng lớp; Ad  Ci   Av  Ci   Ah  Ci   thuộc tính định nghĩa Ci ; Av  Ci   thuộc tính thấy lớp Ah  Ci   thuộc tính ẩn lớp Ci ; Ci ; 4.2.2 Độ đo khả che dấu phương thức Công thức sau: MHF   TC i 1 M h  Ci   TC i 1 M d  Ci  Trong đó: TC  tổng lớp; M d  Ci   M v  Ci   M h  Ci   phương thức ISSN 1859-1531 - TẠP CHÍ KHOA HỌC VÀ CÔNG NGHỆ ĐẠI HỌC ĐÀ NẴNG, SỐ 12(97).2015, QUYỂN 27 4.3 Các độ đo liên quan đến tính thừa kế M  E  N  P với M kết độ đo McCabe, E số cạnh đồ thị chương trình, N số nút đồ thị P số đường kết nối Ngoài ra, McCabe tính cơng thức M  D  với D nút định đồ thị 4.3.1 Độ sâu thừa kế Bảng Số liệu so sánh McCabe độ phức tạp mã nguồn định nghĩa Ci; M v  Ci   phương thức thấy lớp Ci; M h  Ci   phương thức ẩn lớp Ci Độ phức tạp McCabe Công thức sau: DIT  c   Ancestors  c  Trong đó, Ancestors  c  tập lớp mà lớp c thừa kế trực tiếp gián tiếp 4.3.2 Số lượng lớp Công thức sau: 1-10 Chương trình đơn giản, khơng chứa nhiều rủi ro 11-20 Chương trình phức tạp hơn, tính rủi ro trung bình 21-50 Chương trình phức tạp, tính rủi ro cao >50 Khơng có khả kiểm thử, tính rủi ro cao 4.5 Độ đo tính phụ thuộc đối tượng NOC  c   Children  c  Trong đó, Children  c  tập lớp thừa kế trực tiếp từ lớp c 4.3.3 Độ đo khả thừa kế thuộc tính (AIF)  TC i 1 Ai  Ci  Công thức sau: AIF  Độ phức tạp mã nguồn  TC i 1 Aa  Ci  Trong đó: TC  tổng lớp; Aa  Ci   Ad  Ci   Ai  Ci   thuộc tính thấy Ci; Ad  Ci   An  Ci   Ao  Ci   thuộc tính Ci; An  Ci   thuộc tính lớp Ci;  Trong đó: TC  tổng lớp; TC  TC   số cặp phụ thuộc lớn hệ   thống lớp T C;   TC i 1 DC  Ci   số cặp phụ thuộc lớn thừa kế   is _ client Ci , C j  Ao  Ci   thuộc tính overriding lớp Ci; Ai  Ci   thuộc tính thừa kế lớp Ci 4.3.4 Độ đo khả thừa kế phương thức (MIF) Công thức sau: MIF   TC i 1 M i  Ci   TC i 1 M a  Ci  Trong đó: TC  tổng lớp; M a  Ci   M d  Ci   M i  Ci   phương thức Ci; M d  Ci   M n  Ci   M o  Ci   phương thức Ci; M n  Ci   phương thức lớp Ci; M o  Ci   phương thức overiding lớp Ci; M i  Ci   phương thức thừa kế lớp Ci 4.4 Cơng thức tính độ phức tạp phương thức lớp Công thức sau: WMC c    m M Im  c  VG  m  Trong đó: M Im  c  số lượng phương thức thực thi lớp c VG  m  tính độ đo phức tạp vịng cho phương thức m Công thức độ đo độ phức tạp vòng:   TC   TC i 1   j 1 is _ client Ci , C j  COF  TC  TC    TC i 1 DC  Ci  1: tồn mối quan hệ lớp khách với lớp chủ lớp khách phải khác với lớp chủ 0: trường hợp lại Bảng Ý nghĩa độ đo Độ đo Độ đo phụ thuộc Ý nghĩa Giá trị lớn, độ phức tạp lớn khó bảo trì phần mềm Độ đo liên kết yếu Sự gắn kết thấp làm tăng độ phương thức phức tạp Độ phức tạp vịng Giá trị nhỏ phần mềm rủi Độ đo thuộc tính ẩn Giá trị thể tính đóng gói cho thuộc tính hợp lý chưa? Độ đo phương thức ẩn Giá trị thể tính đóng gói cho phương thức hợp lý chưa? Độ sâu thừa kế Lớp nằm sâu thừa kế tăng độ phức tạp Số lượng lớp Giá trị lớn tăng khả thừa kế Độ phức tạp cácphương Giá trị lớn giảm khả thức lớp thừa kế Độ đo phương thức thừa Giá trị thể tính thừa kế kế cho phương thức hợp lý chưa? Độ đo thuộc tính thừa kế Giá trị thể tính thừa kế cho thuộc tính hợp lý chưa? Độ đo tính độ sâu Giá trị lớn khó để đọc khối mã nguồn lồng hiểu mã nguồn 28 Nguyễn Thị Thúy Hoài, Nguyễn Thanh Bình Bảng So sánh giá trị độ đo với độ phức tạp phần mềm Độ đo Độ đo phụ thuộc đối tượng Độ đo liên kết yếu phương thức Độ sâu thừa kế Độ phức tạp vòng Giá trị Độ phức độ đo tạp Tăng Tăng Giảm Tăng Tăng Tăng Tăng Tăng Bảng So sánh giá trị độ đo với KNKT phần mềm Độ đo Độ đo phụ thuộc đối tượng Độ đo gắn kết yếu phương thức Số lượng lớp Độ phức tạp phương thức lớp Độ đo khả thừa kế phương thức Độ đo khả thừa kế thuộc tính Giá trị KNKT độ đo Tăng Tăng Tăng Tăng Tăng Tăng Giảm Giảm Giảm Giảm Tăng Tăng Ứng dụng PTKNKT phần mềm HĐT Java với cơng cụ tính độ đo Để tính độ đo trình bày Mục 4, đề xuất sử dụng phần mềm Metrics Phần mềm tích hợp độ đo để PTKNKT cơng cụ hữu ích cho kiểm thử viên đánh giá KNKT phần mềm phát triển theo phương pháp HĐT 5.1 Quy trình sử dụng độ đo Trong quy trình phát triển phần mềm, độ đo sử dụng giai đoạn sau viết code trước thực kiểm thử Kết độ đo sở giúp người lập trình đưa đánh giá KNKT phần mềm cải thiện phần mềm chưa đạt yêu cầu Việc sử dụng độ đo để đánh giá KNKT phần mềm thực ba bước: Bước 1: Thực tính tốn độ đo ghi lại kết đo Dựa vào kết đo để thực lớp chưa đạt yêu cầu Bước 2: Những lớp chưa đạt yêu cầu thay đổi trước tính tốn lại độ đo Bước 3: So sánh độ đo trước sau thực công việc cải thiện phần mềm để đánh giá tổng quan KNKT phần mềm 5.2 Quy trình tích hợp phần mềm Metrics vào cơng cụ Eclipse Eclipse mơi trường phát triển tích hợp cho Java, phát triển ban đầu Java Kiểm thử viên tích hợp phần mềm Metrics vào cơng cụ soạn thảo Eclipse để tính kết độ đo mã nguồn Kết độ đo giúp người kiểm thử đánh giá KNKT phần mềm cao hay thấp 5.3 Thử nghiệm Trong phần này, chọn mã nguồn JDK 1.7.0_80 mã nguồn chuẩn Java để thực tính độ đo thơng qua phần mềm Metrics Kết độ đo tính từ mã nguồn JDK (Bảng 6) giá trị mong đợi (giá trị độ đo chuẩn) để đánh giá KNKT cho thử nghiệm: chương trình giao dịch ngân hàng ATM phần mềm bán hàng điện tử Đây phần mềm phức tạp, giao dịch tương tác người dùng ứng dụng địi hỏi độ xác cao Bảng Kết mong đợi độ đo sử dụng phần mềm Metrics Độ đo Độ đo liên kết yếu phương thức Độ phức tạp vòng Độ sâu thừa kế Độ phức tạp phương thức lớp Độ đo tính độ sâu khối mã nguồn lồng Độ đo tính tham số phương thức Kết 0,409 2,422 2,786 17,214 1,467 1,322 5.3.1 Thử nghiệm 1: chương trình giao dịch ngân hàng ATM Chương trình Giao dịch ngân hàng ATM có tác vụ đăng ký khách hàng, đăng ký tài khoản, đăng nhập tài khoản, rút tiền, gửi tiền, chuyển tiền, xem thông tin tài khoản, xem thơng tin giao dịch Chương trình gồm lớp với 532 dòng lệnh Sau sử dụng phần mềm Metrics, chúng tơi có kết Bảng Bảng Kết độ đo chương trình máy ATM Độ đo Độ đo liên kết yếu phương thức Độ phức tạp vòng Độ sâu thừa kế Độ phức tạp phương thức lớp Độ đo tính độ sâu khối mã nguồn lồng Độ đo tính tham số phương thức Kết 0,602 2,543 117 1,957 0,804 Hầu hết kết độ đo tính tốn phần mềm tính độ đo nằm vùng cho phép Tuy nhiên, riêng kết độ đo độ phức tạp phương thức lớp cao (dựa vào kết độ đo Bảng 7) Chúng đánh giá phần mềm ATM cần cải thiện lại mã nguồn trước thực giai đoạn kiểm thử 5.3.2 Thử nghiệm 2: phần mềm bán hàng thiết bị điện tử Chương trình bán hàng thiết bị điện tử gồm giao diện giới thiệu sản phẩm, đặt hàng, tính tiền đơn đặt hàng Chương trình gồm lớp với tổng cộng 587 dịng lệnh Bảng Kết độ đo phần mềm bán hàng thiết bị điện tử Độ đo Độ đo liên kết yếu phương thức Độ phức tạp vòng Độ sâu thừa kế Độ phức tạp phương thức lớp Độ đo tính độ sâu khối mã nguồn lồng Độ đo tính tham số phương thức Kết 0,404 1,478 3,111 11 1,343 0,761 Dựa vào Bảng 8, phần mềm này, có kết độ đo độ sâu thừa kế có giá trị cao phần mềm chuẩn Các kết tất độ đo lại chấp nhận (nghĩa nhỏ độ đo chuẩn) Chúng đánh giá phần mềm có độ phức tạp thấp khả kiểm thử cao Tuy nhiên, phần mềm cần phải cải tiến mã nguồn thừa kế Kết luận Bài báo trình bày hoạt động PTKNKT số phương pháp PTKNKT phương pháp phân tích mật ISSN 1859-1531 - TẠP CHÍ KHOA HỌC VÀ CÔNG NGHỆ ĐẠI HỌC ĐÀ NẴNG, SỐ 12(97).2015, QUYỂN độ động, phương pháp sử dụng câu xác nhận, phương pháp chọn liệu đảm bảo tính qn Những thơng tin có từ hoạt động PTKNKT phần mềm thực cần thiết cho hoạt động kiểm thử Từ đặc điểm phương pháp phát triển HĐT (cụ thể ngôn ngữ lập trình Java), nhóm tác giả đề xuất ứng dụng độ đo để PTKNKT sớm giai đoạn thiết kế Độ đo KNKT giúp cho người kiểm thử xác định phần mềm khó hay dễ kiểm thử, từ thiết kế cải tiến thiết kế đạt KNKT cao Các độ đo tích hợp vào công cụ Eclipse tiến hành thử nghiệm thành công ứng dụng độ đo để đánh giá KNKT số ứng dụng Java Giải pháp triển khai cho đơn vị phát triển phần mềm hay dự án phần mềm TÀI LIỆU THAM KHẢO [1] Nguyễn Thanh Bình, “Phân tích khả kiểm thử đơn vị phần mềm”, 29 Tạp chí Khoa học Công nghệ, Đại học Đà Nẵng, Số 14, 2006 [2] H Waton, Thomas J McCcabe, Structures Testing, A Testing Methodology Using the Cyclomatic Complexity Metrics, NIST Special Publication 500-235, 1996 [3] Roy S Freedman, Testability of Sofware Components, IEEE Transactions on Software, Eng., Vol.17, No.6, 1991 [4] Jeffrey M Voas, Larry Morell, Keith Miller, Using Dynamic Sensitivity Analysis, National Research Council Resident Research Associateship, 1991 [5] Jeffrey M Voas, A Dynamic Failure-Based Technique, Transactions on Software Engineering, vol 18, pp 717 -727, 1992 [6] J E Payne, R T Alexander and C D Hutchinson, Design for Testability for Object-Oriented Software, Object Magazine, vol 7, No 5, 1997, pp 34-43 [7] Magiel Bruntink, Predicting Class Teatability Using ObjectOriented Metrics, 4th IEEE International Workshop on Source Code Analysis and Manipulation (SCAM’04), 2004 S R Chidamber, C.F Kemerer, A Metrics Suite for Object Oriented Design, IEEE Transactions on Software English, vol 20, No 6, 1994 [8] (BBT nhận bài: 26/07/2015, phản biện xong: 27/08/2015) ... phần mềm với miền đầu vào định Phương pháp phân tích độ nhạy hay cịn gọi phương pháp phân tích PIE gồm phân tích thực thi, phân tích ảnh hưởng phân tích lan truyền PIE có tính chất động yêu cầu... thực thi Các độ đo sử dụng phân tích KNKT chương trình HĐT Java Ngơn ngữ lập trình Java nhanh chóng trở thành ngơn ngữ lập trình lập trình viên chuyên nghiệp 4.1 Độ đo khả liên kết yếu phương thức... sau: 1-10 Chương trình đơn giản, khơng chứa nhiều rủi ro 11-20 Chương trình phức tạp hơn, tính rủi ro trung bình 21-50 Chương trình phức tạp, tính rủi ro cao >50 Khơng có khả kiểm thử, tính rủi

Ngày đăng: 07/05/2021, 13:14

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

TÀI LIỆU LIÊN QUAN

w