.10Ràng buộc 3 biến

Một phần của tài liệu (LUẬN văn THẠC sĩ) xây dựng công cụ hỗ trợ sinh ca kiểm thử cặp (Trang 51)

Ngoài việc test tất cả những sự kết hợp hợp lệ, ngƣời ta thƣờng sử dụng để kiểm tra giá trị ngoài phạm vi cho phép để đảm bảo phần mềm xử lý các điều kiện lỗi đúng.

Hãy xem xét ví dụ 5, một số a hoặc b bất kỳ là số thực hợp lệ.Tuy nhiên nó chỉ có ý nghĩa khi a và b đều lớn hơn hoặc bằng không.Vì lý do đó cần phải xử lý trƣớc khi tính toán.

Ví dụ 5:

float SumSquareRoots( float a, float b )

{ if ( a < 0 ) throw error; if ( b < 0 ) throw error; return ( sqrt( a ) + sqrt( b ));

};

PICT cho phép đánh dấu giá trị invalid trong ví dụ 5, các đầu ra của mô hình phải có thuộc tính sau.

 Tất cả giá trị valid sẽ đƣợc kết hợp với tất cả giá trị valid khác trong trƣờng hợp là positive.

 Nếu một trƣờng hợp chứa giá trị invalid thì chỉ có một giá trị nhƣ vậy.

 Tất cả những giá trị không hợp lệ đƣợc kết hợp với tất cả các giá trị hợp lệ đƣợc gọi là ca kiểm thử phủ định.

Sample model with invalid values marked with ‗*‘: A: *LessThanZero, Zero, GreaterThanZero

B: *LessThanZero, Zero, GreaterThanZero

e. Thiết lập kết quả mong muốn (Specifying Expected Results )

Có thể thiết lập kết quả trong ràng buộc tham số nhƣ ví dụ 6. Ví dụ 6:

# Input parameters:

Array: *Null, Empty, Valid

Start: *TooLow, InRange, *TooHigh Count: *TooFew, Some, All, *TooMany

# Result parameters:

$Result: Pass, OutOfBounds, InvalidPointer

# Result rules:

IF [Array] IN {"Empty", "Valid"} AND [Start] IN {"InRange"} AND[Count] IN {"Some", "All"} THEN [$Result] = "Pass";

IF [Array] = "*Null" THEN [$Result] = "InvalidPointer";

IF [Start] IN {"*TooLow", "*TooHigh"} OR [Count] IN {"*TooFew","*TooMany"} THEN [$Result] = "OutOfBounds";

2.3.4 Cài đặt và sử dụngPICT [9]

Bƣớc1. Download và thực hiện cài đặt tại link:

http://download.microsoft.com/download/f/5/5/f55484df-8494-48fa-8dbd- 8c6f76cc014b/PICT33.msi

Bƣớc 2.Mở CMD (Run ->CMD).

Bƣớc 3.Trỏ đƣờng dẫn đến thƣ mục đặt file để chạy PICT

Hình 2.11Nội dung file chạy thử nghiệm

Bƣớc 4. Gõ:[PICTfilepict2.txt > filedaura2.txt] để xuất ra file txt. Gõ: [PICT filepict2.txt ] để xuất file tại command.

Kết quả hiển thị trên command

Hình 2.12Kết quả PICThiển thị trên command

Kết quả hiển thị tại nơi đặt file:

2.4 Ứng dụng của pairwise testing

Kết quả sau khi lựa chọn phối hợp tập giá trị của các tham số sẽ đƣợc sử dụng:

a. Lựa chọn môi trƣờng kiểm thử.

Nếu đầu ra của paiwise là những yếu tố liên quan đến phần cứng, môi trƣờng, hệ điều hành… hay có thể tổng quát kiểm thử trên những môi trƣờng nào.Thì đây cũng là một cách chúng ta cài đặt và kiểm thử trên những môi trƣờng đó.

b. Viết ca kiểm thử chức năng bằng tay.

Trƣớc khi biết đến pairwise, khi viết ca kiểm thử cho kiểm thử chức năng (testcase function), chúng ta hay lựa chọn giá trị theo phƣơng pháp ramdom, phải nghĩ ngợi và tính toán. Sự lựa chọn này rất nguy hiểm, có thể nghiên về một phía nào đấy, cover không tốt các tham số.Bây giờ chúng ta có thể áp dụng pairwise.Chỉ việc áp dụng và lấy các giá trị viết các ca kiểm thử.Tiết kiệm thời gian và tính toán.

c. Sử dụng làm data đầu vào cho các công cụ kiểm thử tự động nhƣ selenium webdriver.

Ví dụ cụ thể nhƣ chúng ta hoàn toàn viết đƣợc ca kiểm thửSelenium Driver để lấy dữ liệu từ file excell và chạy lần lƣợt các giá trị trong từng row đó.

Lấy dữ liệu từ file excell lên:

File excell có kết quả đƣợc xuât từ pairwise

Stt Username Password Result ITC

1 tunthcm@gmail.com minhanh2929 pass 2 luuminhvu5114@gmail.com minhanh2929 pass 3 luuminhquyet20102015 minhanh2929 pass

4 .. .. ..

5

Chạy selenium webdriver + apache poi

import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.concurrent.TimeUnit; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; publicclass ReadExcellfile {

privatestatic WebDriver driver = null;

publicstatic XSSFWorkbook wordbook = null;

//public static String filepath= "D:\\DRIVERSELENIUM\\Selenium_java poi_excell\\src\\testData\\Testdata.xlsx";

publicstatic String filepath= "C:\\Users\\minhld\\Desktop\\Thu vien dung selenium web driver\\Testdata.xlsx";

publicstatic String sheetname ="sheet1";

publicstaticvoid main(String[] args) throws IOException, InterruptedException {

driver = new FirefoxDriver();

//Start facebook

1) driver.get("https://www.facebook.com/");

// Read file

int rowcount=0;

2) File file = new File(filepath);

3) FileInputStream stream = new FileInputStream(file); 4) wordbook = new XSSFWorkbook(stream);

5) XSSFSheet sheet = wordbook.getSheet(sheetname); 6) rowcount = sheet.getLastRowNum();

7) for (int i =1; i<=rowcount; i++ ) {

XSSFRow row = sheet.getRow(i); XSSFCell cell1 = row.getCell(1); XSSFCell cell2 = row.getCell(2);

String datacell1 = cell1.getStringCellValue(); String datacell2 = cell2.getStringCellValue();

driver.findElement(By.id("email")).sendKeys(datacell1);

// find element id"pass" and input value on there

driver.findElement(By.id("pass")).sendKeys(datacell2);

// supmitlên form.

driver.findElement(By.xpath("//form[@id='login_form']/table/tbo dy/tr[2]/td[3]/label/input")).click();

System.out.println("Dang den phan row thư "+i);

driver.quit();

driver = new FirefoxDriver();

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

driver.get("https://www.facebook.com/");

// Thread.sleep(5000);

} } }

2.5 Đánh giá hiệu quả của kỹ thuật pairwise.

Kết quả thực nghiệm tại [2] cho các thiết bị y tế và hệ thống cơ sở dữ liệu phân tán cho thấy, kiểm thử cặp đôiphát hiện hơn 90% của các khuyết tật, trong khi đó, thử nghiệm cặp 4 sẽ phát hiện 100% các khuyết tật.

Với các ứng dụng trình duyệt và máy chủ, kiểm thử cặp sẽ phát hiện khoảng 70% các khuyết tật, trong khi thử nghiệm cặp 6 sẽ phát hiện 100% các khuyết tật.

CHƢƠNG 3: XÂY DỰNG CÔNG CỤ SINH CA KIỂM THỬ TỰ ĐỘNG3.1 Ý tƣởng của bài toán 3.1 Ý tƣởng của bài toán

Hiện nay Selenium IDE có rất nhiều ƣu điểm trong việc hỗ trợ kiểm thử tự động trên nền web.Tuy nhiênSelenium IDE chỉ có thể tạo ra các ca kiểm thử khi web đã hình thành.Việc tạo ra ca kiểm thử trƣớc đó là không thể.Hơn nữa mất khá nhiều thời gian để tạo ra từng ca kiểm thử.Nhƣng đây là công cụ mà tôi thấy tâm đắc.Tôi mong muốn có thể ứng dụng đƣợc nó vào trong công việc thiết kế ca kiểm thử và thực hiện kiểm thử của mình.Vì vậy tôi mong muốn có thể tạo ra một công cụ có khả năng tự sinh ca kiểm thử dạng Selenium IDE và ngoài ra còn có đƣợc những đặc điểm sau:

 Đƣợc sử dụng lại trong Selenium IDE.

 Vẫn đảm bảo đƣợc khi webpage thay đổi.

 Tạo trƣớc khi webpage hình thành.

 Kết hợp đƣợc kỹ thuật pairwise vào trong đó.

Trong luận văn này, tôi xin giới thiệu công cụ kiểm thử tự động đƣợc phát triển theo ý tƣởng đã đặt đề ra.

3.2 Tìm hiểm về công cụ kiểm thử tự động trên nền web Selenium IDE.

Selenium IDE là công cụ hỗ trợ việc kiểm thử chức năng tự động cho ứng dụng Web.Công cụ này đƣợc cài đặt nhƣ một add-on cho trình duyệt Firefox.

Chức năng chính của selenium IDE: Nó hoạt động bằng cách ghi lại các thao tác của chúng ta trên trình duyệt (record) và chạy lại những thao tác đã ghi(playback).

Khi chúng ta bật Selenium lên và thao tác trên ứng dụng web.Tất cả những thao tác đó sẽ đƣợc ghi lại và lƣu trên Selenium IDE. Những lần chạy sau này, chúng ta chỉ cần mở ca kiểm thử đã đƣợc ghi lại đó và click vào playback. Selenium IDE sẽ tự động chạy lại các thao tác mà chúng ta đã thực hiện lần trƣớc.Nếu gặp lỗi ở đâu, công cụ sẽ dừng và báo lỗi ở đó.

Cấu trúc một ca kiểm thử Selenium IDE:

Một ca kiểm thử Selenium IDE dạng html đƣợc cấu trúc đơn giản là, mỗi một sự kiện sẽ là một dòng. Xem hình 3.2.

Hình 3.2Cấu trúc chính của một ca kiểm thử Selenium IDE

Một dòng Selenium IDE sẽ gồm có 3 cột:

 Dòng đầu tiên của Selenium IDE luôn luôn là thao tác mở file. <td>open</td>

<td></td> <td></td>

 Từ dòng thứ 2 trở đi là, mõi dòng sẽ là mỗi thao tác tƣơng ứng trên web.

 <td> của đầu tiên của dòng sẽ thể hiện loại phần tử html trên web. Các phần tử html đƣợc định nghĩa nhƣ bảng 3.1:

Stt Loại phần tử html Giá trị tại cột đầu tiên của hàng

1 Texbox type

2 Button click hoặc là clickAndWait

3 Combobox select

4 Checkbox click

5 Link clickAndWait hoặc là click

 <td> thứ 2 của dòng là những value key, nó có thể là id, là path,…

Stt Loại phần tử Định nghĩa phổ biến Cách định nghĩa khác 1 Textbox id=u_0_1

name, css, link, ui, xpath…

2 combobox id=day name, css, link, ui, xpath… 3 Radio button id=u_0_f name, css, link, ui, xpath… 4 Button id=u_0_j name, css, link, ui, xpath… 5 Click link link=Tạo Trang

name, css, link, ui, xpath…

 <td> thứ 3 của dòng là những giá trị đƣợc nhập vào bởi chúng ta…

Stt Loại phần tử Định nghĩa 1 Textbox

Giá trị nhập tại textbox

2 combobox

Giá trị lựa chọn tại combobox

3 Radio button Ko có

4 Button ko có

5 Click link ko có

3.3 Phân tích bài toán 3.3.1 Vấn đề cần giải quyết 3.3.1 Vấn đề cần giải quyết

Để thực hiện ý tƣởng trên, tôi đƣa ra một số vấn đề cần giải quyết nhƣ sau:

 Vấn đề 1: Xác định những phần tử trên trang web cần kiểm tra tƣơng tác.

 Địa chỉ URL của trang cần kiểm thử.

 Các phần tử trên trang cần kiểm thử nhƣ là: Textbox, combobox, button, link, radio button, verify text.

 Tƣơng tác với các phần tử thông qua thuộc tính nào?

 Vấn đề 2: Trong một trang web thì một loại phần tử nhƣ textbox, combobox … sẽ có thể có nhiều, và công cụ sẽ phải cho phép thêm hoặc bớt textbox, combobox… tùy ý

 Vấn đề 3: Thứ tự thêm trên giao diện và thứ tự sắp xếp trong file Selenium IDE sẽ đƣợc thiết kế nhƣ thế nào.

 Vấn đề 4: Phân tử có nhiều giá trị nhƣ textbox, combobox sẽđƣa vào thế nào.

 Vấn đề 5: Xây dựng hay sử dụng thuật toán nào để có thể sinh ra đƣợc nhiều ca kiểm thử cùng một lúc. Làm sao để có thể ứng dụng đƣợc pairwise vào trong thuật toán này.

3.3.2 Cách thức giải quyết vấn đề.

Tôi đã giải quyết lần lƣợt các vấn đề trên. Cụ thể nhƣ sau:

 Vấn đề 1: Tại biểu mẫu nhập liệu phải có một số input nhƣ sau

 Địa chỉ URL chứa trang web cần kiểm thử.

 Đƣa các phần tử cần thực hiện thao tác là: textbox, combobox, radio, button, link..thành các đầu vào.

 Tƣơng tác các phần tử qua thuộc tính id.

 Vấn đề 2: Thiết kế biểu mẫu nhập liệu (form) cho phép thêm hoặc bớt đƣợc nhiều phần tử một cách linh động. Xem xét phần tử từ (5->14) trên tại hình

 Vấn đề 3: Đƣa thuộc tính nhập (Order) để xác định thứ tự hiển thị thao tác trên file Selenium IDE. Thành phần (7) tại hình

 Vấn đề 4: Các phần tử có nhiều value sẽ đƣa vào bằng cách cách nhau bởi dấu (,).

 Vấn đề 5: Sử dụng thuật toán IPO trong phân tích tại phần (2.3.2) để làm thuật toán sinh nhiều ca kiểm thử cùng lúc theo phƣơng pháp pairwise.

 Vấn đề 6: File Selenium IDE xuất ra có dạng html, đƣợc miêu tả dƣới dạng bảng.

 Selenium IDE thì mỗi một sự kiện sẽ đƣợc định nghĩa là một dòng gồm có 3 column. Column thứ nhất luôn luôn thể hiện loại sự kiện input, Column thứ 2 chính là các id của sự kiện input đó. Và column thứ 3 chính là value của input đó.

 Dòng nào ở trên sẽ đƣợc thực hiện trƣơc, dòng nào ở dƣới sẽ thƣc hiện sau.

 Tôi cũng thấy rằng nên đƣa ra nhiều ca kiểm thử thay vì 1 script.

3.3.3 Cách thức sinh ca kiểm thử của công cụ

Công cụ sinh ca kiểm thử đƣợc chia ra làm 2 giai đoạn. Giai đoạn chuẩn bị và sinh ca kiểm thử.

 Giai đoạn chuẩn bị sử dụng thuật toán IPO:

Kết quả thực hiện giai đoạn 1. Đƣơc đóng gói là thƣ viện: IPOlid. Mã nguồn của thuật toán IPO:

1) publicstaticTestSet CreateTestSet(List<IpoTestItem> testItemList) 2) {

3) _logger.InitLog();

4) TestSet testSet = newTestSet(); 5) testSet.Add(newIpoTestCase());

6) _logger.Log("=========================="); 7) _logger.Log("START IPO");

8) int n = testItemList.Count;

// begin

// for the first two parameters p1 and p2

// T := {(v1, v2) | v1 and v2 are values of p1 and p2, respectively};

9) if (n > 0) { testSet.UpdateTestItem(testItemList[0]); } 10)if (n > 1) { testSet.UpdateTestItem(testItemList[1]); } // if n = 2 then stop; 11)if (n > 2) {

// for the remaining parameters

// for parameter pi, i = 3, 4, ..., n do

for (int i = 2; i < n; i++) {

// logging

_logger.Log("IPO i=" + i);

// begin

PairInventory pairInventory = newPairInventory(testItemList, i);

// horizontal growth

// for each test (v1, v2, ..., vi-1) in T do

// replace it with (v1, v2, ..., vi-1, vi), where vi is a value of pi

IpoHorizontalGrowth(testSet, testItemList[i], pairInventory);

// vertical growth

// while T does not cover all pairs between pi and each of p1, p2, ..., pi-1 do

// add a new test for p1, p2, ..., pi to T;

IpoVerticalGrowth(testSet, testItemList[i], pairInventory); // end } } // end

12)_logger.Log("DONE IPO");

13)_logger.Log("=========================="); 14)return testSet;

Mã nguồn của thuật toán HorizontalGrowth:

1) privatestaticvoid IpoHorizontalGrowth(TestSet testSet, IpoTestItem testItem, PairInventory pairInventory)

{

// logging

2) _logger.Log("START IPO_H"); 3) _logger.Log(pairInventory);

4) int tCount = testSet.testCaseList.Count; 5) int q = testItem.values.Length;

// if |T| <= q

6) if (testSet.testCaseList.Count <= testItem.values.Length) {

// for 1 <= j <= |T|

for (int j = 0; j < tCount; j++) {

// extend the jth test in T by adding value vj

var testCase = testSet.testCaseList[j]; testCase.setTestValue(testItem.itemId, testItem.values[j]);

// and remove from π pairs coverd by the extended test

pairInventory.RemovePairs(testCase, testItem.itemId); // logging _logger.Log(testCase); _logger.Log(pairInventory); } } 7) else { // for 1 <= j <= q for (int j = 0; j < q; j++) {

// extend the jth test in T by adding value vj

var testCase = testSet.testCaseList[j]; testCase.setTestValue(testItem.itemId, testItem.values[j]);

// and remove from π pairs coverd by the extended test

pairInventory.RemovePairs(testCase, testItem.itemId); // logging _logger.Log(testCase); _logger.Log(pairInventory); } // for q < j <= T

for (int j = q; j < tCount; j++) {

string bestValue = testItem.values[0]; int maxRemovable = 0;

int removable = 0;

var testCase = testSet.testCaseList[j]; var tmpTestCase = testCase.Clone(); for (int k = 0; k < q; k++) { tmpTestCase.setTestValue(testItem.itemId, testItem.values[k]); removable = pairInventory.PredictRemoveCount(tmpTestCase, testItem.itemId); if (removable > maxRemovable) { maxRemovable = removable; bestValue = testItem.values[k]; } }

// extend the jth tesst in T by adding one value of pi // such that resulting test cover the most number pairs in π

testCase.setTestValue(testItem.itemId, bestValue);

// and remove from π pairs covered by the extended test

pairInventory.RemovePairs(testCase, testItem.itemId); // logging _logger.Log(testCase); _logger.Log(pairInventory); } } }

Mã nguồn cùa thuật toán VerticalGrowth:

privatestaticvoid IpoVerticalGrowth(TestSet testSet, IpoTestItem testItem, PairInventory pairInventory)

{

// logging

1) _logger.Log("START IPO_V");

2) IpoTestCase masterTC = testSet.testCaseList[0];

// let T' be an empty set

3) List<IpoTestCase> testCaseList = newList<IpoTestCase>();

// for each pair in π

4) foreach (IpoPair pair in pairInventory.pairList) {

// assume that the pair contains value w of pk, 1<=k<i, and value u of pi;

// if (T' contains a test with - as the value of pk and u as the value of pi)

IpoTestCase findTC = null;

foreach (IpoTestCase testCase in testCaseList) {

if (testCase.getTestValue(pair.itemId1) == null&&

pair.itemValue2.Equals(testCase.getTestValue(pair.itemId2))) { 1. findTC = testCase; 2. break; } } if (findTC != null) {

// modify this test by replacing the - with w

findTC.setTestValue(pair.itemId1, pair.itemValue1); }

else {

// add a new test to T' that has w as the value of pk, u ass the value of pi

// and - as the value of every parameter

IpoTestCase newTestCase = newIpoTestCase(); testCaseList.Add(newTestCase);

foreach (string itemId in masterTC.itemMap.Keys) { if (itemId.Equals(pair.itemId1)) { newTestCase.setTestValue(pair.itemId1, pair.itemValue1); } elseif (itemId.Equals(pair.itemId2))

{ newTestCase.setTestValue(pair.itemId2, pair.itemValue2); } else { newTestCase.setTestValue(itemId, null); } } } 5) }

// fill missing value

6) foreach (IpoTestCase testCase in testCaseList) {

var itemIdList = testCase.itemMap.Keys.ToList(); foreach (string itemId in itemIdList)

{ if (testCase.getTestValue(itemId) == null) { 1. testCase.setTestValue(itemId, masterTC.getTestValue(itemId)); } } // logging _logger.Log(testCase); } // T = T U T' testSet.testCaseList = testSet.testCaseList.Union(testCaseList).ToList(); } }

Giai đoạn 2: Sinh ca kiểm thử. Sử dụng kết quả của thuật toán IPO trong giai đoạn một và viết hàm tạo các ca kiểm thử Selenium IDE.

privatestring ExportDatatableToHtml(List<int> listOrder, List<String> listType, List<String> listCtrID, List<int> listIndex, IpoTestCase testCase, string url) {

1) StringBuilder strHTMLBuilder = newStringBuilder(); strHTMLBuilder.Append("<html >"); strHTMLBuilder.Append("<head>");

strHTMLBuilder.Append("<meta http-equiv=\"Content-Type\"

content=\"text/html; charset=UTF-8\" />");

strHTMLBuilder.Append("<link rel=\"selenium.base\" href=\""+ url+ "\"" + "/>");

strHTMLBuilder.Append("</head>"); strHTMLBuilder.Append("<body>");

strHTMLBuilder.Append("<table border='1px' with = '500px' cellpadding='1' cellspacing='1' bgcolor='lightyellow' style='font-

family:Garamond; font-size:smaller'>"); strHTMLBuilder.Append("<tr>"); strHTMLBuilder.Append("<td>"); strHTMLBuilder.Append("Open"); strHTMLBuilder.Append("</td>"); strHTMLBuilder.Append("<td>"); strHTMLBuilder.Append("</td>"); strHTMLBuilder.Append("<td>"); strHTMLBuilder.Append("</td>"); strHTMLBuilder.Append("</tr>");

2) List<List<String>> lists = newList<List<string>>(); 3) List<String> list = null;

Dictionary<int, List<String>> dicts = newDictionary<int, List<String>>();

Một phần của tài liệu (LUẬN văn THẠC sĩ) xây dựng công cụ hỗ trợ sinh ca kiểm thử cặp (Trang 51)

Tải bản đầy đủ (PDF)

(74 trang)