Testcase Ngày thực Dữ liều đầu vào EO
hiện Hình thức thực hiện quyền
TC1 24/11/2014 Trả cổ tức bằng tiền mặt 21/11/2014
TC2 27/11/2014 Trả cổ tức bằng tiền mặt 25/11/2014
TC3 24/11/2014 Niêm yết bổ sung 21/11/2014
TC4 25/11/2014 Niêm yết bổ sung 24/11/2014
TC5 27/11/2014 Thay đổi tỷ lệ FreeFloat 27/11/2014
4.1.3. Áp dụng kỹ thuật kiểm thử dòng điều khiển
Áp dụng kỹ thuật kiểm thử dòng điều khiển ta sẽ phân tích bài toán theo mã nguồn và theo tiêu chí phủ rẽ nhánh để kiểm thử dựa vào độ đo kiểm thử cấp 2 tức là
tất cả các điểm quyết định của đồ thị đều được thực hiện ít nhất 1 lần. Bên cạnh đó, ta còn thấy xuất hiện vòng lặp trong mã nguồn, nên việc tiến hành xây dựng kiểm thử dựa trên độ đo là chưa đủ mà ta cần phải xây dựng ca kiểm thử liên quan đến vòng lặp của chương trình. Ở mã nguồn 1, nhận thấy việc xác định vòng lặp tối đa là khó nên ta sẽ chỉ áp dụng sinh kiểm thử cho vòng lặp với bốn trường hợp đầu tiên (theo mục 3.2.1, tr34).
Mã nguồn của bài toán: Mã nguồn 1:
public datetime dtActionDate (datetime dtLastDateMoneyDiv, int
c_intCorporateType) {
DateTime _dtTemp= new DateTime();
Int32 _paramActionDate = -1;//Ngay TH
if(c_intCorporateType==(Int32)Common.CorporateActionType.Money
Dividend) {
//tra co tuc = tien ngay thuc hien = ngay DKCC-2
_dtTemp=_dtLastDateMoneyDiv.SelectedDate.Value.Date;
_dtTemp = _dtTemp.AddDay(_paramActionDate);//
_dtTemp = _dtTemp.AddDay(_paramActionDate);//
}
//truong hop niem yet bo sung = ngay DKCC-1
elseif(c_intCorporateType==(Int32)Common.CorporateActionType.A ddListing)
{
_dtTemp = dtNYDate.SelectedDate.Value.Date;
_dtTemp = _dtTemp.AddDay(_paramActionDate); }
//truong hop ChangeFreeFloat
elseif(c_intCorporateType==(Int32)Common.CorporateActionType.C hangeFreeFloat) { _dtTemp =dtLastDateChangeFF.SelectedDate.Value.Date; } while( checkHoliday(dtTemp)) { dtTemp = _dtTemp.AddDay(-1); } return _dtTemp ; }
Mã nguồn 2:
public datetime dtActionDate (datetime dtLastDateMoneyDiv, int
c_intCorporateType) {
DateTime _dtTemp= new DateTime();
Int32 _paramActionDate = -1;//Ngay TH
if(c_intCorporateType==(Int32)Common.CorporateActionType.Money
Dividend) {
//tra co tuc = tien ngay thuc hien = ngay DKCC-2
_dtTemp=_dtLastDateMoneyDiv.SelectedDate.Value.Date; _dtTemp = _dtTemp.AddDay(_paramActionDate);
_dtTemp = _dtTemp.AddDay(_paramActionDate); }
//truong hop niem yet bo sung
elseif(c_intCorporateType==(Int32)Common.CorporateActionType.A ddListing)
{
_dtTemp = dtNYDate.SelectedDate.Value.Date;
_dtTemp = _dtTemp.AddDay(_paramActionDate); }
//truong hop ChangeFreeFloat
elseif(c_intCorporateType==(Int32)Common.CorporateActionType.C hangeFreeFloat) { _dtTemp =dtLastDateChangeFF.SelectedDate.Value.Date; } if( checkHoliday(dtTemp)) { dtTemp = _dtTemp.AddDay(-1); } return _dtTemp ; }
Bảng 4.5 Quy ƣớc các điều kiện, hành động trong sơ đồ CFG của bài toán 1
STT Điều kiện Quy
ƣớc
1. c_intCorporateType ==(Int32)Common.CorporateActionType.MoneyDividend C1
2. c_intCorporateType ==(Int32)Common.CorporateActionType. AddListing C2
3. c_intCorporateType ==(Int32)Common.CorporateActionType.
4. checkHoliday(dtTemp)== true C4 5. _dtTemp = dtLastDateMoneyDiv.SelectedDate.Value.Date; _dtTemp = _dtTemp.AddDay(_paramActionDate);//-2 _dtTemp = _dtTemp.AddDay(_paramActionDate);//-1 A5 6. _dtTemp = dtNYDate.SelectedDate.Value.Date; _dtTemp = _dtTemp.AddDay(_paramActionDate); A6 7. _dtTemp = dtLastDateChangeFF.SelectedDate.Value.Date; A7 8. _dtTemp = _dtTemp.AddDay(-1); A8
Áp dụng kỹ thuật dòng điều khiển ta có sơ đồ CFG như sau:
Với mã nguồn 1:
Hình 4.1Sơ đồ dòng điều khiền cho bài toán 1 – mã nguồn 1
Dựa vào lược đồ ta sẽ xây dựng đường đi đảm bảo điều kiện đi qua tất cả các câu lệnh và các điều kiện T-F đều được thực hiện ít nhất 1 lần.
Đường đi 1: 1-2-3(T)-4-9(T)-10-11 Đường đi 2: 1-2-3(T)-4-9(F)-11 Đường đi 3: 1-2-3(F)-5(T)-6-9(T)-10-9(F)-11 Đường đi 4: 1-2-3(F)-5(T)-6-9(F)-11 Đường đi 5: 1-2-3(F)--5(F)-7(T)-8-9(F)-11 Đường đi 6: 1-2-3(F)--5(F)-7(T)-8-9(T)-10-9(F)-11 Đường đi 7: 1-2-3(F)--5(F)-7(F)-9(T)-10-9(F)-11 Đường đi 8: 1-2-3(F)-5(F)-7(F)-9(F)-11
Do đó ta có 8 đường đi từ sơ đồ CF.
Trong hàm trên có xuất hiện vòng lặp while do đó cần sinh ra ca kiểm thử cho vòng lặp với trường hợp như sau:
Vòng lặp không thực hiện lần nào. Nhận thấy đường đi thứ 2 thỏa mãn điều kiền này.
Vòng lặp thực hiện 1 lần ứng với đường đi thứ 1.
Vòng lặp thực hiện 2 lần. Đường đi 9: 1-2-3(T)-4-9(T)-10-9(T)-10-9(F)-11 Vòng lặp thực hiện k lần (ta chọn k =5). Đường đi 10:
1-2-3(T)-4-9(T)-10-9(T)-10-9(T)-10-9(F)-11. Do đó số đường đi cần thiết là 10.
Ta có tescace được sinh ra từ đường đi như sau:
Bảng 4.6 Các ca kiểm thử sinh ra theo kỹ thuật dòng điều khiển với mã nguồn 1 Testcase Đƣờng đi Testcase Đƣờng đi
Dữ liệu đầu vào Kết quả mong đợi Ngày thực
hiện Hình thức thực hiện quyền
TC1 Đường đi 1 24/11/2014 Trả cổ tức bằng tiền mặt 21/11/2014
TC2 Đường đi 2 27/11/2014 Trả cổ tức bằng tiền mặt 25/11/2014
TC3 Đường đi 3 03/09/3014 Niêm yết bổ sung 01/09/2014
TC4 Đường đi 4 27/11/2014 Niêm yết bổ sung 26/11/2014
TC5 Đường đi 5 27/11/2014 Thay đổi tỷ lệ FreeFloat 27/11/2014
Đường đi 6
Không thực thi được do ngày thực hiện là ngày đăng ký cuối cùng, mà ngày thực hiện luôn là ngày làm việc (tức là không thuộc ngày nghỉ, lễ tết) nên ngày đăng ký cuối cùng cũng là ngày làm việc
Đường đi 7
Không thực thi được do nếu ngày thực hiện không thuộc hình thức nào, ngày đăng ký cuối cùng sẽ nhận giá trị mặc định của kiểu DateTime là ngày 01/01/1900 là ngày thứ hai nên không thể thỏa mãn điều kiện là ngày nghỉ lể
TC6 Đường đi 8 27/11/2014 Không thuộc hình thức nào Hiển thị thông báo “Không thuộc hình thức thực hiện quyền nào”
TC7 Đường đi 9 25/11/2014 Trả cổ tức bằng tiền mặt 21/11/2014
TC8 Đường đi 10 23/02/2015 - 05/01/2015 âm lịch
Trả cổ tức bằng tiền mặt 16/02/2015
Hình 4.2 Sơ đồ dòng điều khiền cho bài toán 1 – mã nguồn 2
Dựa vào lược đồ (Hình 3.9) ta sẽ xây dựng đường đi đảm bảo điều kiện đi qua tất cả các câu lệnh và các điều kiện T-F đều được thực hiện ít nhất 1 lần.
Đường đi 1: 1-2-3(T)-4-9(T)-10-11 Đường đi 2: 1-2-3(T)-4-9(F)-11
Đường đi 4: 1-2-3(F)-5(T)-6-9(F)-11 Đường đi 5: 1-2-3(F)--5(F)-7(T)-8-9(F)-11 Đường đi 6: 1-2-3(F)--5(F)-7(T)-8-9(T)-10-11 Đường đi 7: 1-2-3(F)--5(F)-7(F)-9(T)-10-11 Đường đi 8: 1-2-3(F)-5(F)-7(F)-9(F)-11 Do đó ta có 8 đường đi từ sơ đồ CF.
Ta có tescace được sinh ra từ đường đi như sau:
Bảng 4.7 Các ca kiểm thử sinh ra theo kỹ thuật dòng điều khiển với mã nguồn 2 Testcase Đƣờng đi Testcase Đƣờng đi
Dữ liệu đầu vào
EO Ngày thực
hiện Hình thức thực hiện quyền
TC1 Đường đi 1 24/11/2014 Trả cổ tức bằng tiền mặt 21/11/2014
TC2 Đường đi 2 27/11/2014 Trả cổ tức bằng tiền mặt 25/11/2014
TC3 Đường đi 3 03/09/2014 Niêm yết bổ sung 01/09/2014
TC4 Đường đi 4 27/11/2014 Niêm yết bổ sung 26/11/2014
TC5 Đường đi 5 27/11/2014 Thay đổi tỷ lệ FreeFloat 27/11/2014
Đường đi 6
Không thực thi được do ngày thực hiện là ngày đăng ký cuối cùng, mà ngày thực hiện luôn là ngày làm việc (tức là không thuộc ngày nghỉ, lễ tết) nên ngày đăng ký cuối cùng cũng là ngày làm việc
Đường đi 7
Không thực thi được do nếu ngày thực hiện không thuộc hình thức nào, ngày đăng ký cuối cùng sẽ nhận giá trị mặc định của kiểu DateTime là ngày 01/01/1900 là ngày thứ hai nên không thể thỏa mãn điều kiện là ngày nghỉ lể
TC6 Đường đi 8 27/11/2014 Không thuộc hình thức
nào
01/01/1900
4.1.4. Áp dụng kỹ thuật kiểm thử dòng dữ liệu
Dựa vào mã nguồn của bài toán và tiêu chí sinh kiểm thử All-p-uses/Some-c-uses để tiến hành sinh các đường đi từ đồ thị dòng dữ liệu sau.
Bảng 4.8 Quy ƣớc ký hiệu của các điều kiện trong sơ đồ DFG của bài toán 1
Điều kiện Điều kiện
là True
Điều kiện là False
c_intCorporateType
==(Int32)Common.CorporateActionType.MoneyDividend
C1 ~C1 c_intCorporateType==(Int32)Common.CorporateActionType.
AddListing
c_intCorporateType ==(Int32)Common.CorporateActionType. ChangeFreeFloat
C3 ~C3 checkHoliday(dtTemp)== true C4 ~C4
Hình 4.3 Sơ đồ dòng dữ liệu cho bài toán 1 – mã nguồn 1
Từ sơ đồ ta có số đường đi như sau: Path1: 1-2-3-8-9-8-10 Path2: 1-2-3-8-10 Path 3: 1-2-4-6-8-9-8-10 Path 4: 1-2-4-6-8-10 Path 5: 1-2-4-5-8-9-8-10 Path 6: 1-2-4-5-8-10 Path 7: 1-2-4-6-7-8-9-8-10 Path 8: 1-2-4-6-7-8-10 Tổng số đường đi là 8 .
Bảng 4.9 Các ca kiểm thử sinh ra theo kỹ thuật dòng dữ liệu với mã nguồn 1 Testcase Đƣờng đi Testcase Đƣờng đi
Dữ liệu đầu vào
Kết quả Ngày thực
hiện
Hình thức thực hiện quyền
TC1 Đường đi 1 24/11/2014 Trả cổ tức bằng tiền mặt 21/11/2014
TC2 Đường đi 2 27/11/2014 Trả cổ tức bằng tiền mặt 25/11/2014
Đường đi 3
Không thực thi được do nếu ngày thực hiện không thuộc hình thức nào, ngày đăng ký cuối cùng sẽ nhận giá trị mặc định của kiểu DateTime là ngày 01/01/1900 là ngày thứ hai nên không thể thỏa mãn điều kiện là ngày nghỉ lể
TC3 Đường đi 4 27/11/2014 Không thuộc hình thức
thực hiện quyền nào
01/01/1900
TC4 Đường đi 5 03/09/2014 Niêm yết bổ sung 01/09/2014
TC5 Đường đi 6 27/11/2014 Niêm yết bổ sung 26/11/2014
Đường đi 7
Không thực thi được do ngày thực hiện là ngày đăng ký cuối cùng, mà ngày thực hiện luôn là ngày làm việc (tức là không thuộc ngày nghỉ, lễ tết) nên ngày đăng ký cuối cùng cũng là ngày làm việc
TC6 Đường đi 8 27/11/2014 Thay đổi tỷ lệ FreeFloat 27/11/2014
Hình 4.4 Sơ đồ dòng dữ liệu cho bài toán 1 – mã nguồn 2
Từ sơ đồ ta có số đường đi như sau: Path1: 1-2-3-8-9-10 Path2: 1-2-3-8-10 Path 3: 1-2-4-6-8-9-10 Path 4: 1-2-4-6-8-10 Path 5: 1-2-4-5-8-9-10 Path 6: 1-2-4-5-8-10 Path 7: 1-2-4-6-7-8-9-10 Path 8: 1-2-4-6-7-8-10 Tổng số đường đi là 8 .
Ta có tescace được sinh ra từ đường đi như sau:
Bảng 4.10 Các ca kiểm thử sinh ra theo kỹ thuật dòng dữ liệu với mã nguồn 2 Testcase Đƣờng đi Testcase Đƣờng đi
Dữ liệu đầu vào
EO Ngày thực
hiện Hình thức thực hiện quyền
TC1 Đường đi 1 24/11/2014 Trả cổ tức bằng tiền mặt 21/11/2014
TC2 Đường đi 2 27/11/2014 Trả cổ tức bằng tiền mặt 25/11/2014
Đường đi 3
Không thực thi được do nếu ngày thực hiện không thuộc hình thức nào, ngày đăng ký cuối cùng sẽ nhận giá trị mặc định của kiểu DateTime là ngày
01/01/1900 là ngày thứ hai nên không thể thỏa mãn điều kiện là ngày nghỉ lể
TC3 Đường đi 4 27/11/2014 Không thuộc hình thức thực hiện quyền nào 01/01/1900
TC4 Đường đi 5 03/09/2014 Niêm yết bổ sung 01/09/2014
TC5 Đường đi 6 27/11/2014 Niêm yết bổ sung 26/11/2014
Đường đi 7
Không thực thi được do ngày thực hiện là ngày đăng ký cuối cùng, mà ngày thực hiện luôn là ngày làm việc (tức là không thuộc ngày nghỉ, lễ tết) nên ngày đăng ký cuối cùng cũng là ngày làm việc
TC6 Đường đi 8 27/11/2014 Thay đổi tỷ lệ FreeFloat 27/11/2014
4.1.5. Kết luận
Bảng 4.11 So sánh độ bao phủ của các kỹ thuật kiểm thử với mã nguồn 1 Kỹ thuật Phân lớp tƣơng Kỹ thuật Phân lớp tƣơng
đƣơng
Bảng quyết định
Dòng dữ liệu Dòng điều khiển
đƣơng Bảng quyết định 5/8 N/A 5/6 5/8 Dòng dữ liệu 100% 100% N/A 6/8 Dòng điều khiển 100% 100% 6/6 N/A
Bảng 4.12 So sánh độ bao phủ của các kỹ thuật kiểm thử với mã nguồn 2 Kỹ thuật Phân lớp tƣơng Kỹ thuật Phân lớp tƣơng
đƣơng Bảng quyết định Dòng dữ liệu Dòng điều khiển Phân lớp tƣơng đƣơng N/A 5/5 6/6 5/5 Bảng quyết định 5/8 N/A 5/6 4/6 Dòng dữ liệu 100% 100% N/A 6/6 Dòng điều khiển 6/8 4/5 6/6 N/A
Bảng 4.13 Thống kê số lỗi phát hiện đƣợc khi thực thi hai mã nguồn – bài toán 1 Kỹ thuật Mã nguồn Phân lớp tƣơng đƣơng Bảng quyết định Dòng dữ liệu Dòng điều khiển
Mã nguồn1 (đúng) 0 (lỗi) 0 (lỗi) 1 (lỗi) 1 (lỗi)
Mã nguồn 2 (sai) 2 (lỗi) 1 (lỗi) 1 (lỗi) 1 (lỗi)
Test case sinh lỗi TC6, TC7 TC3 TC6 TC3
Kết quả thực tế
(với trường hợp lỗi) 22/11/2014 22/11/2014 01/01/1900 01/01/1900
Nhận xét:
Kỹ thuật phân lớp tƣơng đƣơng:
So với kỹ thuật bảng quyết định: Từ các ca kiểm thử sinh ra bởi hai kỹ thuật này ta nhận thấy tất cả các ca kiểm thử sinh ra theo kỹ thuật phân lớp tương đương điều thỏa mãn các ca kiểm thử sinh ra theo kỹ thuật bảng quyết định . Do đó độ bao phủ của kỹ thuật này so với kỹ thuật bảng quyết định là: 5 / 5 .
Với mã nguồn 1:Thì các ca kiểm thử sinh ra theo kỹ thuật này đáp ứng được 8 ca kiểm thử sinh ra theo kỹ thuật kiểm thử dòng điều khiển. Do đó độ bao phủ của kỹ thuật này so với kỹ thuật dòng điều khiển là 8/8.
Với mã nguồn 2:Thì các ca kiểm thử sinh ra theo kỹ thuật này đáp ứng được 6 ca kiểm thử sinh ra theo kỹ thuật kiểm thử dòng điều khiển. Do đó độ bao phủ của kỹ thuật này so với kỹ thuật dòng điều khiển là 6/6.
So với kỹ thuật dòng dữ liệu: Ta có các ca kiểm thử sinh ra theo sơ đồ dòng dữ liệu cho mã nguồn 1 và mã nguồn 2 là như nhau. Do đó, các ca kiểm thử sinh ra theo kỹ thuật này đều bao gồm các ca kiểm thử sinh ra theo kỹ thuật dòng dữ liệu. Vậy, độ bao phủ là 6/6.
Kỹ thuật bảng quyết định:
So với kỹ thuật phân lớp tương đương: Ta có các ca kiểm thử sinh ra bởi kỹ thuật này chỉ thỏa mãn được 5 ca kiểm thử sinh ra bởi kỹ thuật phân lớp tương đương, mà không thỏa mãn được các ca kiểm thử TC1, TC6, TC8 . Do đó độ bao phủ của kỹ thuật này so với kỹ thuật phân lớp tương đương là: 5/8.
So với kỹ thuật dòng điều khiển:
Với mã nguồn 1: Ta có các ca kiểm thử sinh ra bởi kỹ thuật này thỏa mãn được 5 ca kiểm thử sinh ra bởi kỹ thuật dòng điều khiển, mà không thỏa mãn được 3 ca kiểm thử TC3, TC5 và TC8. Do đó bộ bao phủ của kỹ thuật này so với kỹ thuật dòng điều khiển là 5/8.
Với mã nguồn 2: Ta có các ca kiểm thử sinh ra bởi kỹ thuật này thỏa mãn được 4 ca kiểm thử sinh ra bởi kỹ thuật dòng điều khiển, mà không thỏa mãn được 2 ca kiểm thử là TC3 và TC6. Do đó bộ bao phủ của kỹ thuật này so với kỹ thuật dòng điều khiển là 4/6.
So với kỹ thuật dòng dữ liệu: Ta có các ca kiểm thử sinh ra bởi kỹ thuật này chỉ thỏa mãn 5 ca kiểm thử sinh ra theo kỹ thuật dòng dữ liệu, mà không thỏa mãn ca kiểm thử TC3. Do đó độ bao phủ của kỹ thuật bảng quyết định so với kỹ thuật dòng dữ liệu là 5/6.
Kỹ thuật dòng điều khiển:
Kỹ thuật dòng điều khiển áp dụng cho mã nguồn 1 so với kỹ thuật phân lớp tương đương và bảng quyết định: Ta có các ca kiểm thử sinh ra bởi kỹ thuật này đều thỏa mãn được tất cả các ca kiểm thử sinh ra bởi hai kỹ thuật phân lớp tương đương và bảng quyết định. Do đó độ bao phủ của kỹ thuật dòng điều khiển so với hai kỹ thuật phân lớp tương đương và bảng quyết định là 100%.
Kỹ thuật dòng điều khiển áp dụng cho mã nguồn 2 so với kỹ thuật phân lớp tương đương: Ta có các ca kiểm thử sinh ra bởi kỹ thuật này thỏa mãn được 6 ca kiểm thử sinh ra bởi hai kỹ thuật phân lớp tương đương gồm TC1, TC2, TC3, TC4, TC5, TC8 và không thỏa mãn được 2 test case là TC6, TC7. Do đó độ bao phủ của kỹ