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
Рулез!
И еще - я наконец понял зачем нужны assert’ы
Огромное спасибо за статьи и за сайт вцелом.
Здесь как нигде явно подтверждается выражение “краткость - сестра таланта”
Удачи Вам (и всем нам) в вашем и нашем нелёгком труде!
Спасибо за статью! Помогла разобраться в самых азах jUnit. Буду пробовать применять junit framework при тестировании web приложений вместе с selenium. Если интересно что получится - пишите ![]()
Good article. But I’d like to get more information about such methods as: setUp() and tearDown() in examples.Tnx
Опять я :). взялся за разработку тестов на основе предложенного варианта, однако столкнулся с казалось бы несущественной, но тем не менее проблемой - тесты не запускаются через полученный мной jar файл. При этом из IDE прекрасно работают.
Как перебороть это недоразумение? Буду рад совету на dmitry(dot)bykadorov(at)gmail.com
Я типа НЕТ-чик. Умею пользоваться NUnit. Вот решил почитать, а как живут Жабисты…И заметил, что живут) У нас все можно задать через Аттрибуты ( Анатации по вашенски) Примерно вот так
МойЛюбойКласс{
[Test]
КакХочуТакИНазываю()
{
Assert(myClass.Mul(2,2),4);
}
}
Собственно и все:) А у вас такое планируется - на антотациях JUNIT?
да, уже сделали (junit 4.0 + idea 6.x)
Спасибо за статью - классно написана,с помощью неё за 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 могут не распознать метод как тест(то есть ошибка визуально будет определяться как ошибка в программе которая тестирует,а не в той которую тестируют)
Хоть кто-то описал функцию main при работе с JUnit!
2PVoLan: спасибо, старался. Просто из под IDE процесс запуска тестов очень упрощен и я не хотел обращать на это внимание.
2Denis: на счет второго пункта: начиная с Java 1.5 можно использовать аннотации. Библиотеку JUnit уже переписали под 1.5 и там можно называть тест как угодно, главное в аннотации написать, что это за метод. К сожалению, на проекте у нас все еще 1.4.2 используется. Но, скоро буду перебираться на версии повыше…
люди гляньте ещё вот сюда:
http://www.linux.ie/articles/tutorials/junit.php
ну как же клёво там расписан процесс выявления ошибок в программе! я прям зафанател тестами:)
Спасибо, то что надо! Как раз для начинающих! Просто, коротко и понятно!
Всем привет!
Я только начинаю разбираться с тестированием при помощи JUnit. Если кто может то покажите пожалуйста как решить следующую задачу:
Дано:
Интерфейс
public interface Triangle
{
int getLen1();
int getLen2();
int getLen3();
}
Методы возвращают 3 числа, которые должны быть длинами сторон треугольника.
Есть метод возвращающий треугольник:
public final class TriangleProvider
{
public static Triangle getTriangle()
{
…
}
}
Требуется: написать код junit теста, проверяющего метод getTriangle на то, что он действительно возвращает треугольник.
Заранее спасибо за ответы!
2 Agent.
решили в Яndex устроиться?:))))…