Модульное тестирование простой функции слова - PullRequest
1 голос
/ 26 марта 2011

Я новичок в модульном тестировании и, читая об этом, я запутался в том, как это сделать.

У меня есть этот код, который тасует введенное слово:

public static void shuffle(String word) {

    // Store string into array
        ArrayList<Character> wordShuffled = new ArrayList<Character>();
        // loop the index of the string
        for (int i = 0; i < wordE.length(); i++) {
            wordShuffled.add(word.charAt(i));// add the word
        }
        Collections.shuffle(wordShuffled);// shuffle the word

Как мне написать модульные тесты для кода выше.Спасибо

Ответы [ 4 ]

1 голос
/ 26 марта 2011

Легкой проверкой было бы создание хэш-карты символов в зависимости от частоты для исходного слова.

Например,если ваше слово «Двойник», карта будет

D->1
o->1
p->2
e->2
l->1
g->2
a->1
n->1
r->1

Создайте подобную карту для перемешанного слова.Два хэш-карты должны быть равны.

Это, однако, будет проверять только то, что перемешанное слово содержит те же буквы, что и исходное слово.Вы также должны проверить, что слово на самом деле тасуется, проверив равенство строк и запустив тасование несколько раз, как указывало @Shengyuan.

0 голосов
/ 26 марта 2011

Сравнить результаты shuffle() дважды, assertFail(), если результаты совпадают.

0 голосов
/ 26 марта 2011

Несколько проблем, затрудняющих проверку этого кода:

  1. Ваша функция shuffle объявлена ​​статической
  2. Функция вызывает Collections.shuffle, что делает ее очень трудной для насмешки

Вот несколько советов о том, как вы можете протестировать этот метод, хотя они потребуют некоторых изменений в вашем дизайне:

public class WordUtil {
    public void shuffle(String word) {

        // Store string into array
        // -> It is better to code to the interface, eg, List, Set, Map 
        // than to the implementation, eg. ArrayList, LinkedList, HashMap, etc.
        List<Character> wordShuffled = new ArrayList<Character>();
        // loop the index of the string
        for (int i = 0; i < wordE.length(); i++) {
            wordShuffled.add(word.charAt(i));// add the word
        }
       Collections.shuffle(wordShuffled);// shuffle the word
    }
    // we are making this method visible only for testing purposes but 
    // shouldn't be regarded as public API
    void shuffle(Collection c) {
        Collections.shuffle(c);
    }
}

public class WordUtilTest {
    private boolean shuffleForCollectionWasCalled;
    private Collection collectionForShuffle;

    public void testShuffle() throws Exception {
        WordUtil util = new WordUtil_ForTest();
        String word = "some word";

        util.shuffle(word);

        assertTrue(shuffleForCollectionWasCalled);
        List<Character> expected = new ArrayList<Character>();
        for (int i = 0; i < word.length; i++) {
            expected.add(word.charAt(i);
        }
        assertEquals(expected, collectionForShuffle);
    }

    private static class WordUtil_ForTest extends WordUtil {

        @Override
        void shuffle(Collection c) {
            shuffleForCollectionWasCalled = true;
            collectionForShuffle = c;
        }
    }
}

Хотя это может показаться немного запутанным, нам нужно ввести void shuffle(Collection c), потому что он позволяет нам контролировать поведение Collections.shuffle, делая его детерминированным, а реализация, которую мы имеем в WordUtil_ForTest, тривиальна, потому что мы не проверяя, как Collections.shuffle работает (это должно быть хорошо протестировано в JDK), мы просто заботимся о том, чтобы отправить ему правильные параметры.

Вы можете расширить этот тест, добавив условия для обработки нулевых входов и других крайних случаев.

0 голосов
/ 26 марта 2011

Очевидный проходной тест:

Упорядочить : создать известное слово.

Act : вызов shuffle.

Утверждение : результат проверки является перестановкой исходного слова.

Затем найдите точки отказа или граничные случаи для дальнейших испытаний.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...