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

Nghiên cứu vận dụng kỹ thuật kiểm thử phần mềm dựa trên uml cho hệ thống quản lý thiết bị tại trường đại học kinh tế đại học đà nẵng

91 1 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

ỌC TRƢỜ G ẴNG I HỌC SƢ P M PHAN THẾ NHẬT NGHIÊN CỨU VẬN DỤNG KỸ THUẬT KIỂM THỬ PHẦN MỀM DỰA TRÊN UML CHO HỆ THỐNG QUẢN LÝ THIẾT BỊ T TRƢỜ G I HỌC KINH TẾ I HỌC ẴNG UẬ V T CS Ỹ THUẬT NGÀNH HỆ THỐNG THÔNG TIN ẵng - 2023 ỌC TRƢỜ G ẴNG I HỌC SƢ P M PHAN THẾ NHẬT NGHIÊN CỨU VẬN DỤNG KỸ THUẬT KIỂM THỬ PHẦN MỀM DỰA TRÊN UML CHO HỆ THỐNG QUẢN LÝ THIẾT BỊ T TRƢỜ G I HỌC KINH TẾ I HỌC ẴNG C uy n n àn ệ thống thông tin số 84.80.104 UẬ V ƣờ ƣớn T n o CS ọ TS ẵng - 2023 Ỹ THUẬT uyễn ìn ầu i LỜ CA OA Tôi xin cam đoan luận văn nghiên cứu tơi, có hỗ trợ từ giáo viên hướng dẫn TS Nguyễn Đình Lầu Các nội dung nghiên cứu kết luận văn trung thực Những số liệu bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giá thu thập từ nguồn khác có ghi phần tài liệu tham khảo Ngồi ra, đề tài sử dụng số nhận xét, đánh số liệu tác giả, quan tổ chức khác, thể phần tài liệu tham khảo Nếu phát có gian lận tơi xin hồn tồn chịu trách nhiệm trước Hội đồng, kết luận văn Đà Nẵng, ngày 11 tháng năm 2023 Học viên PHAN THẾ NHẬT ii LỜI CẢ Ơ Để hồn thành chương trình cao học viết luận văn này, em nhận giúp đỡ đóng góp nhiệt tình thầy trường Đại học Sư phạm, Đại học Đà Nẵng Trước hết, em xin chân thành cảm ơn thầy cô Khoa Tin học, Đại học Sư phạm - Đại học Đà Nẵng tận tình giảng dạy, trang bị cho em kiến thức quý báu suốt khóa học cao học vừa qua Em xin gửi lời biết ơn sâu sắc tới TS Nguyễn Đình Lầu dành nhiều thời gian tâm huyết hướng dẫn, bảo em suốt trình thực đề tài Xin chân thành cảm ơn gia đình, bạn bè nhiệt tình ủng hộ, giúp đỡ, động viên vật chất lẫn tinh thần thời gian học tập nghiên cứu Trong trình thực luận văn, cố gắng không tránh khỏi thiếu sót Kính mong nhận cảm thơng tận tình bảo thầy bạn iii MỤC LỤC LỜ CA OA i LỜI CẢ Ơ ii DANH MỤC CÁC KÝ HIỆU, CHỮ VIẾT TẮT vi DANH MỤC CÁC BẢNG vii DANH MỤC HÌNH ẢNH viii MỞ ẦU 1 Lý chọn đề tài Mục tiêu nghiên cứu Đối tượng nghiên cứu 3.1 Đối tượng nghiên cứu 3.2 Phạm vi nghiên cứu Phương pháp nghiên cứu 4.1 Nghiên cứu lý thuyết 4.2 Nghiên cứu thực nghiệm Ý nghĩa khoa học thực tiễn đề tài Bố cục luận văn C ƢƠ G TỔNG QUAN VỀ PHÂN TÍCH THIẾT KẾ VÀ KIỂM THỬ PHẦN MỀM 1.1 Phát triển hệ thống phần mềm với ngôn ngữ UML 1.2 Khái niệm, chức mục tiêu UML (Unified Modeling Language) 1.3 Giới thiệu biểu đồ UML 1.4 Mục tiêu vai trò UML phát triển phần mềm 12 1.4.1 Mục tiêu UML 12 1.4.2 Vài trò UML 13 1.5 Các kỹ thuật kiểm thử phần mềm 15 1.5.1 Kiểm thử gì? 15 1.5.2 Phân loại kiểm thử phần mềm 16 iv 1.6 Kiểm thử dựa UML 19 1.6.1 Các thành phần cấu phần 19 1.6.2 UML kiểm thử 20 C ƢƠ G KIỂM THỬ PHẦN MỀM VỚI CÔNG CỤ KATALON STUDIO 22 2.1 Khái quát kiểm thử ứng dụng tảng web 22 2.1.1 Giới thiệu ứng dụng web 22 2.1.2 Các kiểu ứng dụng web 22 2.1.3 Đặc điểm chất lượng ứng dụng dạng web 23 2.1.4 Quy trình kiểm thử ứng dụng web phần mềm 23 2.1.5 Sự ảnh hưởng nghiêm trọng mức độ khác lỗi xây dựng phần mềm gây 24 2.2 Kiểm thử tự động thủ công 25 2.2.1 Khái niệm 25 2.2.2 Đặc điểm 25 2.3 Các kiểu kiểm thử web 26 2.3.1 Kiểm thử chức 26 2.3.2 Kiểm thử khả sử dụng 27 2.3.3 Kiểm thử tương thích 28 2.3.4 Kiểm thử hiệu xuất 28 2.3.5 Kiểm thử bảo mật 29 2.4 Giới thiệu công cụ hỗ trợ kiểm thử ứng dụng web 29 2.4.1 Công cụ kiểm thử hiệu 29 2.4.2 Công cụ kiểm thử bảo mật 29 2.4.3 Công cụ kiểm thử chức 30 2.5 Công cụ kiểm thử Katalon Studio 30 2.5.1 Các chức 31 2.5.2 Làm việc với Katalon Studio 31 2.6 So sánh Katalon Studio với công cụ khác 32 2.6.1 Ưu nhược điểm Katalon Studio 36 v 2.6.2 Đặc trưng Katalon Studio[7] 37 C ƢƠ G C ẶT CÔNG CỤ KATALON STUDIO VÀ THỰC NGHIỆM KIỂM THỬ C ƢƠ G TRÌ tRƢỜ G QUẢN LÝ THIẾT BỊ I HỌC KINH TẾ 39 3.1 Cài đặt cấu hình cơng cụ Katalon Studio[7] 39 3.1.1 Cài đặt 39 3.1.2 Cấu hình 39 3.1 Giới thiệu giao diện cửa sổ làm việc 40 3.1.4 Quy trình làm việc tuyến tính với Katalon Studio: 42 3.1.5 Cách viết kịch test với Katalon Studio 43 3.2 Kiểm thử chương trình Quản lý thiết bị 45 3.2.1 Mơ tả chương trình 45 3.2.2 Phân tích thiết kế toán sở UML 46 3.2.2.1 Quy trình xây dựng tài liệu kiểm thử dựa mơ hình UML 46 3.2.3 Thực nghiệm kiểm thử chương trình Quản lý thiết bị 47 3.2.3.1 Xây dựng mơ hình use case với toán thực tế 47 3.2.3.2 Xây dựng luồng nghiệp vụ sở tiếp cập hệ thống chức 47 3.2.3.3 Sinh ca kiểm thử 49 a Kiểm thử chức Đăng nhập hệ thống 49 b Kiểm thử chức Quản lý thiết bị 53 b.1 Chức Thêm thiết bị 53 b.2 Chức Sửa thông tin thiết bị 56 b.3 Chức Xóa thiết bị 58 3.3 Kết đạt sau kiểm thử 59 TÀI LIỆU THAM KHẢO 61 PHỤ LỤC 62 vi DANH MỤC CÁC KÝ HIỆU, CHỮ VIẾT TẮT MTM Microsoft Test Manager API Application Programming Interface UT Unit Testing IT ST CSV Integration Testing System Testing Comma-Separated Values SCM QTP Software Configuration Management Quick Test Professional actor Black box Tác nhân Hộp đen BVA CNTT FRAME IBM Giá trị biên Công nghệ thông tin Khung Tên công ty máy tính script UC UML Kịch Biểu đồ UC (Use case diagrams) Ngơn ngữ mơ hình hóa tổng qt White box Hộp trắng IDE Integrated Development Enveironment 63 oạn code thực case kiểm thử đăn n ập không thành công import static com.kms.Katalon Studio.core.checkpoint.CheckpointFactory.findCheckpoint import static com.kms.Katalon Studio.core.testcase.TestCaseFactory.findTestCase import static com.kms.Katalon Studio.core.testdata.TestDataFactory.findTestData import static com.kms.Katalon Studio.core.testobject.ObjectRepository.findTestObject import static com.kms.Katalon Studio.core.testobject.ObjectRepository.findWindowsObject import com.kms.Katalon Studio.core.checkpoint.Checkpoint as Checkpoint import com.kms.Katalon Studio.core.cucumber.keyword.CucumberBuiltinKeywords as CucumberKW import com.kms.Katalon Studio.core.mobile.keyword.MobileBuiltInKeywords as Mobile import com.kms.Katalon Studio.core.model.FailureHandling as FailureHandling import com.kms.Katalon Studio.core.testcase.TestCase as TestCase import com.kms.Katalon Studio.core.testdata.TestData as TestData import com.kms.Katalon Studio.core.testng.keyword.TestNGBuiltinKeywords as TestNGKW import com.kms.Katalon Studio.core.testobject.TestObject as TestObject import com.kms.Katalon Studio.core.webservice.keyword.WSBuiltInKeywords as WS import com.kms.Katalon Studio.core.webui.keyword.WebUiBuiltInKeywords as WebUI import com.kms.Katalon Studio.core.windows.keyword.WindowsBuiltinKeywords as Windows import internal.GlobalVariable as GlobalVariable import org.openqa.selenium.Keys as Keys WebUI.openBrowser('') WebUI.navigateToUrl('http://localhost:41237/') WebUI.maximizeWindow() WebUI.setText(findTestObject('Object Repository/TC-Login-Fail/Page_Qun L Thit b/input_Tn Ngi Dng_UserName'), 'Quan tri') WebUI.setEncryptedText(findTestObject('Object Repository/TC-Login-Fail/Page_Qun L Thit b/input_Mt Khu_Password'), 'TwW95KtKS4Q=') WebUI.click(findTestObject('Object Repository/TC-Login-Fail/Page_Qun L Thit b/button_ng Nhp')) WebUI.verifyElementPresent(findTestObject('TC-Login-Fail/Page_Qun L Thit b/li_Mt khu khng ng'), 1) WebUI.closeBrowser() 64 oạn code ca kiểm thử Thêm thiết bị import static com.kms.Katalon Studio.core.testcase.TestCaseFactory.findTestCase import static com.kms.Katalon Studio.core.testdata.TestDataFactory.findTestData import static com.kms.Katalon Studio.core.testobject.ObjectRepository.findTestObject import static com.kms.Katalon Studio.core.testobject.ObjectRepository.findWindowsObject import com.kms.Katalon Studio.core.checkpoint.Checkpoint as Checkpoint import com.kms.Katalon Studio.core.cucumber.keyword.CucumberBuiltinKeywords as CucumberKW import com.kms.Katalon Studio.core.mobile.keyword.MobileBuiltInKeywords as Mobile import com.kms.Katalon Studio.core.model.FailureHandling as FailureHandling import com.kms.Katalon Studio.core.testcase.TestCase as TestCase import com.kms.Katalon Studio.core.testdata.TestData as TestData import com.kms.Katalon Studio.core.testng.keyword.TestNGBuiltinKeywords as TestNGKW import com.kms.Katalon Studio.core.testobject.TestObject as TestObject import com.kms.Katalon Studio.core.webservice.keyword.WSBuiltInKeywords as WS import com.kms.Katalon Studio.core.webui.keyword.WebUiBuiltInKeywords as WebUI import com.kms.Katalon Studio.core.windows.keyword.WindowsBuiltinKeywords as Windows import internal.GlobalVariable as GlobalVariable import org.openqa.selenium.Keys as Keys WebUI.openBrowser('') WebUI.navigateToUrl('http://localhost:41237/') WebUI.maximizeWindow() WebUI.setText(findTestObject('Object Repository/TC_ADDTBM/Page_Qun L Thit b/input_Tn Ngi Dng_UserName'), 'Quan tri') WebUI.setEncryptedText(findTestObject('Object Repository/TC_ADDTBM/Page_Qun L Thit b/input_Mt Khu_Password'), 'iGDxf8hSRT4=') WebUI.sendKeys(findTestObject('Object Repository/TC_ADDTBM/Page_Qun L Thit b/input_Mt Khu_Password'), Keys.chord(Keys.ENTER)) WebUI.click(findTestObject('Object Repository/TC_ADDTBM/Page_Trang Ch/a_Thit b')) WebUI.click(findTestObject('Object Repository/TC_ADDTBM/Page_Trang Ch/a_Thm Thit B Mi')) WebUI.click(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/span_Chn loi thit b')) WebUI.setText(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/input_Sa_select2-search field'), 'Laptop') WebUI.sendKeys(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/input_Sa_select2-search field'), Keys.chord(Keys.ENTER)) WebUI.setText(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/input_Tn Thit b_DeviceName'), 'Hp X360') WebUI.setText(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/input_Gi_Price'), '19,500,000') WebUI.click(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/span_Chn ngi s dng')) WebUI.setText(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/input_Sa_select2-search field'), 'Thao') WebUI.sendKeys(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/input_Sa_select2-search field'), Keys.chord(Keys.ENTER)) 65 WebUI.click(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/span_Chn Phng ban')) WebUI.setText(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/input_Sa_select2-search field'), 'Phòng Đào tạo') WebUI.sendKeys(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/input_Sa_select2-search field'), Keys.chord(Keys.ENTER)) WebUI.setText(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/body_I51105u, ram 8gb, ssd 240gb'), 'I5 11105U, Ram 8gb, ssd500') WebUI.click(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/input_Ngy mua_DateOfPurchase')) WebUI.setText(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/input_Ngy mua_DateOfPurchase'), '2022-08-12') WebUI.sendKeys(findTestObject('TC_ADDTBM/Page_Thm Mi/input_Ngy mua_DateOfPurchase'), Keys.chord(Keys.ESCAPE)) WebUI.setText(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/input_Thi hn bo hnh_Guarantee'), '2023-08-12') WebUI.sendKeys(findTestObject('Page_Thm Mi/input_Thi hn bo hnh_Guarantee'), Keys.chord(Keys.ESCAPE)) WebUI.scrollToElement(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/button_Lu'), 2) WebUI.click(findTestObject('Object Repository/TC_ADDTBM/Page_Thm Mi/button_Lu')) WebUI.closeBrowser() 66 oạn code ca kiểm thử Sửa thông tin thiết bị import static com.kms.Katalon Studio.core.checkpoint.CheckpointFactory.findCheckpoint import static com.kms.Katalon Studio.core.testcase.TestCaseFactory.findTestCase import static com.kms.Katalon Studio.core.testdata.TestDataFactory.findTestData import static com.kms.Katalon Studio.core.testobject.ObjectRepository.findTestObject import static com.kms.Katalon Studio.core.testobject.ObjectRepository.findWindowsObject import com.kms.Katalon Studio.core.checkpoint.Checkpoint as Checkpoint import com.kms.Katalon Studio.core.cucumber.keyword.CucumberBuiltinKeywords as CucumberKW import com.kms.Katalon Studio.core.mobile.keyword.MobileBuiltInKeywords as Mobile import com.kms.Katalon Studio.core.model.FailureHandling as FailureHandling import com.kms.Katalon Studio.core.testcase.TestCase as TestCase import com.kms.Katalon Studio.core.testdata.TestData as TestData import com.kms.Katalon Studio.core.testng.keyword.TestNGBuiltinKeywords as TestNGKW import com.kms.Katalon Studio.core.testobject.TestObject as TestObject import com.kms.Katalon Studio.core.webservice.keyword.WSBuiltInKeywords as WS import com.kms.Katalon Studio.core.webui.keyword.WebUiBuiltInKeywords as WebUI import com.kms.Katalon Studio.core.windows.keyword.WindowsBuiltinKeywords as Windows import internal.GlobalVariable as GlobalVariable import org.openqa.selenium.Keys as Keys WebUI.openBrowser('') WebUI.navigateToUrl('http://localhost:41237/') WebUI.maximizeWindow() WebUI.setText(findTestObject('Object Repository/TC_EDITTB/Page_Qun L Thit b/input_Tn Ngi Dng_UserName'), 'Quan tri') WebUI.setEncryptedText(findTestObject('Object Repository/TC_EDITTB/Page_Qun L Thit b/input_Mt Khu_Password'), 'iGDxf8hSRT4=') WebUI.click(findTestObject('Object Repository/TC_EDITTB/Page_Qun L Thit b/button_ng Nhp')) WebUI.click(findTestObject('Object Repository/TC_EDITTB/Page_Trang Ch/h1_28')) WebUI.click(findTestObject('Object Repository/TC_EDITTB/Page_Thit B/input_Xa_check')) WebUI.click(findTestObject('Object Repository/TC_EDITTB/Page_Thit B/a_ang s dng_edit icon-eye-open')) WebUI.click(findTestObject('Object Repository/TC_EDITTB/Page_LAP00026/button_Sa')) WebUI.setText(findTestObject('Object Repository/TC_EDITTB/Page_LAP00026/input_Gi_Price'), '18,500,000') WebUI.setText(findTestObject('Object Repository/TC_EDITTB/Page_LAP00026/input_Tn Thit b_DeviceName'), 'Hp X450') WebUI.click(findTestObject('Object Repository/TC_EDITTB/Page_LAP00026/button_Lu')) WebUI.closeBrowser() 67 oạn code thực ca kiểm thử Xóa thiết bị import static com.kms.Katalon Studio.core.checkpoint.CheckpointFactory.findCheckpoint import static com.kms.Katalon Studio.core.testcase.TestCaseFactory.findTestCase import static com.kms.Katalon Studio.core.testdata.TestDataFactory.findTestData import static com.kms.Katalon Studio.core.testobject.ObjectRepository.findTestObject import static com.kms.Katalon Studio.core.testobject.ObjectRepository.findWindowsObject import com.kms.Katalon Studio.core.checkpoint.Checkpoint as Checkpoint import com.kms.Katalon Studio.core.cucumber.keyword.CucumberBuiltinKeywords as CucumberKW import com.kms.Katalon Studio.core.mobile.keyword.MobileBuiltInKeywords as Mobile import com.kms.Katalon Studio.core.model.FailureHandling as FailureHandling import com.kms.Katalon Studio.core.testcase.TestCase as TestCase import com.kms.Katalon Studio.core.testdata.TestData as TestData import com.kms.Katalon Studio.core.testng.keyword.TestNGBuiltinKeywords as TestNGKW import com.kms.Katalon Studio.core.testobject.TestObject as TestObject import com.kms.Katalon Studio.core.webservice.keyword.WSBuiltInKeywords as WS import com.kms.Katalon Studio.core.webui.keyword.WebUiBuiltInKeywords as WebUI import com.kms.Katalon Studio.core.windows.keyword.WindowsBuiltinKeywords as Windows import internal.GlobalVariable as GlobalVariable import org.openqa.selenium.Keys as Keys WebUI.openBrowser('') WebUI.navigateToUrl('http://localhost:41237/') WebUI.maximizeWindow() WebUI.setText(findTestObject('Object Repository/TC_DELETETHIETBI/Page_Qun L Thit b/input_Tn Ngi Dng_UserName'), 'Quan tri') WebUI.setEncryptedText(findTestObject('Object Repository/TC_DELETETHIETBI/Page_Qun L Thit b/input_Mt Khu_Password'), 'iGDxf8hSRT4=') WebUI.sendKeys(findTestObject('Object Repository/TC_DELETETHIETBI/Page_Qun L Thit b/input_Mt Khu_Password'), Keys.chord( Keys.ENTER)) WebUI.click(findTestObject('Object Repository/TC_DELETETHIETBI/Page_Trang Ch/p_Tt C Cc Thit B')) WebUI.click(findTestObject('Object Repository/TC_DELETETHIETBI/Page_Thit B/input_Xa_check')) WebUI.click(findTestObject('Object Repository/TC_DELETETHIETBI/Page_Thit B/a_ang s dng_deleteItem')) WebUI.verifyTextPresent('Bạn có muốn xóa thiết bị chọn?', true) WebUI.click(findTestObject('Object Repository/TC_DELETETHIETBI/Page_Thit B/a_Xo')) WebUI.closeBrowser() D~I HQC DA NANG TRUONGDAIHOCSUPHAM CQNG HOA XA HQI CHU NGHiA VI¥T NAM DQc l~p - Tl}'do - Hanh phuc BIEN BAN HQP HQI DONG CHAM LU~N VAN TH~C sl Ten d~ tai: Nghien ciru van dung ky thuat kiem tlnr phan mem dira tren UML cho h~ thong quan ly thiet bi tai tnrong Dai hoc Kinh te - Dai hoc Da N£ng Nganh: H~ thong thong tin Lap: K41.HTTT Theo Quyet dinh I~p Hoi dong cham luan van thac si s6 75 IQD-DHSP 07 thang 02 nam 2023 Ngay hQP Hoi dong: ngay11 thong 02 ndm 2023 Danh sach cac vien Hoi d6ng: , " HQ VA TEN STT CUONG VI TRONG HQI DONG PGS TS Trftn Dang Hung Chtl tich TS Pham Anh Phuong Thuky TS VU Thi Tra PGS.TS PGS TS Trftn Van Lang r.e Hoang a Thanh vien co mat: Phan bien San Phan bien Uy vien _,_O~·~s:~ -b Thanh vien vang mat: _ DL. Thu ky Hoi d6ng bao cao qua trinh hoc t~p, nghien CUucua hoc vien cao hQCva dQC Iy lich khoa hQc (co van ban kern theo) HQc vien cao hQc trinh bay lu~n van Cac phan bi~n dQc nh~n xet va neu diu hoi (c6 van ban kem theo) HQc vien cao hQc tra Uricac cau hoi ctla vien H_V! = 14 Chu tich H9i d6ng tuyen b6 b~ mac THU KY H(H DONG CHU TlCH HOI DONG CONG HOA xA HOI CHiJ NGHIA VI~T NAM DQc l~p - TV - Hanh phuc -000 BAN NHAN XET LUAN VAN THAC st (Dung cho vien h~i dang iii phiin bifn) Ten d~ Uti luan van: Nghien ciru van dung ky thuat kiem tlnr phan mem dira tren UML cho h~ thong quan ly thiet bi tai tnrong D~l h9C Kinh t€ - Dai hoc Da N~ng Nganh: H~ thong thong tin Ma nganh: 84.80.104 H9 va ten h9C vien: Phan Th€ Nhat Nguoi nhan xet: PGS TS Le Hoang San Dan vi cong tac: Vien Cong nghe thong tin, DHQGHN NQI DUNG NH~N XET Tinh cAp thi~t ella d~ tai: D~ tai t~p trung nghien ciru v~ kiem thir (rug dung tren nen tang Web M9t irng dung web thuong co r~t nhieu nhom nguoi str dung voi nhieu nen tang khac (h~ di~u hanh, trinh duyet ) nen kho co th€ doan ducc s6 hrong ngiroi sir dung mot (rug dung web la bao nhieu, thai gian h6i dap yeu c~u Clla nguai su d\lng d6i v6i (rug d\lng la m9t nhfing y€u t6 mang tfnh quy€t dinh b~i clla ling d\lng d~n d€n vi~c ki€m thu ung d\lng Web se co nhfrng khac bi~t nh~t dinh so v6i ki€m thu ph~n m~m truy~n th6ng Trong do, ki€m thu giao di~n nguai dung, ki€m thu hi~u nang va ki€m thu bao m~t la nhfing lo~i ki€m thu rna ung dl,.mgweb c~n chu tr9ng Ki€m thu web nh~m tim l6i ti€m

Ngày đăng: 08/05/2023, 16:17

Xem thêm:

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

TÀI LIỆU LIÊN QUAN

w