Chương trình về cơ bản đã được hoàn thành. Để đánh giá được chương trình chúng ta sẽ thử 2 ví dụ sau đây:
Ví dụ 1: Áp dụng cho số học tuyến tính:
Tạo một lớp là MyClass1 và yêu cầu sử dụng JPF để sinh tự động dữ liệu để kiểm thử chương trình này:
public class MyClass1 {
// The method you need tests for public int myMethod(int x, int y) { int z = x + y; if (z > 0) { z = 1; } else { z = z - x; } z = x * z; return z; }
// The test driver
public static void main(String[] args) { MyClass1 mc = new MyClass1();
int x = mc.myMethod(1, 2);
Debug.printPC("\nMyClass1.myMethod Path Condition: "); }
}
40
Hình 3-5: Kết quả với Choco - số học tuyến tính
41
Hình 3-6: Kết quả với Z3 - số học tuyến tính.
So sánh kết quả trên ta thấy cả 2 công cụ đều cho ra lời giải.
Ví dụ 2: Áp dụng cho số học phi tuyến
Với ví dụ trên ta thay z = x + y bằng x*y. Lúc này z là hàm phi tuyến. public class MulClass {
// The method you need tests for public int myMethod(int x, int y) {
int z = x * y; if (z > 10) { z = 1; } else { z = z - x; } z = x * z; return z; }
// The test driver
42
MulClass mc = new MulClass(); int x = mc.myMethod(1, 2);
Debug.printPC("\nMulClass.myMethod Path Condition: "); }
}
Kết quả khi sử dụng Choco: Chương trình ném ra ngoại lệ (hình 3-7).
Hình 3-7: Kết quả với Choco – số học phi tuyến tính
43
Hình 3-8: Kết quả với Z3 – số học phi tuyến tính
Nhìn vào hình trên ta sẽ thấy Z3 cho ra 2 mô hình tương ứng với các trường hợp z> 10 và z<=10:
Ca kiểm thử 1 là: x = 1; y = 11;
Ca kiểm thử 2 là: x =0 ; y = 0;
Như vậy chúng ta có thể thấy rằng công cụ mới (tích hợp Z3 vào JPF) có thể giải quyết nhiều bài toán hơn (đại số phi tuyến tính là 1 ví dụ). Về nguyên tắc nếu tích hợp đầy đủ Z3 vào JPF thì không gian bài toán giải được sẽ được mở rộng hơn rất nhiều
Tuy nhiên cách tiếp cận mới này cũng gặp phải một vấn đề đó là về mặt tốc độ chương trình. Việc chuyển đổi ràng buộc từ JPF sang SMT-LIB, lưu ra file sau đó gọi Z3 thông qua dòng lệnh là mất thời gian nếu không gian điều kiện đường đi của bài toán là lớn. Vì vậy đối với số học tuyến tính ta nên sử dụng như JPF hiện thời, còn với các trường hợp khác như số học phi tuyến tính ta có thể sử dụng kết quả của luận văn này.
44
CÁC NGHIÊN CỨU LIÊN QUAN
PEX – Sinh kiểm thử hộp trắng (White box testing) [2] cho ngôn ngữ .NET: Pex là một dự án của Microsoft với mục đích kiểm thử tự động cho các chương trình viết bằng ngôn ngữ .NET [13]. Pex sẽ tự động sinh ra một bộ kiểm thử (test suite) với độ bao phủ mã nguồn mức cao cho các chương trình. Pex thực hiện phân tích chương trình để xác định đầu vào kiểm thử cho các kiểm thử đơn vị tham số hóa (Parameterized Unit Tests) [14]. Pex sử dụng công cụ tìm lời giải Z3 để sinh ra các đầu vào kiểm thử mới để kiểm thử các hành vi khác nhau của chương trình. Kết quả là một bộ kiểm thử được sinh ra để bao phủ toàn bộ mã nguồn ở mức cao. Pex hiện nay được tích hợp như một công cụ trong Visual Studio 2010 Power Tools.
AgitarOne – Kiểm thử đơn vị tự động cho các chương trình Java [1]: AgitarOne là sản phẩm đã được thương mại hóa, cho phép các nhà phát triển phần mềm có thể tạo, sử dụng và quản lý một tập hợp rộng lớn các kiểm thử đơn vị (unit test) cần thiết một cách nhanh chóng. AgitarOne có thể tự động sinh ra các Junit Tests [3] cho các chương trình Java. AgitarOne bao gồm một công cụ gọi là Agitator, công cụ này sẽ kiểm tra mã nguồn bằng cách kiểm thử chúng với một số lượng lớn đầu vào và quan sát các hành vi của mã nguồn. Agitator tự động sinh ra các dữ liệu kiểm thử để kiểm thử mã nguồn. AgitarOne cũng bao gồm một tập các luật mã nguồn (code rule) để có thể tự động phát hiện các lỗi chung của lập trình. Những luật này có thể được tạo và thay đổi cho phù hợp với yêu cầu của từng dự án [7].
Cute - Concolic Unit Testing: Là công cụ để tự động kiểm thử cho ngôn ngữ C và Java, bao gồm Cute dùng cho ngôn ngữ C và JCute dùng cho ngôn ngữ Java. Thuật toán trong Cute là sử dụng một kỹ thuật gọi là thực thi concolic [9] để khám phá tất cả các nhánh khác biệt của một chương trình với các dữ liệu đầu vào. Thực thi concolic ở đây là phương pháp kiểm thử phần mềm lai (concolic là ghép bởi 2 từ concrete và symbolic), kỹ thuật này sẽ tự động sinh các đầu vào kiểm thử bằng cách phối hợp thực thi tượng trưng và thực thi cụ thể trên chương trình [9].
45
KẾT LUẬN VÀ HƢỚNG PHÁT TRIỂN CỦA ĐỀ TÀI
KẾT LUẬN
Việc đảm bảo chất lượng phần mềm là một trong những khâu quan trọng nhất trong bất kỳ quy trình phát triển phần mềm nào. Nếu một phần mềm nào mà khâu đảm bảo chất lượng không tốt sẽ dẫn tới tăng chi phi để phát triển và bảo trì phần mềm đó. Trong nội dung của đề tài này không nghiên cứu sâu về quy trình đảm bảo chất lượng cũng như các phương pháp để đảm bảo chất lượng phần mềm. Đề tài chỉ nghiên cứu về cách tiếp cận trong việc kiểm thử phần mềm tự động bằng cách tự động sinh dữ liệu để xác định được các ca kiểm thử. Việc thực hiện bằng cách tiếp cận này sẽ sinh ra đầy đủ các ca kiểm thử để có thể kiểm thử được chương trình.
Do thời gian nghiên cứu có hạn nên kết quả của luận văn này vẫn còn nhiều hạn chế. Tuy nhiên qua quá trình nghiên cứu tác giả cũng đã tìm hiểu và nắm bắt được những lý thuyết, công cụ, các dự án liên quan đến việc kiểm chứng, kiểm thử chương trình một cách tự động. Tác giả cũng có những đóng góp nhất định trong luận văn này. Đó là việc mở rộng thành công JPF với Z3 để sinh tự động dữ liệu kiểm thử chương trình Java. Việc mở rộng này sẽ giúp JPF có thể sinh tự động dữ liệu cho nhiều chương trình Java hơn, như việc hỗ trợ đại số phi tuyến.
Kết quả của luận văn này chỉ mang tính thử nghiệm và là những bước đi đầu tiên. Trong tương lai hoàn toàn có thể được áp dụng trong thực tiễn nếu được đầu tư đúng mức về mặt nhân lực và thời gian.
HƢỚNG PHÁT TRIỂN
Z3 và JPF là những dự án rất được quan tâm hiện nay trong việc kiểm chứng, kiểm thử phần mềm. Vì vậy hướng phát triển tiếp theo của đề tài là làm sao hoàn thiện hơn nữa để có thể sử dụng Z3 giải quyết được các bài toán khác, các kiểu dữ liệu như mảng, vector…
Một hướng phát triển khác của đề tài đó là sử dụng socket trong việc tích hợp giữa Z3 và JPF, điều này sẽ làm cho chương trình được tối ưu hơn. Vì kết quả của đề tài này không hỗ trợ việc thực hiện phân tán, đó là một nhược điểm. Đối với các chương trình phức tạp, khi đó không gian của điều kiện đường đi là rất lớn, việc thực hiện trên một máy tính sẽ là không khả thi. Do đó việc sử dụng socket trong việc xử lý phân tán sẽ là một cách tiếp cận tốt hơn.
Ngoài ra tác giả cũng đã cố gắng đưa ra được một kiến trúc cho phần mở rộng và sử dụng định dạng SMT-LIB. Điều này sẽ dễ dàng trong việc tích hợp các công cụ tìm lời giải khác vào JPF. Mỗi một công cụ có những ưu điểm và nhược điểm riêng, vì vậy việc đánh giá ưu điểm, nhược điểm của từng công cụ sau đó
46
tích hợp với JPF sẽ giúp cho việc giải quyết rất nhiều bài toán mà hiện nay JPF chưa làm được. Lý tưởng là ta sẽ có một tập các công cụ tìm lời giải đã được tích hợp với JPF, sau đó tùy từng bài toán, từng chương trình cụ thể để có thể gọi công cụ tốt nhất để giải.
47
TÀI LIỆU THAM KHẢO
[1] AgitarOne, http://www.agitar.com.
[2] B. Beizer (1990), Sofware Testing technical, International Thomson computer Press.
[3] Blaine Simpson (2009), Junit 4.x Howto, Axis Data Management Corp.
[4] Clart Barret, Aaron Stump, Ceasar Timeli (2010), The SMT-LIB Standard, version 2.0, www.SMT-LIB.org.
[5] D. Detlefs, G. Nelson, and J. B. Saxe (2005), Simplify: a theorem prover for
program checking, J. ACM, pp. 365-473.
[6] Java Path Finder, http://javapathfinder.sourceforge.net/.
[7] Jonathan Aldrich (2007), Evaluation Of AgitarOne, Master of Software Engineering, Carnegie Mello University.
[8] King, J.C (1976), Symbolic Execution and testing, communications of the ACM, pp. 385 – 394.
[9] K. Sen, G. Agha (2006), CUTE and jCUTE : Concolic Unit Testing and
Explicit Path Model-Checking Tools, University of Illinois at Urbana Champaign.
[10] Leonardo de Moura and Nikolaj Bjørner (2006), Z3 – a tutorial, Microsoft Research, USA..
[11] Leonardo de Moura and Nikolaj Bjørner (2008), Z3: An Efficient SMT Solver, Microsoft Research, One Microsoft Way, Redmond, vWA, 98074, USA, pp. 2-3.
[12] National Institute Of Standards and Technology (2002), The Economic
impacts Of inadequate infrastructure for Sofware Testing, Planing Report 02-03,
May -2003.
[13] Nikolai TillMann, Jonathan de Halleux (2008), Pex – White box testing
Generation for .NET, Microsoft Research, One Microsoft Way, Redmond, vWA,
98052, USA.
[14] Nikolai TillMann, Wolfram Schulte (2006), Parameterized Unit Testing With
Symbolic Execution, Microsoft Research, One Microsoft Way, Redmond, vWA,
98052, USA.
[15] W. Visser, C. Pasareanu, S. Khurshid (2004), Test Input Generation with Java
PathFinder, Proceedings of ISSTA 2004. Boston, MA.
[16] W. Visser, C. Pasareanu, S. Khurshid (2003), Generalized Symbolic
Execution for Model Checking and Testing, Proceedings of TACAS 2003.