Các yêu cầu cho việc kiểm thử các ứng dụng sử dụng dịch vụ web

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Nghiên cứu kiểm thử các ứng dụng web và xây dựng công cụ hỗ trợ Luận văn ThS. Công nghệ thông tin 61 48 10 (Trang 53)

Hình 14 : Kiểm thử tự động tích hợp cả 2 webservices

4.1. Các yêu cầu cho việc kiểm thử các ứng dụng sử dụng dịch vụ web

triển các công cụ kiểm thử các ứng dụng web có sử dụng các web services. Bài toán mà chúng tôi lựa chọn là kiểm thử chương trình Travel-Agent.

4.1. Các yêu cầu cho việc kiểm thử các ứng dụng sử dụng dịch vụ web web

Như phần mở đầu tôi đã giới thiệu, để xây dựng một phần mềm tốt, đáp ứng đúng yêu cầu chúng ta phải kiểm thử tốt. Để hỗ trợ kiểm thử tốt hơn người ta thường xây dựng các công cụ hỗ trợ kiểm thử(thường là các công cụ tự động kiểm thử). Với khả năng tương tác giữa các ứng dụng rất đa dạng và không phụ thuộc hệ điều hành, webservice trở lên rất phổ biến. Phần này tôi sẽ xây dựng một công cụ hỗ trợ kiểm thử tự động các webservice.

Với sự chia sẻ dữ liệu đơn giản theo các chuẩn có sẵn, các dịch vụ web cung cấp dữ liệu một cách linh động. Nhu cầu sử dụng tích hợp các dữ liệu từ nhiều nguồn web service trở lên đa dạng và phổ biến. Vì vậy việc kiểm thử các web services cũng là một thách thức đối với những người làm phần mềm, Giả sử một mô hình phần mềm sử dụng các web services khác nhau được mô tả như trong Hình 6.

Hình 6. Mô hình khai thác nhiều web services

Trong phạm vi luận văn này, chúng tôi sẽ xây dựng một công cụ cho phép kiểm thử các tính chất sau của các hệ thống phần mềm sử dụng các dịch vụ web:

 Các giá trị đầu ra của mỗi web service

 Sự phối hợp của các web services trong khi thực hiện chương trình

Ngoài ra, các ứng dụng web services cũng có nhiều tính chất khác cần phải kiểm thử như: hiệu năng, độ an toàn, tin cậy, … chúng tôi sẽ xem xét thực hiện trong tương lai.

4.2. Xây dựng chƣơng trình kiểm thử ứng dụng web sử dụng dịch vụ web

4.2.1. Phạm vi ứng dụng

Trong phạm vi luận văn này, chúng tôi chỉ chọn một ứng dụng nhỏ làm ví dụ minh hoạ kiểm thử các ứng dụng sử dụng Web Service. Ứng dụng được chia thành các nhiệm vụ chính như sau:

 Xây dựng 2 Web Services:

 Web Service tìm kiếm khách sạn dựa vào tên của thành phố đến – Tên Web Service này là SearchHotel Service

 Web Service tìm kiếm các chuyến bay dựa trên tên của thành phố xuất phát, tên của thành phố đến và thời gian xuất phát.

Cả 2 Web Service này đều được phát triển bằng ngôn ngữ lập trình C#, quá trình phát triển hai Web Service hoàn toàn thủ công, không dùng bất cứ một công cụ hỗ trợ nào. Cơ sở dữ liệu được dùng cho hai Web Service được triển khai trên hệ quản trị cơ sở dữ liệu SQL server 2000.

 Xây dựng một website để gọi tới 2 Web Services trên. Website sở hữu bởi

Agent-Travel, họ muốn lấy dữ liệu từ 2 Web services trên tích hợp lại để cung cấp thông tin cần thiết cho khách hàng khi truy cập website. Website này được phát triển trên ngôn ngữ ASP.NET và C#.

 Xây dựng một chương trình kiểm thử tự động của từng web service trên, và kiểm thử tích hợp cả 2 web services.

Chương trình Client để gọi tới Service Proxy là một chương trình giao diện GUI. Cho phép người dùng chọn lựa tên thành phố đến, tên thành phố xuất phát và thời gian xuất phát. Từ đó chương trình sẽ triệu gọi tới Service Proxy để lấy kết quả trả về bao gồm danh sách các chuyến bay, danh sách các khách sạn.

Để đơn giản chúng ta có thể cài đặt webservice, và ứng dụng web trên cùng một web server.

 Dịch vụ SearchHotelService có thể được truy cập qua URL:

http://localhost/SearchHotelService/Service.asmx?op=SearchHotel

 Dịch vụ SearchHotelService có thể được truy cập qua URL :

 Ứng dụng TheUseServiceComposition có thể được truy cập qua URL :

http://localhost/TheUseServiceComposition/Default.aspx

 Ứng dụng TheUseServiceComposition có thể được truy cập qua URL :

http://localhost/TestTheServiceComposition/Default.aspx

4.2.2. Thiết kế ứng dụng

Ta có mô hình thiết kế tổng thể của ứng dụng như sau:

Hình 7: Minh họa thiết kế tổng thể ứng dụng

Người sử dụng tại Client sử dụng dịch vụ sẽ lựa chọn thành phố xuất phát và thành phố đích đến. Tại đây Soap engine làm nhiệm vụ tạo ra các thông điệp SOAP request gửi đến Service Proxy. Tại Service Proxy sẽ phân ra làm 2 luồng SOAP request tiếp tục gửi đến hai Web Service SearchFlight và SearchHotel. Sau khi gửi đi các thông điệp Soap request. Tại hai Web Service thành phần tiếp nhận các Soap request đó xử lý và trả lại các thông điệp Soap response cho Service Proxy. Sau khi nhận được thông điệp Soap response của các Service Composition, Service Proxy đóng gói kết quả và gửi trả lại kết quả cho Client bao gồm kết quả tìm kiếm chuyến bay, tìm kiếm khách sạn.

Tương tự tại Client người kiểm thử dịch vụ chạy tool kiểm thử tự động, đọc các testcase đầu vào là một file xml. Chọn web service cần kiểm thử và bấm nút “Run test”. Khi đó Soap engine sẽ tạo ra các thông điệp SOAP request và gửi đến Service Proxy. Tùy từng kiểu lựa chọn kiểm thử mà ở đây Service Proxy sẽ gửi các SOAP request tới 1 hoặc 2 web service SearchHotelService và SearchFlightService. Khi tiếp

nhận các SOAP request các webservice xử lý và trả lại thông điệp SOAP response cho Service Proxy. Tại đây kiểm tra các giá trị mong đợi đọc được từ file XML và trả về kết quả cho client.

4.2.3. Cài đặt và triển khai ứng dụng

Bài toán được xây dựng trên môi trường .Net 2.0. Để có thể xây dựng triển khai chương trình ta cần những cài đặt những công cụ sau:

 Cài đặt Net Framework 2.0

 Cài đặt Internet information service 5.0.

 Cài đặt Microsoft SQL server 2000.

 Chuẩn bị bốn thư mục ứng dụng SearchHotelService, SearchFlightService, TheUseServiceComposition, TestTheServiceComposition.

Để cài đặt ứng dụng của chúng ta, chúng ta có thể vào IIS chọn “Default website”-> “nháy chuột phải”->” “new”-> “virtual directory”->Đặt tên Alias, ở đây tôi đặt là SearchHotelService ->Chọn thư mục chứa ứng dụng dịch vụ web. Tương tự chúng ta cài đặt dịch vụ SearchFlightService, ứng dụng TheUseServiceComposition và công cụ kiểm thử TestTheServiceComposition.

Sau khi cài đặt xong khi chạy dịch vụ SearchFlightService chúng ta có giao diện sau. Với một phương thức tên là searchflight, phương thức này có 3 đối số đầu vào là: nơi đến, nơi đi, ngày bay. Đầu ra là danh sách các chuyến bay

Hình 8: Gọi dịch vụ SearchFlightService

Chạy dịch vụ SearchHotelService chúng ta có giao diện sau. Phương thức này có đối số đầu vào là mã tỉnh thành và kết quả trả về là danh sách các khách sạn thuộc tỉnh thành đó.

Hình 9: Gọi dịch vụ SearchHotelService

Khi chạy TheUseServiceComposition chúng ta có giao diện. Đây là một ứng dụng nhỏ sử dụng dữ liệu từ 2 web service khác nhau. Người dùng có thể chọn nơi đi, nơi đến và chọn ngày bấm nút search. Kết quả sẽ trả về là danh sách các khách sạn nơi đến và các chuyến bay từ nơi đi đến nới đến và ngày đã chọn

Hình 10 : Ứng dụng sử dụng dữ liệu từ 2 webservice

Khi chạy TestTheServiceComposition chúng ta có giao diện sau(Hình 10). Người kiểm thử chọn file xml chứa các TestCase. Chọn Webservice để kiểm thử, bấm nút “Run test” kết quả trả về là các testcase pass và các testcase fail.

Dữ liệu testcase thực tế có thể là một file text có cấu trúc, một file xml hay bất kỳ một cơ sở dữ liệu nào trong hệ quản trị cơ sở dữ liệu như SQL server2000, M‎QL, MSAccess…

Cấu trúc của các test case, tùy thuộc vào mỗi bài toán cụ thể nhưng nó thường bao gồm: TestCaseID, Các giá trị đầu vào, Các giá trị mong đợi đầu ra, Kết quả.

Ví dụ: Bảng dưới đây là một tập các TestCase

TC_ID IN1 IN2 IN3 Expected1 Expected2 Result

001 1 2 20/12/2009 3 5 Pass 002 1 2 21/12/2009 3 2 Pass 003 3 1 22/12/2009 5 3 Pass 004 3 1 24/12/2009 4 5 Fail 005 3 1 24/12/2009 5 3 Fail 006 2 3 25/12/2009 2 2 Pass 007 2 3 25/12/2009 3 2 Fail 008 2 3 25/12/2009 2 3 Fail Bảng 1:Dữ liệu TestCase

Giả sử chúng ta có đầu vào là một file testcase1.xml để kiểm thử cho webservice1 với nội dung như sau:

<?xml version="1.0" encoding="utf-8" ?> <cases> <testcase> <id>001</id> <input>1</input> <expected count="5" /> </testcase> <testcase> <id>002</id> <input>2</input> <expected count="0" /> </testcase> <testcase> <id>003</id> <input>5</input> <expected count="4" /> </testcase> <testcase > <id>004</id> <input>3</input> <expected count="3" /> </testcase> <testcase> <id>005</id> <input>4</input> <expected count="3" /> </testcase> </cases>

Khi đó code thuật toán để kiểm thử tự động như sau:

string id, expected, clue;

int input;

DateTime startTime = DateTime.Now;

TextBox2.Text = "";

TextBox2.Text = "\nStart Web Service Test Automation";

XmlDocument results = new XmlDocument();

XmlDeclaration xdeclare = results.CreateXmlDeclaration("1.0", null,

null);

results.AppendChild(xdeclare); // declaration

XmlElement root = results.CreateElement("results"); // root element

results.AppendChild(root); // root

XmlElement result;

XmlDocument tests = new XmlDocument();

tests.Load(TestCaseFile);

XmlNodeList xnl = tests.SelectNodes("/cases/testcase");

foreach (XmlNode tcn in xnl)

{

DateTime startTimei = DateTime.Now;

input = int.Parse(tcn.ChildNodes.Item(1).InnerText); expected =tcn.

ChildNodes.Item(2).Attributes.GetNamedItem("count").Value;

SearchHotelService.Service HotelService = new

SearchHotelService.Service();

HotelService.Credentials =

System.Net.CredentialCache.DefaultCredentials;

DataSet ds = new DataSet();

ds = HotelService.SearchHotel(input);

result = results.CreateElement("result");

result.SetAttribute("id", id);

result.SetAttribute("input", input.ToString());

result.SetAttribute("expected", expected);

DateTime endTimei = DateTime.Now;

TimeSpan tsi = endTimei - startTimei;

result.SetAttribute("Time", tsi.ToString());

if (IsConsistent(ds, expected))

{

result.InnerText = " Pass ";

TextBox2.Text = TextBox2.Text + "\n" + "result-> id=" + id + " input=" + input.ToString() +

" expected=" + expected + " Time=" + tsi + "-> Pass"; }

else

{

result.InnerText = " *FAIL* ";

TextBox2.Text = TextBox2.Text + "\n" + "result-> id=" + id + " input=" + input.ToString() +

" expected=" + expected + " Time=" + tsi + "-> *FAIL* "; }

root.AppendChild(result); }

results.Save("results1.xml");

Console.WriteLine("End Test Automation");

DateTime endTime = DateTime.Now;

TimeSpan ts = endTime - startTime;

TextBox2.Text=TextBox2.Text+"\nElapsed time = " + ts.Milliseconds + " milliseconds";

Thuật toán cài đặt được hiểu như sau. Đầu tiên chúng ta đọc dữ liệu testcase từ file testcases1.xml với câu lệnh tests.Load(testcasefile). Duyệt từng TestcaseID foreach (XmlNode tcn in xnl), đọc các điều kiện đầu vào và các kết quả mong đợi.

id = tcn.ChildNodes.Item(0).InnerText;

input = int.Parse(tcn.ChildNodes.Item(1).InnerText);

expected =tcn.ChildNodes.Item(2).Attributes.GetNamedItem("count").Value;

Với mỗi một testcase ta tham chiếu tới dịch vụ web và sử dụng phương thức của dịch vụ web với đầu vào của phương thức là kết quả đọc từ testcase sau đó nhận kết quả từ phương thức trả về.

HotelService.Credentials = System.Net.CredentialCache.DefaultCredentials; DataSet ds = new DataSet();

ds = HotelService.SearchHotel(input);

Khi đó ta sẽ dùng một hàm IsConsistent(ds, expected) kiểm tra và đưa ra kết luận là testcase đó “pass” hay “fail”. Kết quả như hình sau:

Hình 12: Kiểm thử tự động với webservice1 SearchHotel

Để kiểm thử webservice2 chúng ta sử dụng file testcases2.xml Có nội dung như sau : <?xml version="1.0" encoding="utf-8" ?> <cases> <testcase> <id>001</id> <flightfrom>1</flightfrom> <flightto>2</flightto> <flightdate>12/12/2009</flightdate> <expected count="5" /> </testcase> <testcase> <id>002</id>

<flightfrom>2</flightfrom> <flightto>3</flightto> <flightdate>12/12/2009</flightdate> <expected count="0" /> </testcase> <testcase> <id>003</id> <flightfrom>1</flightfrom> <flightto>3</flightto> <flightdate>12/12/2009</flightdate> <expected count="1" /> </testcase> <testcase > <id>004</id> <flightfrom>3</flightfrom> <flightto>1</flightto> <flightdate>12/12/2009</flightdate> <expected count="0" /> </testcase> <testcase> <id>005</id> <flightfrom>3</flightfrom> <flightto>2</flightto> <flightdate>12/12/2009</flightdate> <expected count="3" /> </testcase> </cases>

Cũng với thuật toán như trên. Đầu tiên chúng ta đọc dữ liệu testcase từ file testcases2.xml với câu lệnh tests.Load(testcasefile). Duyệt từng TestcaseID foreach (XmlNode tcn in xnl), đọc các điều kiện đầu vào và các kết quả mong đợi.

id = tcn.ChildNodes.Item(0).InnerText;

flightfrom= int.Parse(tcn.ChildNodes.Item(1).InnerText); flightto= int.Parse(tcn.ChildNodes.Item(2).InnerText); flightdate= int.Parse(tcn.ChildNodes.Item(3).InnerText);

expected =tcn.ChildNodes.Item(4).Attributes.GetNamedItem("count").Value;

Với mỗi một testcase ta tham chiếu tới dịch vụ web và sử dụng phương thức của dịch vụ web với đầu vào của phương thức là kết quả đọc từ testcase sau đó nhận kết quả từ phương thức trả về.

SearchFlightService.Service FlightService = new SearchFlightService.Service(); FlightService.Credentials = System.Net.CredentialCache.DefaultCredentials; DataSet ds = new DataSet();

ds = FlightService.SearchFlight(flightfrom, flightto, flightdate);

Khi đó ta sẽ dùng một hàm IsConsistent(ds, expected) kiểm tra và đưa ra kết luận là testcase đó “pass” hay “fail”. Kết quả như hình sau:

Hình 13: Kiểm thử tự động với webservice2 Searchflight

Để kiểm thử tích hợp cả searchhotelservice và searchflightservice chúng ta chọn file testcase testcases3.xml có nội dung như sau:

<?xml version="1.0" encoding="utf-8" ?> <cases> <testcase> <id>001</id> <flightfrom>1</flightfrom> <flightto>2</flightto> <flightdate>12/12/2009</flightdate> <expected count1="5" count2="4" />

</testcase> <testcase> <id>002</id> <flightfrom>2</flightfrom> <flightto>3</flightto> <flightdate>12/12/2009</flightdate> <expected count1="5" count2="4" /> </testcase> <testcase> <id>003</id> <flightfrom>1</flightfrom> <flightto>3</flightto> <flightdate>12/12/2009</flightdate> <expected count1="3" count2="1" /> </testcase> <testcase> <id>004</id> <flightfrom>3</flightfrom> <flightto>1</flightto> <flightdate>12/12/2009</flightdate> <expected count1="0" count2="1" /> </testcase> <testcase> <id>005</id> <flightfrom>3</flightfrom> <flightto>2</flightto> <flightdate>12/12/2009</flightdate>

<expected count1="0" count2="1" clue="widget" /> </testcase>

<cases>

Khi đó thuật toán chúng ta cũng không có gì khác biệt nhiều so với kiểm thử từng webservice. Chúng ta cũng đọc dữ liệu testcase từ file testcases3.xml trên bằng lệnh tests.Load(testcasefile). Duyệt từng TestcaseID foreach (XmlNode tcn in xnl),

đọc các điều kiện đầu vào và các kết quả mong đợi.

id = tcn.ChildNodes.Item(0).InnerText; flightfrom= int.Parse(tcn.ChildNodes.Item(1).InnerText); flightto= int.Parse(tcn.ChildNodes.Item(2).InnerText); flightdate= int.Parse(tcn.ChildNodes.Item(3).InnerText); expected1 =tcn.ChildNodes.Item(4).Attributes.GetNamedItem("count1").Value; expected2 =tcn.ChildNodes.Item(4).Attributes.GetNamedItem("count2").Value;

Với mỗi TestCaseID chúng ta phải tham chiếu đồng thời tới 2 webservice đó là Searchhotelservice và Searchflightservice và sử dụng các phương thức của từng webservice để lấy kết quả trở về.

SearchHotelService.Service HotelService = new SearchHotelService.Service(); HotelService.Credentials = System.Net.CredentialCache.DefaultCredentials; DataSet ds = new DataSet();

ds = HotelService.SearchHotel(flightto);

SearchFlightService.Service FlightService = new SearchFlightService.Service(); FlightService.Credentials = System.Net.CredentialCache.DefaultCredentials; DataSet ds1 = new DataSet();

ds1 = FlightService.SearchFlight(flightfrom, flightto, flightdate);

Sau đó chúng ta kết hợp hàm kiểm tra IsConsistent(ds, expected1) và IsConsistent(ds1, expected2) để đưa ra kết quả là “pass” hay “fail”. Kết quả như hình

sau:

Hình 14: Kiểm thử tự động tích hợp cả 2 webservices

Trên hình 14 chúng ta có thể thấy được có một số testcase sau khi chạy kiểm thử tự

động kết quả trả về là „*FAIL*‟ và một số kết quả trả về là „*True*‟. Trong các trường hợp kết quả trả về „*FAIL*‟ là do tôi tạo ra testcase cố tình tạo sai. Ví dụ : giả sử thực tế testcase với „id=001 flightfrom=1 flightto=2 flightdate=12/12/2009 expected=2

expected=4‟ nhưng tôi đưa vào là „id=001 flightfrom=1 flightto=2 flightdate=12/12/2009 expected=5 expected=4‟ nên kết quả sai. Về cơ bản tình huống này được coi là lỗi nhập liệu khi tạo các testcase.

Trong thực tế nếu như bỏ qua lỗi trên thì về cơ bản kết quả sau khi kiểm thử tự động sẽ luôn luôn là „*PASS*‟ trừ khi chính công cụ kiểm thử tự động bị lỗi hoặc không đạt yêu cầu.

Như vậy trong chương này tôi đã xây dựng được công cụ hỗ trợ kiểm thử để kiểm thử 2 webservice SearchHotel Service và SearchFlight Service và kiểm thử được sự đồng thời kết hợp cả 2 service trên. Kết quả công cụ kiểm thử do tôi xây dựng đã chạy đạt đúng theo những yêu cầu mà tôi mong muốn.

Trong luận văn này tôi chỉ demo để biết rằng chúng ta hoàn toàn có thể xây dựng các công cụ kiểm thử tự động, để có thể giúp chúng ta tự động hóa kiểm thử trong lĩnh vực công nghệ phần mềm.

Do thời gian có hạn nên kiểm thử sự kết hợp 2 service trên mới chỉ xây dựng theo cách kiểm tuần tự từng service một. Trong tương lai chúng tôi sẽ xây dựng công cụ hỗ trợ kiểm thử kết hợp 2 hoặc nhiều web service một cách đồng thời.

KẾT LUẬN

Trong luận văn này chúng tôi đưa ra các cách thức tiếp cận các vấn đề cơ bản làm thế nào để có thể xây dựng một công cụ kiểm thử tự động các ứng dụng web.

Chúng tôi đã nghiên cứu một số kỹ thuật kiểm thử phần mềm hiện nay như kiểm thử hộp trắng, kiểm thử hộp đen. Đánh giá được ưu điểm, nhược điểm của mỗi kỹ thuật kiểm thử. Khi nào chúng ta nên chọn kỹ thuật kiểm thử nào và khi chọn kỹ thuật kiểm thử chúng ta cần những kỹ năng gì.

Luận văn trình bày một cách tổng quát về công nghệ Web Service, cách xây dựng và triển khai các Web Services. Nắm được các công nghệ chuẩn được sử dụng cho Web Service như SOAP, WSDL, UDDI, và công nghệ dùng để tích hợp các Web Services. Tìm hiểu mô hình các ứng dụng web, xu hướng phát triển và một số phần mềm ứng dụng đã rất thành công hiện nay.

Chúng tôi cũng đưa ra các cách thức tự động gửi các yêu cầu (request) và nhận phản hồi (response) với nhiều cách khác nhau trong các ứng dụng web. Tùy thuộc vào

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Nghiên cứu kiểm thử các ứng dụng web và xây dựng công cụ hỗ trợ Luận văn ThS. Công nghệ thông tin 61 48 10 (Trang 53)

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

(74 trang)