2
January

Тестирование с помощью JUnit (Test Case)

Posted in: Java open-source проекты, Тестирование кода, Java technologies, J2SE |

English version of this article you can find here.
Тестирование далеко не всегда бывает веселым и интересным. Этот процесс обычно достаточно продолжителен и полон монотонной работы. Большинство программистов пользуются стандартным выводом или же дебаггером для тестирования их классов.
В этой статье я опишу библиотеку JUnit, которая упрощает и во многом автоматизирует процесс написания тестов.
Для демонстрации основных возможностей JUnit Framework, напишем примитивный класс на языке Java и будем над ним издеваться. Этот класс будет иметь два метода - нахождение факториала и суммы двух чисел:

public class MathFunc {
    private int variable;

    public MathFunc() {
        variable = 0;
    }
    public MathFunc(int var) {
        variable = var;
    }

    public int getVariable() {
        return variable;
    }
    public void setVariable(int variable) {
        this.variable = variable;
    }

    public long factorial() {
        long result = 1;
        if (variable > 1) {
            for (int i=1; i<=variable; i++)
                result = result*i;
        }
        return result;
    }

    public long plus(int var) {
        long result = variable + var;
        return result;
    }
}

Для написания тестового класса нам нужно создать наследника junit.framework.TestCase. Затем необходимо определить конструктор, принимающий в качестве параметра строку (String) и передающую ее родительскому классу. Наконец, напишем столько тестовых методов, сколько захотим:

public class TestClass extends TestCase {
    public TestClass(String testName) {
        super(testName);
    }

    public void testFactorialNull() {
        MathFunc math = new MathFunc();
        assertTrue(math.factorial() == 1);
    }

    public void testFactorialPositive() {
        MathFunc math = new MathFunc(5);
        assertTrue(math.factorial() == 120);
    }

    public void testPlus() {
        MathFunc math = new MathFunc(45);
        assertTrue(math.plus(123) == 168);
    }
}

Метод assertTrue проверяет, является ли результат выражения верным. Некоторые другие методы, которые могут пригодиться - assertEquals, assertFalse, assertNull, assertNotNull, assertSame.
Для того, чтобы объединить тесты, можно воспользоваться классом TestSuite с его методом addTest. Наконец, для запуска всех тестов нужно воспользоваться TestRunner. Обычно я использую текстовый junit.textui.TestRunner (есть также графические версии - junit.swingui.TestRunner, junit.awtui.TestRunner). В итоге мы получаем метод main следующего вида:

public static void main(String[] args) {
    TestRunner runner = new TestRunner();
    TestSuite suite = new TestSuite();
    suite.addTest(new TestClass(“testFactorialNull”));
    suite.addTest(new TestClass(“testFactorialPositive”));
    suite.addTest(new TestClass(“testPlus”));
    runner.doRun(suite);
}

После запуска получим такие данные:

Time: 0,02
OK (3 tests)

Для тестирования более комплексных классов, могут пригодится методы setUp и tearDown. Первый метод может проинициализировать один или несколько экземпляров тестируемого класса для использования в нескольких TestCases, второй метод отпускает захваченные при инициализации ресурсы.
Тестирование с помощью JUnit становится все более популярным. Думаю, JUnit Framework во многом поможет вам.
Комментарии по поводу статьи приветствуются.

13 Comments »

RSS feed for comments on this post. TrackBack URI



Vitali K
February 24, 2006 #

Рулез!

И еще - я наконец понял зачем нужны assert’ы ;)

Огромное спасибо за статьи и за сайт вцелом.
Здесь как нигде явно подтверждается выражение “краткость - сестра таланта” ;)

Удачи Вам (и всем нам) в вашем и нашем нелёгком труде!

hudson
September 3, 2006 #

Спасибо за статью! Помогла разобраться в самых азах jUnit. Буду пробовать применять junit framework при тестировании web приложений вместе с selenium. Если интересно что получится - пишите :)

Bishop
September 21, 2006 #

Good article. But I’d like to get more information about such methods as: setUp() and tearDown() in examples.Tnx

hudson
November 7, 2006 #

Опять я :). взялся за разработку тестов на основе предложенного варианта, однако столкнулся с казалось бы несущественной, но тем не менее проблемой - тесты не запускаются через полученный мной jar файл. При этом из IDE прекрасно работают.
Как перебороть это недоразумение? Буду рад совету на dmitry(dot)bykadorov(at)gmail.com

НЕТ Адепт
November 26, 2006 #

Я типа НЕТ-чик. Умею пользоваться NUnit. Вот решил почитать, а как живут Жабисты…И заметил, что живут) У нас все можно задать через Аттрибуты ( Анатации по вашенски) Примерно вот так

МойЛюбойКласс{

[Test]
КакХочуТакИНазываю()
{
Assert(myClass.Mul(2,2),4);
}
}

Собственно и все:) А у вас такое планируется - на антотациях JUNIT?

DiVor
December 5, 2006 #

да, уже сделали (junit 4.0 + idea 6.x)

Denis
March 2, 2007 #

Спасибо за статью - классно написана,с помощью неё за 10 минут разобрался с JUnit.По ходу дела наткнулся на след траблы :
1) Можно обойтись без мейна и рунера
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(new TestClass(“testFactorialNull”));
suite.addTest(new TestClass(“testFactorialPositive”));
suite.addTest(new TestClass(“testPlus”));
return suite;
}
2) Все методы в TestClass должны начинаться со слова test,а иначе средства JUnit могут не распознать метод как тест(то есть ошибка визуально будет определяться как ошибка в программе которая тестирует,а не в той которую тестируют)

PVoLan
March 4, 2007 #

Хоть кто-то описал функцию main при работе с JUnit!

March 4, 2007 #

2PVoLan: спасибо, старался. Просто из под IDE процесс запуска тестов очень упрощен и я не хотел обращать на это внимание.
2Denis: на счет второго пункта: начиная с Java 1.5 можно использовать аннотации. Библиотеку JUnit уже переписали под 1.5 и там можно называть тест как угодно, главное в аннотации написать, что это за метод. К сожалению, на проекте у нас все еще 1.4.2 используется. Но, скоро буду перебираться на версии повыше…

slavik112211
August 6, 2008 #

люди гляньте ещё вот сюда:
http://www.linux.ie/articles/tutorials/junit.php
ну как же клёво там расписан процесс выявления ошибок в программе! я прям зафанател тестами:)

Петр
August 14, 2008 #

Спасибо, то что надо! Как раз для начинающих! Просто, коротко и понятно!

Agent
September 10, 2008 #

Всем привет!
Я только начинаю разбираться с тестированием при помощи JUnit. Если кто может то покажите пожалуйста как решить следующую задачу:
Дано:
Интерфейс
public interface Triangle
{
int getLen1();
int getLen2();
int getLen3();
}

Методы возвращают 3 числа, которые должны быть длинами сторон треугольника.
Есть метод возвращающий треугольник:
public final class TriangleProvider
{

public static Triangle getTriangle()
{

}

}

Требуется: написать код junit теста, проверяющего метод getTriangle на то, что он действительно возвращает треугольник.

Заранее спасибо за ответы!

STARfish
September 11, 2008 #

2 Agent.

решили в Яndex устроиться?:))))…

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>