Một số phần mở rộng của JavaPathFinder

Một phần của tài liệu Kiểm tra độ phủ trong kiểm thử đơn vị (Trang 29 - 34)

JPF cung cấp một số phần mở rộng như sau:

Bytecode Factories: cho phép thay đổi ngữ nghĩa trong thực thi chỉ thị bytecode.

Listeners: theo dõi và kiểm soát thực thi chương trình JPF. Report: định dạng, hiển thị các đầu ra.

3.4.1 Bộ tạo chỉ thị (Bytecode Factory)

Hình 3.2: Bộ tạo chỉ thị Bytecode Factory

Trong JPF có các lớp biểu thị cho tất cả các chỉ thị bytecode được cài đặt, để thông dịch các chỉ thị bytecode. Bộ tạo chỉ thị (Instuction Factory) cho phép thay thế và mở rộng ngữ nghĩa thực thi cụ thể của bytecode bằng ngữ nghĩa thực

20

thi tượng trưng. Các thông tin tượng trưng được lưu trữ trong các thuộc tính (attributes) kết hợp với dữ liệu chương trình (fields, stack operands, local variables) và được cập nhật trong quá trình thực thi. Lớp InstructionFactory là giao diện để tạo các đối tượng Instruction bao gói việc thực thi các chỉ thị bytecode. Khi một chỉ thị bytecode trong tập tin .class được tải vào trong máy ảo JPF để xử lý thì đối tượng Instruction sẽ được tạo ra. Nói cách khác, khi một tập tin .class được đọc thì một mảng các đối tượng Instruction sẽ được tạo ra. Với mỗi phương thức được thực thi, JPF quản lý một đối tượng đó là MethodInfo. Đối tượng MethodInfo lưu trữ các chỉ thị bytecode như là mảng các đối tượng Instruction. Các đối tượng Instruction có phương thức execute() để thực hiện việc thực thi chỉ thị bytecode tương ứng. Chế độ thực thi mặc định trong JPF là chế độ thực thi cụ thể. Với giao diện InstructionFactory, ta có khả năng ghi đè các lớp chỉ thị mà cài đặt việc thông dịch các chỉ thị bytecode để thay đổi chế độ thực thi trong JPF.

JPF sử dụng mẫu thiết kế abstract factory[14] để khởi tạo các đối tượng Instruction. Lớp SymbolicInstructionFactory chứa các chỉ thị bytecode theo ngữ nghĩa thực thi tượng trưng. Lớp SymbolicInstructionFactory ủy quyền (delegate) tới lớp cha DefaultInstructionFactory chứa các chỉ thị bytecode theo nghĩa thực thi cụ thể.

3.4.2 Listeners

Listeners [15,12] là phần mở rộng quan trọng nhất của JPF, chúng cung cấp

Hình 3.3: JPF Listeners

cách để quan sát quá trình thực thi chương trình, tương tác và mở rộng JPF bằng các lớp do người dùng tự định nghĩa. Sau khi các lớp được thực thi Listener

21

không yêu cầu bất kỳ sửa đổi nào trong nhân của JPF. Listeners được thực thi cùng cấp với JPF.

Để sử dụng các tính năng mở rộng của Listener người dùng có thể cấu hình các thuộc tính trong file *.jpf hoặc cấu hình khi thực thi dòng lệnh. Các ứng dụng có thể sử dụng chú thích @JPFConfig để xác định rõ thuộc tính cho JPF Listeners.

Các loại Listeners

Search Listener và VM Listener: Chúng được sử dụng để quan sát việc

thực thi mã bên trong JPF mà không cần cài đặt lại các lớp của JVM và Search.

Hình 3.4: Các loại Listener

Search Listener: Được sử dụng để theo dõi quá trình tìm kiếm không gian

trạng thái, nó được đăng ký tới các sự kiện của đối tượng Search:

public interface SearchListener {

// got the next state

void stateAdvanced (Search search);

//state was backtracked one step

void stateBacktracked (Search search);

//a previously generated state was restored

void stateRestored (Search search);

// JPF encountered a property violation

void propertyViolated (Search search);

//a search loop was started

22

// the search loop was finished

void searchFinished (Search search);

}

Các thuộc tính được sử dụng thường xuyên nhất là:

+ stateAdvanced - để lưu trữ bổ sung, thông tin trạng thái backtrackable trong một mảng.

+ stateBacktracked - để khôi phục lại thông tin trạng thái bổ sung. + searchFinished - để xử lý kết quả thu được.

VM Listener : Được đăng ký tới các sự kiện của đối tượng VM trong quá

trình thực thi một chương trình. VM Listener được sử dụng để quản lý việc thực thi các chỉ thị bytecode:

public interface VMListener {

// VM has executed next instruction

void instructionExecuted (JVM vm);

// new Thread entered run() method

void threadStarted (JVM vm);

// Thread exited run() method

void threadTerminated (JVM vm);

// new class was loaded

void classLoaded (JVM vm);

// new object was created

void objectCreated (JVM vm);

// object was garbage collected

void objectReleased (JVM vm);

// garbage collection mark phase started

void gcBegin (JVM vm);

// garbage collection sweep phase terminated

void gcEnd (JVM vm);

// exception was thrown

void exceptionThrown (JVM vm);

// choice generator returned new value

void nextChoice (JVM vm);

...

}

+ executeInstruction: được gọi trước khi một lệnh bytecode được thực hiện các máy ảo. Listener có thể sử dụng điều này để bỏ qua hoặc hoặc thay thế chỉ thị này.

23

+ instructionExecuted: thông báo sau khi thực hiện, phù hợp để theo dõi kết quả thực hiện (lời gọi đến phương thức, các giá trị gán, kết quả của các nhánh, …)

PropertyListenerAdapter được sử dụng trong trường hợp Listeners khi triển khai các thuộc tính, tức là có thể chấm dứt quá trình tìm kiếm. Một ví dụ nổi bật của thể loại này là PreciseRaceDetector.

ListenerAdapter là bộ chuyển đổi cho SearchListener, VMListener và PublisherExtension. Đây là nơi chủ yếu được sử dụng để thu thập thông tin trong quá trình thực hiện JPF (ví dụ sử dụng lớp CoverageAnalyzer hay DeadlockAnalyzer).

3.4.3 Hệ thống báo cáo (The Report)

Hệ thống báo cáo (The Report) [15,16] có chức năng nhận kết quả đầu ra, định dạng và hiển thị các kết quả khi thực thi JPF như báo cáo vi phạm thuộc tính, vết chương trình, các thống kê… Đây là một phần quan trọng nhất của giao diện người dùng JPF, nó có thể hiển thị các định dạng đầu ra khác nhau như: tệp văn bản, màn hình console, XML, các lời gọi API. Tùy thuộc vào ứng dụng và dự án, người dùng có thể thay đổi cách hiển thị bằng việc cấu hình lại các thuộc tính. Hệ thống báo cáo của JPF bao gồm 3 thành phần:

- Lớp Reporter

- Các đối tượng Publisher

- Các đối tượng PublisherExtension

Tất cả các lớp chính liên quan và các giao diện nằm trong gói gov.nasa.jpf.report. Trong đó:

- Đối tượng Reporter có nhiệm vụ thu gom dữ liệu. Nó quản lý và thông báo cho các phần mở rộng của Publisher khi dữ liệu đầu ra đã đạt tới ngưỡng.

- Đối tượng Publisher có nhiệm vụ ghi dữ liệu từ Reporter ra một định dạng nào đó (text, xml, html,…). Publisher thông dụng nhất là ConsolePublisher, nó có chức năng ghi dữ liệu ra dạng text, console hoặc ghi ra file.

-Đối tượng PublisherExtension sẽ được đăng ký với đối tượng Publisher khi chương trình bắt đầu chạy. Mục đích để có thể định nghĩa một PublisherExtension là kế thừa đối tượng ListenerAdaper, đăng ký Publisher Extension này với JPF trong hàm khởi tạo của nó.

-Một đối tượng khá quan trọng trong JPF đó chính là Config, đây là đối tượng lưu trữ tất cả các thuộc tính (properties) cấu hình của JPF. Các thuộc tính của JPF sẽ được định nghĩa trong file jpf.properties *.jpf. Dưới đây là một số thuộc tính quan trọng của Report JPF:

24

 report.class=gov.nasa.jpf.report.Reporter: chỉ định Report cho

chương trình

 report.publisher=console,xml: chỉ định có thể báo cáo ở dạng

console hoặc xml

Hình 3.5: Hệ thống báo cáo Report

 report.console.class=gov.nasa.jpf.report.ConsolePublisher:chỉ

định đối tượng để báo cáo ghi vết là ConsolePublisher.

 report.console.property_violation=error,trace,snapshot: sẽ ghi

thông tin ở dạng error, stack trace vào snapshot.

 report.console.file=My_JPF_report: chỉ định đường dẫn chứa file vết của

JPF

Một phần của tài liệu Kiểm tra độ phủ trong kiểm thử đơn vị (Trang 29 - 34)

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

(68 trang)