-6

こんにちは、関数を実行して、junit テストと考えてテストしようとしていますが、junit テストが失敗する理由がわかりません。私が書いた関数が機能すると確信しています。疑問に思っている人がいれば、これは宿題です。

ここにテストがあります

@Test
public void test4() {
    lst1.removeAll(3);
    assertEquals(8, lst1.size());
    assertEquals(false, lst1.contains(3));
    lst1.removeAll(6);
    assertEquals(5, lst1.size());
    assertEquals(false, lst1.contains(6));
    lst1.removeAll(5);
    assertEquals(3, lst1.size());
    lst1.removeAll(4);
    assertEquals(2, lst1.size());
    lst1.removeAll(7);
    assertEquals(1, lst1.size());
    lst1.removeAll(8);
    assertEquals(0, lst1.size());
}

ここにコードがあります

public void removeAll( E x ) {
      first = first.next;
       if (first.data == x ) {
           first = first.next;   
       }
       Node curr = first;
       Node fut = curr.next ; 
       while ( fut!= null) {
            if (fut.data == x ) {
                curr.next = fut.next;               
            }
         curr=curr.next;
         fut=fut.next; 
       }
    assert check();
}

junitのセットアップ

public class MyListTest {
    private MyList<Integer> lst0;
    private MyList<Integer> lst1;
    private Integer[] a;
    @Before
    public void setUp() throws Exception {
        lst0 = new MyList<Integer>();

        a = new Integer[] {3,4,3,5,6,8,6,6,7,5};
        lst1 = new MyList<Integer>();
        for(Integer x: a) {
            lst1.add(x);
        }
}

サイズ方法

public int size() {
   return sz;
}

主な方法

public class MyList<E extends Comparable< E>> implements Iterable<E> {
   private Node first;
   private int sz;

   public MyList() {
      first = null;
      sz = 0;
      assert check();
   }
}

チェック方法

private boolean check()
{
    if (first == null && sz != 0) return false;
    if (sz == 0 && first != null) return false;
    if (sz == 1 && (first == null || first.next != null)) return false;
    if (sz > 1 && (first == null || first.next == null)) return false;

    int count = 0;
    Node p = first;
    while(p != null) {
        count++;
        p = p.next;
    }

    if (count != sz) {
        System.out.printf("count = %d, sz = %d\n", count, sz);
        return false;
    }

    return true;
}
4

1 に答える 1

0

完全に立ち往生している場合は、最初からやり直すことを検討し、より小さくて安全な手順でやり直すことを検討してください。

簡単なテストから始めます。

@Test
public void testConstruct() {
    MyNewList<Integer> myNewList = new MyNewList<Integer>();
    assertNotNull(myNewList);
    assertEquals(0, myNewList.size());
}

テストに合格するだけのコードを書きましょう -複雑な構造を考えないでください。MyNewListreturn 0;size()

コードが最終的にテストに合格したら、別のコードを書くことができます:

@Test
public void testAdd() {
    MyNewList<Integer> myNewList = new MyNewList<Integer>();
    myNewList.add(5);
    assertEquals(1, myNewList.size());
}

ここでも、両方のテストに合格するのに十分なコードを実装します。成功したら、テストを変更して、ソリューションが他のパラメーターでも機能するかどうかを確認します。

@Test
public void testAdd() {
    MyNewList<Integer> myNewList = new MyNewList<Integer>();
    myNewList.add(5);
    assertEquals(1, myNewList.size());
    myNewList.add(7);
    assertEquals(2, myNewList.size());
}

これで、自分のメソッドを信頼して、add()次に何をすべきかを決めることができます。少し休憩して、コードをクリーンアップするか、クラスの内部構造を整理するか、それとも旅の次の目的地に進みますか?

最後に進んだら、次のパズルを解かなければなりません:

@Test
public void testRemoveAll() {
    MyNewList<Integer> myNewList = new MyNewList<Integer>();
    myNewList.add(5);
    myNewList.add(5);
    myNewList.add(7);
    myNewList.add(3);

    assertEquals(4, myNewList.size());
    myNewList.removeAll(3);
    assertEquals(3, myNewList.size());
}

ここでも、すべてのテストに合格するのに十分なだけのコードを記述します。今のところ、この方法でメソッドを実装することもできます:

public void removeAll(T element) {
    size--;
}

これは、上記のテストで説明されている要件を完全に満たしているためです。ここで、メソッドをより厳しいチェックに直面させ、テストを変更します。

@Test
public void testRemoveAll() {
    MyNewList<Integer> myNewList = new MyNewList<Integer>();
    myNewList.add(5);
    myNewList.add(5);
    myNewList.add(7);
    myNewList.add(3);

    assertEquals(4, myNewList.size());
    myNewList.removeAll(3);
    assertEquals(3, myNewList.size());
    myNewList.removeAll(5);
    assertEquals(1, myNewList.size());
}

以前に些細な解決策を選択した場合は、「問題が発生している」可能性があります;) したがって、removeAll()メソッドについてもう一度考えて、テストに再度合格するまでコードを拡張してください。これが完了すると、コードが機能することを確信できます。

クラスで何かを変更した場合は、テストを再度実行して、何かが壊れていないかどうかを確認してください。

メソッドの動作方法に関する要件が変更された場合は、新しい要件を反映するようにテストを変更し、再度実行します。

一見、これは非常に面倒に思えるかもしれませんが、テストのセットアップがしっかりと確立されていれば、いつでも次のように言うことができます

于 2013-04-26T11:06:28.260 に答える