2009-09-12 4 views
3

데이터 구조가 올바르게 구축되었는지 테스트하는 방법은 무엇입니까? 내가 수정 된 기수 트리의 일종을 구현하고, 당신의 데이터 구조가 올바르게 구축되었는지 어떻게 확인하는지 궁금해하고있다.유닛 테스트 적절한 데이터 구조 생성

TreeNode {String, Int} 노드의 트리를 고려하십시오. 당신은 항상 다음 예에서와 같이 0으로 동등한 가치의 깊은 노드에 새 자식을 추가하려면 :

 
Root, 0 
- Child_1, 5 
- Child_2, 0 
    - Child_3, 1 

질문은, 어떻게 단위 테스트 당신이 바란대로 트리 구조가 쌓이면? TreeNode는 insert 일 수있는 하나의 메소드 만 가지고 있습니다.

지금까지 생각한 바는 트리를 거쳐 각 노드를 문자열로 변환하는 TreeVisitor으로 작성했습니다. 나무 위의 예에서, 다음과 같을 수 있습니다 : 내가 삽입있어 어떤 요소 생각이있는 경우 트리를 구축

 
[Root, 0 [Child_1, 5][Child_2, 0 [Child_3, 1]]] 

알고 알고리즘, 나는 수동으로 같은 문자열을 만들 수 있습니다. 내 유닛 테스트는 (같은 예제를 사용하여) 이렇게 보일 것입니다.

TreeNode root = new TreeNode("Root", 0); 
root.insert(new TreeNode("Child_1", 5)); 
root.insert(new TreeNode("Child_2", 0)); 
root.insert(new TreeNode("Child_3", 1)); 
TreeVisitor visitor = new TreeVisitor(); 
String expected = "[Root, 0 [Child_1, 5][Child_2, 0 [Child_3, 1]]]"; 
asssertEquals(expected, visitor.visit(root));

나는 그것이 최선의 접근 방식이 아니라고 생각했습니다. 방문자가 변경되면 즉시 모든 테스트가 실패합니다 (단순히 [ ]()으로 변경). 또한,이 방법을 사용하면 (수동으로 계산할 수있는만큼 큰) 작은 나무를 테스트 할 수 있습니다. 당신은 더 큰 것들을 어떻게 테스트 할 것입니까?

일반적인 질문은 데이터 구조가 올바르게 구축되었는지 확인하는 테스트를 작성하는 방법? 사람들이 아마도 당신이 구현을 대체 할 수

답변

3

실제 테스트 가능한 디자인의 경우입니다. 'insert'메서드 만있는 인터페이스는 사용할 수 없기 때문에 테스트 할 수 없습니다. 볼 수 없어도 나무를 만들거나 무엇이든 할 수있는 나무를 만들면 어디에도 갖다 줄 수 없습니다.

클라이언트가 트리 (액세스 방법, 방문자 인터페이스 또는 기타)에 액세스하는 방법을 확인하십시오. 그런 다음 그들을 통해 테스트하십시오.쉽게 (나무가 더 당신이 트 리뷰에 넣어 나무의 종류보다 자바 트리 맵처럼 IE) 공용 인터페이스를 통해 얻을 수없는 내부의 복잡성이있는 경우

, 당신은 사용할 수 있습니다

  • 어설 션 및 불변량
  • debugVerifyTree 메서드와 같은 것입니다.
  • 무차별 대입 : 36542 의사 무작위 항목을 삽입하고 모든 경우에 적용되는 검사 도구를 사용하십시오.

언제든지 테스트를 작성할 때 '이 코드의 모든 클라이언트가이 테스트에 실패하면 신경을 쓸 것입니까?'라는 질문을해야합니다. 그렇지 않은 경우 삭제하십시오.

1

:-) 예상대로 .Sum의 (a, b)의 작동 여부를 테스트 어디 다스 자습서에서 신선한 해요로

나는, 내가 전체 테스트의 생각은 잘못된 점점 수 있습니다 가정 TreeNode의 단위 테스트에서 현재 하위 집합을 재귀 적으로 검사 할 수있는 메서드를 제공하는 고유 한 하위 클래스가 있습니다. 이 메서드는 유닛 테스트를 돕기 위해 TreeNode 구현에 추가 될 것이고 기존의 기능을 대체하지 않으므로 유효한 테스트를 가질 수 있습니다.

1

내가 보통하는 것은 당신이 테스트하고있는 것을 나타내는 값이나 이름을 만드는 것입니다. 따라서 트리의 경우 이름은 깊이와 하위 인덱스를 나타낼 수 있습니다.

TreeNode root = new MyTreeNode("0.0", 0); 
root.insert(new MyTreeNode("1.0", 5)); 
root.insert(new MyTreeNode("1.1", 0)); 
root.insert(new MyTreeNode("2.0", 1)); 
verify(root, 0, 0); 
... 
public void verify(TreeNode node, int depth, int index) { 
    verifyName(node, depth, index); 
    int numChildren = node.getChildCount(); 
    depth++; 
    for (int i = 0; i < numChildren; i++) { 
     verify(node.getChildAt(i), depth, i); 
    } 
} 
public void verifyName(TreeNode node, int depth, int index) { 
    StringBuilder expectedName = new StringBuilder(); 
    expectedName.append(depth).append('.').append(index); 
    assertEquals("Tree node not in expected place", 
       expectedName.toString(), node.getName()); 
} 

이제 상당히 큰 나무를 테스트 할 수 있습니다. 재귀의 깊이가 문제가되면 재사용 메서드를 스택 대신 사용할 수 있습니다.