Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 103 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
103
Dung lượng
29,45 MB
Nội dung
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA LÊ THỊ KIM CHUNG LÊ THỊ KIM CHUNG CẢI TIẾN VÀ ỨNG DỤNG CÔNG CỤ KIỂM THỬ * RANOREX TRONG CÁC DỰ ÁN PHẦN MỀM KHOA HỌC MÁY TÍNH LUẬN VĂN THẠC SĨ KHOA HỌC CHUYÊN NGÀNH KHOA HỌC MÁY TÍNH * KHÓA K32 Đà Nẵng - 2017 ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA LÊ THỊ KIM CHUNG CẢI TIẾN VÀ ỨNG DỤNG CÔNG CỤ KIỂM THỬ RANOREX TRONG CÁC DỰ ÁN PHẦN MỀM Chuyên ngành: Khoa học máy tính Mã số: 60.48.01.01 LUẬN VĂN THẠC SĨ KỸ THUẬT Người hướng dẫn khoa học: PGS TS Nguyễn Thanh Bình ĐÀ NẴNG - 2017 i LỜI CAM ĐOAN Tôi xin cam đoan: - Luận văn cơng trình nghiên cứu thực cá nhân, thực hướng dẫn khoa học PGS TS Nguyễn Thanh Bình - Mọi tham khảo dùng luận văn trích dẫn rõ ràng tên tác giả, thời gian - Những chép không hợp lệ, vi phạm quy chế đào tạo, hay gian trá, tơi xin chịu hồn tồn trách nhiệm Đà Nẵng, tháng 11 năm 2017 Tác giả LÊ THỊ KIM CHUNG ii LỜI CẢM ƠN Tôi xin chân thành cảm ơn Thầy cô khoa Công nghệ thơng tin nói riêng Thầy giảng dạy trường Đại học Đà Nẵng nói chung truyền đạt kiến thức quý báu, hướng dẫn tận tình cho tơi năm học tập nghiên cứu trường Đặc biệt, xin chân thành cảm ơn Thầy Nguyễn Thanh Bình, trưởng khoa Khoa Cơng nghệ thông tin, trường Đại học Bách Khoa Đà Nẵng tận tình hướng dẫn, động viên giúp đỡ tơi suốt thời gian nghiên cứu thực luận văn Và để có kết này, tơi biết ơn gia đình động viên, khích lệ, hỗ trợ, tạo điều kiện thuận lợi suốt trình học tập thực luận văn Tôi xin chân thành cảm ơn Đà Nẵng, tháng 11 năm 2017 Tác giả LÊ THỊ KIM CHUNG iii MỤC LỤC LỜI CAM ĐOAN I LỜI CẢM ƠN II MỤC LỤC .III DANH MỤC CÁC KÝ HIỆU, CHỮ VIẾT TẮT VI DANH MỤC HÌNH ẢNH VIII DANH MỤC BẢNG IX MỞ ĐẦU 1 LÝ DO CHỌN ĐỀ TÀI .1 MỤC ĐÍCH VÀ Ý NGHĨA ĐỀ TÀI MỤC TIÊU VÀ NHIỆM VỤ ĐỐI TƯỢNG VÀ PHẠM VI NGHIÊN CỨU PHƯƠNG PHÁP NGHIÊN CỨU .3 PHƯƠNG TIỆN, CÔNG CỤ TRIỂN KHAI BỐ CỤC CỦA LUẬN VĂN .3 CHƯƠNG 1: CƠ SỞ LÝ THUYẾT .5 1.1 LỖI PHẦN MỀM .6 1.1.1 Các nguyên nhân gây lỗi phần mềm 1.2 CHI PHÍ SỬA LỖI 1.2.1 Qui trình xử lý lỗi phần mềm .6 1.3 KIỂM THỬ PHẦN MỀM 1.3.1 Khái niệm 1.3.2 Kỹ thuật kiểm thử phần mềm 1.3.2.1 Kỹ thuật kiểm thử hộp đen .8 1.3.2.2 Kỹ thuật kiểm thử hộp trắng 10 1.3.3 Các giai đoạn kiểm thử phần mềm 12 1.3.3.1 Kiểm thử đơn vị 12 1.3.3.2 Kiểm thử tích hợp 13 1.3.3.3 Kiểm thử hệ thống 15 1.3.3.4 Kiểm thử chấp nhận 15 1.4 TỔNG KẾT 16 iv CHƯƠNG 2: KIỂM THỬ TỰ ĐỘNG VÀ CÁC CÔNG CỤ KIỂM THỬ TỰ ĐỘNG 17 2.1 KHÁI QUÁT VỀ KIỂM THỬ TỰ ĐỘNG 17 2.1.1 Kiểm thử tự động .17 2.1.2 Quy trình kiểm thử tự động 19 2.1.3 So sánh kiểm thử thủ công kiểm thử tự động .19 2.2 CÁC LOẠI KIỂM THỬ TỰ ĐỘNG 20 2.2.1 Kiểm thử tự động dựa liệu (data-driven) .20 2.2.2 Kiểm thử tự động dựa từ khóa 22 2.3 CÁC CÔNG CỤ KIỂM THỬ TỰ ĐỘNG 24 2.3.1.Selenium .24 2.3.2.HP Quick Test Pro (QTP) HPE Unified Functional Testing (UFT) 25 2.3.3 Ranorex 26 2.4 TỔNG KẾT .28 CHƯƠNG 3: KIỂM THỬ TỰ ĐỘNG VỚI RANOREXVÀ ĐỀ XUẤT GIẢI PHÁP CẢI TIẾN 29 3.1 CÔNG CỤ KIỂM THỬ RANOREX .29 3.1.1.Đặc điểm Ranorex 29 3.1.2.Giới thiệu Ranorex .30 3.1.3.Ưu nhược điểm Ranorex 33 3.2 ĐỀ XUẤT GIẢI PHÁP CẢI TIẾN 34 3.2.1.Đề xuất giải pháp 34 3.2.2.Giới thiệu công cụ hỗ trợ .36 3.2.2.1 TortoiseGit 37 3.2.2.2 Jira .38 3.3 CHI TIẾT GIẢI PHÁP CẢI TIẾN 38 3.3.1 Xây dựng qui trình tổng thể tích hợp TortoiseGit Jira vào Ranorex .38 3.3.1.1 Tích hợp TortoiseGit vào Ranorex 40 3.3.1.2 Tích hợp Jira vào Ranorex .41 3.4 THỬ NGHIỆM .43 3.4.1 Ứng dụng công cụ Ranorex để kiểm thử phần mềm KeePass .43 v 3.4.2 Ứng dụng công cụ Ranorex để kiểm thử phần mềm Bán vé máy bay 59 3.5 PHÂN TÍCH HIỆU QUẢ CẢI TIẾN .60 3.5.1 So sánh độ hiệu so với kiểm thử tay 60 3.5.2 So sánh độ hiệu tích hợp Ranorex với TortoiseGit Jira .61 3.6.TỔNG KẾT .61 KẾT LUẬN 62 Kết đạt 62 Hạn chế 62 Hướng phát triển 62 TÀI LIỆU THAM KHẢO PHỤ LỤC vi CẢI TIẾN VÀ ỨNG DỤNG CÔNG CỤ KIỂM THỬ RANOREX TRONG CÁC DỰ ÁN PHẦN MỀM Học viên: Lê Thị Kim Chung Chuyên ngành: Khoa học máy tính Mã số: ………Khóa: K32 Trường Đại học Bách khoa - ĐHĐN Tóm tắt – Sự yêu cầu nghiêm ngặt chất lượng phần mềm làm gia tăng nhu cầu kiểm thử phần mềm Việc kéo dài thời gian thực kiểm thử thuê thêm kiểm thử viên phương pháp lâu dài hiệu quả, thay vào cần phải tăng suất giảm số lượng nhân lực cách hiệu Một giải pháp tối ưu cho vấn đề kiểm thử tự động Luận văn thạc sĩ xin giới thiệu kiểm thử tự động, công cụ kiểm thử tự động Ranorex, công cụ hỗ trợ kiểm thử tự động khác Đồng thời phân tích hạn chế công cụ số phương pháp cải tiến kỹ thuật kiểm thử tự động dùng công cụ Ranorex Từ đó, đề xuất quy trình kiểm thử tự động Kết luận văn sử dụng tài liệu nghiên cứu cho bạn sinh viên áp dụng vào quy trình kiểm thử công ty phát triển phần mềm Tác giả tóm tắt kết đạt đưa hướng phát triển Từ khóa – Kiểm thử tự động hướng liệu; kiểm thử tự động hướng từ khóa; Ranorex; Tortoise Git; Jira IMPROVING AND APPLYING RANOREX AUTOMATION TESTING TOOL FOR SOFTWARE TESTING Abstract - The growing importance and stringent quality requirements of software systems are increasing demand for efficient software testing Hiring more test engineers or lengthening the testing time are not viable long-term solutions, rather there is a need to decrease the amount of resources needed One attractive solution to this problem is test automation This master’s thesis presents the automation testing, an automation tool is Ranorex and tools to support automation testing process, its limitations and some methods for improvement are also analyzed Then, a new process for applying automation testing is proposed This approach can be applied for students and to testing processes of software development companies The achieved results are summarized and perspective of the work is provided Key words – Data driven; Keyword driven; Ranorex; TortoiseGit; Jira vii 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 Integration Testing ST System Testing AT Acceptance Testing UAT User Acceptance Testing OAT Operational Acceptance Testing CSV Comma-Separated Values SCM Software Configuration Management QTP Quick Test Professional LINQ Language Integrated Query viii DANH MỤC HÌNH ẢNH Số hiệu hình Tên hình Trang 1.1 Chi phí cho việc sửa lỗi phần mềm 1.2 Các trạng thái lỗi 1.3 Lược đồ chương trình 11 1.4 Kiểm thử tích hợp từ xuống 13 1.5 Kiểm thử tích hợp từ lên 14 1.6 Kiểm thử tích hợp Big Bang 14 2.1 Các mức kiểm thử tự động 17 2.2 Kéo thả từ khóa định nghĩa 22 2.3 Tham chiếu đến tệp DLL thư viện 23 2.4 Sử dụng từ khóa định nghĩa 23 3.1 Khung nhìn Ranorex Studio 30 3.2 Mơ hình cải tiến tổng thể 35 3.3 Quy trình tích hợp chi tiết 39 3.4 Quy trình tích hợp TortoiseGit vào Ranorex 40 3.5 Quy trình tích hợp Jira vào Ranorex 41 3.6 Màn hình thực kiểm thử (Add Entry) 44 3.7 Màn hình chứa kịch thử sau tạo 47 3.8 Kịch kiểm thử cho ca kiểm thử Add Entry 002 52 3.9 Kịch kiểm thử cho ca kiểm thử Add Entry 003 52 3.10 Kịch kiểm thử cho ca kiểm thử Add Entry 004 53 3.11 Chức tìm kiếm chuyến bay 58 3.12 So sánh thời gian thực thi 59 get { return _JiraIssueKey; } set { _JiraIssueKey = value; } } string_TransitionName = ""; [TestVariable("C4F14A65-DB66-4381-BABD921E14077BE6")] public stringTransitionName { get { return _TransitionName; } set { _TransitionName = value; } } publicvoidRun() { vartc = checkTestCase(); if(tc.Status == Ranorex.Core.Reporting.ActivityStatus.Failed) { reopenIssue(JiraIssueKey, TransitionName); } } } } o ResolveIssueIfTestCaseSuccessful usingSystem; usingRanorex; usingRanorex.Core.Te sting; namespaceJiraReporter { [TestModule("B01C5C25-EC0B-48D9-AE60EDF4904F289D", ModuleType.UserCode, 1)] publicclassResolveIssueIfTestCaseSuccessful : AbstractJiraIntegrationClient, ITestModule { string_JiraIssueKey = ""; [TestVariable("763880E1-C9E1-4CCEB626-898390004888")] public stringJiraIssueKey { get { return _JiraIssueKey; } set { _JiraIssueKey = value; } } string_TransitionName = ""; [TestVariable("C4F14A65-DB66-4381BABD-921E14077BE6")] public stringTransitionName { get { return _TransitionName; } set { _TransitionName = value; } } publicResolveIssueIfTestCaseSuccessful() { } publicvoidRun() { vartc = checkTestCase(); if(tc.Status == Ranorex.Core.Reporting.ActivityStatus.Success) { resolveIssue(JiraIssueKey, TransitionName); } } } } o UpdateExistingIssueIfTestCaseFails usingSystem; usingSystem.Collections.Generic; usingRanorex; usingRanorex.Core.Testing; namespaceJiraReporter { [TestModule("7F4E25E4-174E-4E61-B291-EE7882426969", ModuleType.UserCode, 1)] publicclassUpdateExistingIssueIfTestCaseFails : ITestModule { publicUpdateExistingIssueIfTestCaseFails() { } string_JiraSummary = ""; [TestVariable("A17CCC90-3800-4B66-89F6-33025E95CD83")] public stringJiraSummary { get { return _JiraSummary; } set { _JiraSummary = value; } } string_JiraDescription = ""; [TestVariable("2CBA8E0D-CE84-447D-80D2-4044B4CC4735")] public stringJiraDescription { get { return _JiraDescription; } set { _JiraDescription = value; } } string_JiraIssueKey = ""; [TestVariable("861CFAE9-60E6-409F-99D0-1BED4082BB01")] public stringJiraIssueKey { get { return _JiraIssueKey; } set { _JiraIssueKey = value; } } string_JiraLabels = ""; [TestVariable("1BFCEF2A-F7F4-484C-ADE6-18F6ABC8DFE2")] public stringJiraLabels { get { return _JiraLabels; } set { _JiraLabels = value; } } void ITestModule.Run() { vartc = TestSuite.CurrentTestContainer; if (tc == null) { Report.Error("TestCase is 'null'; this usually happens when the module is used outside of testcases (e.g., global teardown)."); } if(tc.Status == Ranorex.Core.Reporting.ActivityStatus.Failed) { try { chardelimiterChar = ';'; Listlabels = null; if (!string.IsNullOrEmpty(JiraLabels)) labels = newList(JiraLabels.Split(delimiterChar)); varcurIssue = JiraReporter.UpdateIssue(JiraIssueKey, tc.Name, JiraSummary, JiraDescription, labels, true); Report.Info("Jira issue updated IssueKey: " + curIssue.Key + "; IssueID: "+ curIssue.Id); Report.LogHtml(ReportLevel.Info, "" + curIssue.Id + "" ); } catch(Exception e) { varinner = e.InnerException; stringstr = ""; if(inner != null) { varprop = inner.GetType().GetProperty("ErrorResponse"); if(prop != null) str = (string)prop.GetValue(e.InnerException, null); } Report.Error(e.Message + " (InnerException: " + e.InnerException + " " + str + ")"); } } } } } o AutoHandleJiraIntegration usingSystem.Collections; usingSystem.Linq; usingAtlassian.Jira; usingRanorex; usingRanorex.Core.Testing; namespaceJiraReporter { [TestModule("8B73DAD1-CE2B-4FF6-8618-571F7B31FC6D", ModuleType.UserCode, 1)] publicclassAutoHandleJiraIntegration : AbstractJiraIntegrationClient, ITestModule { publicAutoHandleJiraIntegration() { } publicvoidRun() { ITestContainertc = checkTestCase(); JiraConfigurationconfig = JiraConfiguration.Instance; IEnumerableissues = null; if ((config.jqlQueryToConnectIssues == null || config.jqlQueryToConnectIssues.Length == 0) && (config.RxAutomationFieldName == null || config.RxAutomationFieldName.Length == 0)) { issues = Enumerable.Empty(); } elseif (config.jqlQueryToConnectIssues.Length >0) { issues = JiraReporter.getJiraIssues(config.jqlQueryToConnectIssues); } else { issues = JiraReporter.getJiraIssues("'" + config.RxAutomationFieldName + "' ~ '" + tc.Name + "'"); } if (tc.Status == Ranorex.Core.Reporting.ActivityStatus.Failed) { boolisEmpty = true; foreach (Issue issue in issues) { if (!issue.Status.Name.Contains(config.StateReopen)) { reopenIssue(issue.Key.ToString(), config.StateReopen); } else { Report.Info("Jira issue is already open -IssueKey: " + issue.Key.ToString() + "; IssueID: " + issue.Key.ToString()); Report.LogHtml(ReportLevel.Info, "" + issue.Key.ToString() + ""); } isEmpty = false; } if (isEmpty) { createIssue(tc); } } elseif (tc.Status == Ranorex.Core.Reporting.ActivityStatus.Success) { foreach (Issue issue in issues) { if (!issue.Status.Name.Contains(config.StateClosed)) { resolveIssue(issue.Key.ToString(), config.StateClosed); } } } } } } o AbstractJiraIntegrationClient using Ranorex; usingRanorex.Core.Testing; usingSystem; usingSystem.Collections.Generic; namespaceJiraReporter { publicabstractclassAbstractJiraIntegrationClient { protectedITestContainercheckTestCase() { vartc = TestSuite.CurrentTestContainer; if (tc == null) { Report.Error("TestCase is 'null'; this usually happens when the module is used outside of testcases (e.g., global teardown)."); } return tc; } protectedvoidcreateIssue(ITestContainer tc) { try { varcreatedIssue = JiraReporter.CreateIssue(tc.Name, true); Report.Info("Jira issue created IssueKey: " + createdIssue.Key + "; IssueID: " + createdIssue.Id); Report.LogHtml(ReportLevel.Info, "" + createdIssue.Id + ""); } catch (Exception e) { varinner = e.InnerException; stringstr = ""; if (inner != null) { varprop = inner.GetType().GetProperty("ErrorResponse"); if (prop != null) str = (string)prop.GetValue(e.InnerException, null); } Report.Error(e.Message + " (InnerException: " + e.InnerException + " " + str + ")"); } } protectedvoidreopenIssue(string JiraIssueKey, stringTransitionName) { try { varcurIssue = JiraReporter.ChangeState(JiraIssueKey, TransitionName, true); if (curIssue != null) { Report.Info("Jira issue reopened -IssueKey: " + curIssue.Key + "; IssueID: " + curIssue.Id); Report.LogHtml(ReportLevel.Info, "" + curIssue.Id + ""); } else Report.Warn("Could not re-open Jira issue IssueKey: " + curIssue.Id); } catch (Exception e) { varinner = e.InnerException; stringstr = ""; if (inner != null) { varprop = inner.GetType().GetProperty("ErrorResponse"); if (prop != null) str = (string)prop.GetValue(e.InnerException, null); } Report.Error(e.Message + " (InnerException: " + e.InnerException + " " + str + ")"); } } protectedvoidresolveIssue(string JiraIssueKey, string TransitionName) { try { varcurIssue = JiraReporter.ChangeState(JiraIssueKey, TransitionName, true); if (curIssue != null) { Report.Info("Jira issue resolved -IssueKey: " + curIssue.Key + "; IssueID: " + curIssue.Id); Report.LogHtml(ReportLevel.Info, ""+ curIssue.Id + ""); } else Report.Warn("Could not resolved Jira issue IssueKey: " + curIssue.Id); } catch (Exception e) { varinner = e.InnerException; stringstr = ""; if (inner != null) { varprop = inner.GetType().GetProperty("ErrorResponse"); if (prop != null) str = (string)prop.GetValue(e.InnerException, null); } Report.Error(e.Message + " (InnerException: " + e.InnerException + " " + str + ")"); } } } } ... việc kiểm thử tự động vào công cụ Ranorex Thiết kế kịch kiểm thử thực thi kiểm thử tự động cho phần mềm cụ thể Mục tiêu nhiệm vụ Mục tiêu Mục tiêu đề tài cải tiến công cụ Ranorex viết kịch kiểm thử. .. tổng quan lỗi phần mềm, kiểm thử phần mềm, giai đoạn kiểm thử phần mềm Trong có nêu kỹ thuật kiểm thử phần mềm, ưu nhược điểm loại kỹ thuật Trong chương tìm hiểu kiểm thử tự động công cụ phổ biến... Kiểm thử tự động thực Kiểm thử thủ công tốn thời gian công cụ phần mềm, nhanh nhiều so với kiểm thử thủ công Chủ yếu đầu tư vào nguồn nhân lực Kiểm thử thủ công áp dụng cho ca kiểm thử chạy vài