2012-07-02 34 views
7

Tôi có nhiệm vụ tạo triển khai cho một số lượng lớn cấu trúc dữ liệu số liệu (cụ thể là quadtreek-d tree biến thể). Tôi đã có khoảng bốn trong số những triển khai này xuống, nhưng cách tôi hiện đang thử nghiệm là không, vì tôi thiếu một từ tốt hơn, tốt.Kiểm tra đơn vị Trạng thái nội bộ của cấu trúc dữ liệu

Tôi cần một cách sạch để kiểm tra chèn và xóa dữ liệu từ các cấu trúc cây/trie này theo cách tôi có thể kiểm tra cấu trúc bên trong của các nút (kiểm tra cha mẹ, con, đặt hàng, v.v.). Các triển khai này tuân theo các chứng minh và phân tích thời gian chạy riêng biệt, vì vậy tôi cần đảm bảo rằng không chỉ một nút được chèn chính xác (có nghĩa là có thể lấy được từ cây sau), mà còn ở vị trí rất chính xác trong cây.

"Đơn vị kiểm tra" có vẻ như một cách sai lầm để đi về việc này, tuy nhiên, như mục đích của nó, nếu tôi không nhầm, là để thử nghiệm một cấu trúc hoặc API bên ngoài hệ thống. Tôi đã nhìn thấy rất nhiều câu hỏi liên quan đến kiểm tra đơn vị hỏi "làm cách nào để tôi có quyền truy cập vào một trường riêng trong thử nghiệm đơn vị" hoặc "làm cách nào để kiểm tra giá trị trả về của phương thức không công khai" và câu trả lời thường "không" t "- và tôi đồng ý với câu trả lời này.

Và vì vậy tôi không để bất cứ ai sẵn sàng giúp đỡ với lời huyên thuyên chỉ mơ hồ, giao diện cây của tôi thực hiện như sau (dựa trên bộ sưu tập java của giao diện bản đồ):

public interface SpatialMap<K, V> extends Iterable<SpatialMap.Entry<K, V>> 
{ 
// Query Operations 

/** 
* Returns the number of key-value mappings in this map. If the map contains more than 
* <tt>Integer.MAX_VALUE</tt> elements, returns <tt>Integer.MAX_VALUE</tt>. 
* 
* @return The number of key-value mappings in this map. 
*/ 
int size(); 

/** 
* Returns <tt>true</tt> if this map contains no key-value mappings. 
* 
* @return <tt>true</tt> if this map contains no key-value mappings. 
*/ 
boolean isEmpty(); 

/** 
* Returns <tt>true</tt> if this map contains a mapping for the specified key. 
* 
* @param key 
*   The key whose presence in this map is to be tested. 
* @return <tt>true</tt> if this map contains a mapping for the specified key. 
*/ 
boolean containsKey(K key); 

/** 
* Returns the value to which the specified key is mapped, or {@code null} if this map contains 
* no mapping for the key. 
* 
* <p>A return value of {@code null} does not <i>necessarily</i> indicate that the map contains 
* no mapping for the key; it's also possible that the map explicitly maps the key to 
* {@code null}. The {@link #containsKey containsKey} operation may be used to distinguish these 
* two cases. 
* 
* @see #put(Comparable, Comparable, Object) 
* 
* @param key 
*   The key whose associated value is to be returned. 
* @return The value to which the specified key is mapped, or {@code null} if this map contains 
*   no mapping for the key. 
*/ 
V get(K key); 

// Modification Operations 

/** 
* Associates the specified value with the specified key in this map. If the map previously 
* contained a mapping for the key, the old value is replaced. 
* 
* @param key 
*   The key with which the specified value is to be associated. 
* @param data 
*   The value to be associated with the specified key. 
* @return The previous value associated with the key, or <tt>null</tt> if there was no mapping 
*   for the key. (A <tt>null</tt> return can also indicate that the map previously 
*   associated <tt>null</tt> with <tt>key</tt>.) 
*/ 
V put(K key, V data); 

/** 
* Removes the mapping for the specified key from this map if present. 
* 
* @param key 
*   The key whose mapping is to be removed from the map. 
* @return The previous value associated with the key, or <tt>null</tt> if there was no mapping 
*   for the key. (A <tt>null</tt> return can also indicate that the map previously 
*   associated <tt>null</tt> with <tt>key</tt>.) 
*/ 
V remove(K key); 

// Bulk Operations 

/** 
* Removes all of the mappings from this map. The map will be empty after this call returns. 
*/ 
void clear(); 
} 

này làm cho nó khó khăn để thử nghiệm với chỉ các phương pháp công khai, vì tôi cần dữ liệu nhất định (con trỏ/con trỏ) không có sẵn từ giao diện công cộng. Ngoài ra, trong các cấu trúc trie (PR Quadtree, PRKDTree, MX biến thể, vv) có các nút được tách ra từ dữ liệu, do đó việc tạo ra một phương thức công khai trả về một "nút" cũng sẽ được tóm tắt quá xa để có được dữ liệu chính xác.

Loại phương pháp thử nghiệm (hay kỹ thuật mà tôi có thể sử dụng với JUnit và không cảm thấy như tôi đang phá hủy ranh giới nhận thức đẹp) Tôi đang tìm kiếm?

Trả lời

5

Có những trường hợp như thế này mà đôi khi bạn thực sự cần phải kiểm tra tình trạng nội bộ của một cấu trúc. Trong trường hợp này, tôi sẽ truy cập các biến nội bộ bằng cách sử dụng sự phản chiếu. Có một số addon JUnit (PrivateAccessor http://junit-addons.sourceforge.net/junitx/util/PrivateAccessor.html) giúp việc này trở nên dễ dàng hơn.

Sự cân bằng là thử nghiệm của bạn sẽ giòn hơn vì nếu thay đổi trạng thái nội bộ, sau đó kiểm tra của bạn có thể phá vỡ. Nhưng nếu bạn muốn sự tự tin rằng trạng thái bên trong của bạn là chính xác, đôi khi bạn cần phải làm điều này.

+0

Tình trạng nội bộ như xa như orderings nút đi không bao giờ nên thay đổi, miễn là chứng minh tính đúng đắn của tôi là thực sự chính xác;) – efritz

+2

phải nhưng nếu tên biến thay đổi ví dụ, các bài kiểm tra có thể phá vỡ. Đây là bài kiểm tra đơn vị trắng hơn (trái với hộp đen).Đôi khi phong cách này là thích hợp, và nó có vẻ như trong trường hợp của bạn, nó là những gì bạn đang tìm kiếm. –

1

Một phương pháp tôi đã sử dụng trong loại tình hình là làm cho những lĩnh vực nội được bảo vệ, và tạo một lớp con để thử nghiệm. Thông qua phân lớp đó, bạn có thể phơi bày bất kỳ trạng thái nào cần thiết cho thử nghiệm hộp trắng của bạn.

0

Nếu bạn đặt giao diện và thực hiện nó (s) một mình trong một gói phần mềm chuyên dụng, và làm cho các phương pháp nội bộ nhà nước thực hiện mà gói được bảo vệ bằng, sau đó kiểm tra của bạn có thể truy cập chúng, và có khả năng kiểm tra chúng, trong khi phần còn lại của hệ thống của bạn không thể. Nó không tốt cho việc kiểm tra đơn vị "thuần túy", nhưng đó thường là cách tôi đi về điều đó, khi tôi không muốn phơi bày sự can đảm của lớp học với phần còn lại của hệ thống nhưng tôi vẫn muốn đưa ra các xác nhận về hành vi nội bộ của nó.

Các vấn đề liên quan