Bài thực hành Kiểm tra phần mềm - Số 6.1: Xây dựng tiện ích tìm các path chuyển trạng thái tuyến tính độc lập

I. Mục tiêu : 

  • Giúp SV làm quen với qui trình điển hình để chuyển 1 đồ thị chuyển trạng thái của 1 thành phần phần mềm thành bảng chuyển trạng thái.
  • Giúp SV làm quen với qui trình điển hình để xây dựng tiện ích tìm tự động các path chuyển trạng thái tuyến tính độc lập từ bảng chuyển trạng thái.

II. Nội dung : 

  • Dùng Excel tạo bảng chuyển trạng thái từ đồ thị chuyển trạng thái.
  • Thiết kế trực quan form giao diện của chương trình tìm tự động các path chuyển trạng thái tuyến tính độc lập từ bảng chuyển trạng thái, viết code cho hàm xử lý sự kiện để tìm tự động các path chuyển trạng thái tuyến tính độc lập từ bảng chuyển trạng thái.
doc 7 trang xuanthi 29/12/2022 2520
Bạn đang xem tài liệu "Bài thực hành Kiểm tra phần mềm - Số 6.1: Xây dựng tiện ích tìm các path chuyển trạng thái tuyến tính độc lập", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • docbai_thuc_hanh_kiem_tra_phan_mem_so_so_6_1_xay_dung_tien_ich.doc

Nội dung text: Bài thực hành Kiểm tra phần mềm - Số 6.1: Xây dựng tiện ích tìm các path chuyển trạng thái tuyến tính độc lập

  1. Trang 2 3. Chạy Excel, dùng 4 cột A-> D để chứa 4 thông tin sau của bảng chuyền trạng thái : Current State, Event, Action/Result, Next State. Dùng hàng đầu của bảng để chứa header các cột thông tin : Nhập 4 chuỗi Current State, Event, Action/Result, Next State lần lượt vào 4 cell từ A1 đến D1. 4. Dùng 6 hàng tiếp theo (từ 2 đến 7) chứa thông tin chuyển trạng thái xuất phát từ nút đầu (S hay null) : Nhập 6 cell từ A2 đến A7 cùng nội dung “S” hay “null”. Nhập 6 cell từ B2 đến B7 6 chuỗi miêu tả 6 sự kiện : giveinfo, payMoney, print, giveTicket, cancel, PayTimerout. Dựa vào đồ thị gốc, ta thấy chỉ có 1 sự kiện giveinfo có thể xảy ra khi hệ thống đang ở trạng thái đang xét (null), nhập chuỗi miêu tả hành động cần thực hiện tương ứng với sự kiện giveinfo là “StartPayTimer” vào cell C2, nhập chuỗi miêu tả trạng thái chuyển đến là “Made” vào cell D2. 5 sự kiện khác không xảy ra khi hệ thống ở trạng thái đang xét, ta nhập chuỗi miêu tả trạng thái hiện hành (S) vào 5 cell D3->D7. 5. Bỏ trống hàng 8 để ngăn cách thông tin của trạng thái kế tiếp. 6. Lặp lại bước 4 và 5 nhiều lần để xây dựng thông tin chuyển trạng thái xuất phát từ từng nút trạng thái còn lại trên đồ thị. 7. Kết quả ta có bảng chuyển như sau : Current State Event Action Next State S giveInfo startPayTimer Made S payMoney S S print S S giveTicket S S cancel S S PayTimerExpires S Made giveInfo Made Made payMoney Paid Made print Made Made giveTicket Made Made cancel Can-Cust Made PayTimerExpires Can-NonPay Paid giveInfo Paid Paid payMoney Paid Paid print Ticket Ticketed Paid giveTicket Paid Paid cancel Refund Can-Cust Paid PayTimerExpires Paid Ticketed giveInfo Ticketed Ticketed payMoney Ticketed Ticketed print Ticketed Ticketed giveTicket Used Ticketed cancel Refund Can-Cust Ticketed PayTimerExpires Ticketed Used giveInfo Used Used payMoney Used Used print Used Used giveTicket Used Used cancel Used Used PayTimerExpires Used Can-NonPay giveInfo Can-NonPay Can-NonPay payMoney Can-NonPay
  2. Trang 4 8. Dời chuột về button "Browse ", ấn kép chuột vào nó để tạo hàm xử lý sự kiện Click chuột cho button, cửa sổ mã nguồn sẽ hiển thị để ta bắt đầu viết code cho hàm. Lưu ý rằng để tạo hàm xử lý sự kiện bất kỳ cho đối tượng 1 cách chính quy, ta phải hiển thị cửa sổ thuộc tính của đối tượng, rồi hiển thị danh sách các sự kiện rồi mới định nghĩa hàm xử lý sự kiện mong muốn. 9. Viết code cho hàm btnStart_Click() như sau : private void btnStart_Click(object sender, EventArgs e) { //tạo form duyệt chọn file chứa thông tin về bảng chuyển OpenFileDialog dlg = new OpenFileDialog(); //hiển thị form duyệt chọn file cần xử lý DialogResult ret = dlg.ShowDialog(); //kiểm tra quyết định của người dùng, nếu người dùng chọn OK thì xử lý if (ret != DialogResult.OK) return; //hiển thị đường dẫn của file lên Textbox để người dùng dễ theo dõi txtPath.Text = dlg.FileName; //Chạy Excel. app = new Microsoft.Office.Interop.Excel.Application(); //Mở file var workbook = app.Workbooks.Open(txtPath.Text); //Chọn wroksheet chứa bảng chuyển. var worksheet = workbook.Worksheets[1]; //thiết lập vùng xử lý = ma trận nhiều hàng, cột chứa thông tin bảng chuyển Range rg = worksheet.Range("A2:Z10000"); int r = 1; //tìm trạng thái đầu buf1 = rg.get_Item(r,1).Value; //tìm trạng thái ở hàng kế tiếp buf2 = rg.get_Item(r + 1, 1).Value; //kiểm tra dấu hiệu kết thúc bảng : 2 hàng trống liên tiếp while (buf1 != null || buf2 != null) { //nếu còn hàng thông tin if (buf1 != null) { //nếu hàng cần xử lý r có thông tin thì cất vào phần tử row của ma trận SD SD[row, 0] = SIndex(rg.get_Item(r, 1).Value); SD[row, 1] = CIndex(rg.get_Item(r, 2).Value); SD[row, 2] = SIndex(rg.get_Item(r, 4).Value); row++; }
  3. Trang 6 sCList[sCCount] = s; return sCCount++; } //tác vụ tìm các phần còn lại của path chuyển trạng thái từ trạng thái it int TimTTKe(int it) { int r; //kiểm tra xem trạng thái cần xét đã có trong Path chưa ? for (r = 0; r < ttindex; r++) //nếu có rồi thì không xử lý nữa if (StateList[r].icode == it) return 0; //thiết lập hàng xử lý bắt đầu từ đầu r = 0; //tìm hàng đầu trong đoạn hàng miêu tả trạng thái it while (r < row && SD[r, 0] != it) r++; if (r == row) return 0; //nếu tìm được, lưu thông tin vào danh sách StateList[ttindex].icode = it; StateList[ttindex].fprint = 0; StateList[ttindex].row = r; L1: //tìm 1 trạng thái ngay sau trạng thái it while (r<row && SD[r,0] == it && SD[r,2] == it) r++; if (r == row || SD[r, 0] != it) { //đã tới trạng thái cuối trong path chuyển đang xử lý if (ttindex == 0) return 1; if (StateList[ttindex].fprint == 0) XuatKetqua(); //lùi lại trạng thái trước trạng thái cuối ttindex ; r = StateList[ttindex].row+1; it = StateList[ttindex].icode; goto L1; } //nếu tìm được, tìm trạng thái ngay sau nó if (SD[r, 0] == it && SD[r, 2] != it) { StateList[ttindex++].row = r; TimTTKe(SD[r, 2]); } return 1; } //tác vụ in kết quả = path chuyển trạng thái vừa tìm được void XuatKetqua() { buf1 = "Path " + (PathCnt++) + ": "; int i; for (i = 0; i <= ttindex; i++) { int it = StateList[i].icode; int r = StateList[i].row; StateList[i].fprint = 1; buf1 = buf1 + ssList[it]; if (i < ttindex) buf1 = buf1 + "(" + sCList[SD[r, 1]] + ")"; }