Hình 2 10: Đầu ra của MyClassFP trên Eclipse

Một phần của tài liệu PHƯƠNG PHÁP SINH DỮ LIỆU KIỂM THỬ PHẦN MỀM DỰA TRÊN KỸ THUẬT KIỂM CHỨNG MÔ HÌNH (Trang 26 - 30)

Khi đó kêt quả ta sẽ được các ca kiểm thử sau:

• Ca kiểm thử 1: y = -4.999992597731762E-7, x = -5000.00000025 • Ca kiểm thử 2: y = 0.0, x = 0.0

• Ca kiểm thử 3: y = -4.999992597731762E-7, x = -5000.00000025

Ở đây ta thấy nhận được 3 ca kiểm thử tuy nhiên trong trường hợp kiểu là số nguyên ta chỉ nhận được 2 ca kiểm thử. Đó là bởi vì JPF thực thi trên JVM bytecode, không phải là Java source code. Khi z là biến double, đoạn mã

if (z > 0.0) { z = 1.0; } else { z = z - x; }

Sẽ được dịch như sau: if (z > 0.0) {

z = 1.0;

} else if (z == 0.0 || z < 0.0) { z = z - x;

}

2.2.3.5 Các thuộc tính của đối tượng

Thay thế việc thực thi tượng trưng của các tham số phương thức, có thể chúng ta cần thực hiện với các thuộc tính của đối tượng. Một cách để thực hiện như vậy là tạo driver gán các tham số phương thức vào thuộc tính của đối tượng

public class MyClassWithFields { public int field1;

public int field2;

public void myMethod1() { ...etc...

} }

public class MyDriverForFields {

private static void makeFieldsSymbolic(int x, int y) { MyClassWithFields mc = new MyClassWithFields(); mc.field1 = x;

mc.field2 = y; mc.myMethod1();

Debug.printPC("\nMyClassWithFields.myMethod1 Path Condition: "); }

// The test driver

public static void main(String[] args) { makeFieldsSymbolic(1,2);

} }

Chúng ta có thể chạy trong eclipse bằng cấu hình sau:

+vm.insn_factory.class=gov.nasa.jpf.symbc.SymbolicInstructionFactory +vm.classpath=. +vm.storage.class= +symbolic.method=makeFieldsSymbolic(sym#sym) +search.multiple_errors=true +jpf.report.console.finished= MyDriverForFields

public class MyClassWithFields { @Symbolic("true")

public int field1;

@Symbolic("true") public int field2;

public void myMethod1() { int z = field1 + field2; if (z > 0) { z = 1; } else { z = z - field1; } z = field1 * z; return z; } }

public class MyDriverForFields { // The test driver

public static void main(String[] args) {

MyClassWithFields mc = new MyClassWithFields(); (adsbygoogle = window.adsbygoogle || []).push({});

mc.myMethod1();

Debug.printPC("\nMyClassWithFields.myMethod1 Path Condition: "); }

}

Sau khi chạy ta sẽ có kết quả sau

• Ca kiểm thử 1: field2 = -9999999, field2 = 10000000 • Ca kiểm thử 2: field2 = -10000000, field2 = -10000000

2.2.4 Hạn chế

Hiện nay JPF đang sử dụng một số công cụ tìm lời giải của Java : Choco, IAsolver. Những công cụ này được sử dung như các thư viện. Viiệc sử dụng chúng làm cho JPF có

rất nhiều hạn chế như: Không giải được đại số phi tuyến, các uninterpreted function, phép chia cho 0. Ví dụ đơn gian là thử thực thi tượng trưng cho lớp java sau:

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

public static void main(String[] args) { MulClass mc = new MulClass(); int x = mc.myMethod(1, 2);

Debug.printPC("\nMyClass1.myMethod Path Condition: "); }

}

Khi đó ta sẽ nhận được kết quả là JPF chưa hỗ trợ cho đại số phí tuyến. Vì vậy tác giả nghĩ đến việc làm sao mở rộng được JPF bằng cách sử dụng công cụ lời giải khác mạnh hơn. Qua quá trình tìm hiểu các công cụ tìm lời giải hiện nay, Z3 nổi lên là một trong những công cụ tìm lời giải tốt nhất. Trong chương tiếp theo của luận văn sẽ trình bày chi tiết về Microsoft Z3.

Một phần của tài liệu PHƯƠNG PHÁP SINH DỮ LIỆU KIỂM THỬ PHẦN MỀM DỰA TRÊN KỸ THUẬT KIỂM CHỨNG MÔ HÌNH (Trang 26 - 30)