среда, 1 августа 2012 г.

testing: junit

JUnit - первая библиотека модульного тестирования. Написана Kent Beck (так же соавтор методологии разработки XP) и Erich Gamma (один из GoF - соавтор Шаблонов Проектирования) в 19?? году. Kent Beck также автор (? один из авторов) методологии Test Driven Development (Разработка через тестирование).

Модульное Тестирование - это метод при котором проверяются наименьшие тестируемые части. Зачастую это могут быть классы (ArrayList) или методы (Math.sin()) или небольшие подсистемы (?). Модульные тесты должны следовать группе принципов FIRST (Fast, Isolated, Repeatable, Self-Validated, Timely).

В Java мире наиболее популярные фреймворки модульного тестирования - JUnit и TestNG. TestNG разработан в IBM и является более продвинутым фреймворком (пока бездоказательное утверждение).

Порядок действий
1. Скачайте JUnit.jar со страницы https://github.com/KentBeck/junit/downloads (ссылку подписанную "Basic JAR" = )
2. Подключите к своей IDE в качестве библиотеки.
3. Признаком успеха является компилируемость и запускаемость данной программы

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;

@RunWith(BlockJUnit4ClassRunner.class)
public class EmptyTest {
    @Test()
    public void test0() {
        System.out.println("Hello #0, JUnit!");
    }

    @Test()
    public void test1() {
        System.out.println("Hello #1, JUnit!");
    }
}

Ключевые примеры и идиомы
(Больше можно прочитать на странице JUnit - JUnit Usage and Idioms)
- Test Runners (@RunWith, @Categories, @Parameterized)
- assertThat from Hamcrest
- Exception testing
- Ignoring tests

Пример: 
    - ArrayListTest

Задание: 
Реализуйте List<T> как Map<Integer, T> и покройте реализацию модульными тестами. Проверьте, корректно ли работают Ваши тесты на ArrayList<T> и LinkedList<T>.

import java.util.List;
import java.util.Map;

public class MapList<T> implements List<T> {
    private final Map<Integer, T> map;

    public MapList(Map<Integer, T> map) {
        this.map = map;
    }

    @Override
    public T get(int index) {
        return map.get(index);
    }

    @Override
    public void add(int index, T element) {
        map.put(index, element);
    }
    ...
}
Материал для углубленного изучения
    - разберитесь что такое Rule
    - разберитесь что такое Theorie
    - разберитесь с Hamcrest и Matcher, напишите свой