Upload
-
View
342
Download
0
Tags:
Embed Size (px)
Citation preview
Javenue
Блог о программировании на JavaИнформационные технологии
2 January
2006
Тестирование с помощью 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,02OK (3 tests)
Для тестирования более комплексных классов, могут пригодится методы setUp и tearDown.Первый метод может проинициализировать один или несколько экземпляров тестируемого
класса для использования в нескольких TestCases, второй метод отпускает захваченные приинициализации ресурсы.
Тестирование с помощью JUnit становится все более популярным. Думаю, JUnit Framework вомногом поможет вам.
Комментарии по поводу статьи приветствуются.
24 Comments »
RSS feed for comments on this post. TrackBack URI
Vitali KFebruary 24, 2006 #
Рулез!
�? еще - я наконец понял зачем нужны assert’ы
Огромное спасибо за статьи и за сайт вцелом.
Здесь как нигде явно подтверждается выражение “краткость - сестра таланта”
Удачи Вам (и всем нам) в ва�?ем и на�?ем нелёгком труде!
hudsonSeptember 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() inexamples.Tnx
hudsonNovember 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!
c0nst
March 4, 2007 #
2PVoLan: спасибо, старался. Просто из под IDE процесс запуска тестов очень упрощен и я не
хотел обращать на это внимание.
2Denis: на счет второго пункта: начиная с Java 1.5 можно использовать аннотации. Библиотеку
JUnit уже переписали под 1.5 и там можно называть тест как угодно, главное в аннотациинаписать, что это за метод. К сожалению, на проекте у нас все еще 1.4.2 используется. Но, скоро
буду перебираться на версии повы�?е…
slavik112211August 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 на то, что он действительно
возвращает треугольник.
Заранее спасибо за ответы!
STARfishSeptember 11, 2008 #
2 Agent.
ре�?или в Яndex устроиться?:))))…
Mihey
June 11, 2009 #
Спасибо за помощь
Giraffe
December 2, 2009 #
Вопрос тот же, что и у hudson.
Как запустить JUnit тесты не из-под IDE?
hudson
December 27, 2009 #
Giraffe, честно говоря давно это было. �? скорее всего дело было в CLASSPATH… )) Потому
что тесты из командной строки я запускал.
Don
March 19, 2010 #
А как тестировать методы, которые ничего не возвращают?
c0nst
March 19, 2010 #
@Don:
Даже если метод ничего не возвращает, он все же меняет состояние каких-то объектов (еслинет, то в по поводу необходимости такого метода есть боль�?ие сомнения).
В таком случае нужно проверять, правильно ли было изменено состояние.
Don
March 19, 2010 #
Так как тут описано, получается, работает. Но я читал, что такой способ устарел, т.е. нужно
применять аннотации. Свой класс не должен наследоваться от CaseTest, а над тестирующемметодом пи�?ется @Test, так ничего не получается, все равно нужно наследовать свой класс
от TestCase.
Есть примерчик, где описывается написание тестов от JUnit4?
GX3P
July 19, 2010 #
Здравствуйте,
Разъясните, пожалуйста, ситуацию. В чем смысл JUnit? Например, строки
MathFunc math = new MathFunc(45);
assertTrue(math.plus(123) == 168);
не являются ли они надуманными, в плане проверки? Ведь при отладке метода мы все равно
проверяем правильность его работы. Так в чем тогда смысл этих строк? Создается впечатление
искусственности ситуации.Действительно хочу понять.
Заранее спасибо,
Taper
August 27, 2010 #
To GX3P:
Все тесты в итоге являются надуманными, бездумные тесты никому не нужны и что они будут
тестировать - большой вопрос…
На этом простом примере автор показал принцип использования JUnit с использованием
простых операций, которые можем проверить самостоятельно: 45 + 123 = 168.
Отладка: бывает разная, все зависит от приложения - есть случаи когда без ручной отладки не
обойтись никак (для этого собирают команды тестировщиков), а есть случаи, когда простыевещи можно проверить еще на этапе сборки приложения - для этого и создаются JUnit-тесты.
Ведь согласитесь, гораздо приятнее когда работу человека выполняет железяка, да еще и
быстро, и к тому же на этапе компиляции.
В данном примере использован всего один класс, а в реальности их может быть гораздо больше
(и зависимостей между ними тоже), а значит и вероятность возникновения ошибки
возрастает…
Очень редко случается что класс пишется один раз и навсегда, SDK и тот обновляется
периодически. Вот отсюда и появляется необходимость в автоматических тестах.
mike
March 20, 2011 #
to hudson
тоже столкнулся с такой проблемой при выполнении jar.
решение простое - надо скопировать junit****.jar в
java/lib/ext
и всё заработает.
Вызвано тем, что при выполнении *.class все библиотеки беруться из CLASSPATH.А вот привыполнении jar библиотеки берутся из class-path манифеста.
родробности тут
http://download.oracle.com/javase/1.4.2/docs/tooldocs/findingclasses.html
SunHere
August 15, 2011 #
Здравствуйте, далёк от программирования, но читаю про тестирование, выходит unitтестированием занимаются программисты в процессе написания кода?тоесть для
определённого класса пишеться класс, в котором тестяться данные?
chinaexp
August 16, 2011 #
http://chinaexp.ru интернет-магазин!
Leave a comment
XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em>
<i> <strike> <strong> <pre>
Name *
Mail (will not be published) *
Website
Submit Comment
Blog
English
Archives
About
Search
Web javenue.info
Поиск в Google
Categories
Java GUI, Swing, AWT, SWT
Java open-source проектыJava technologies (translated)
Java technologies, J2SE
Java Web Design, J2EE
Project Management
Тестирование кода
Технологии XML, XPath
Полезные программыПаттерны проектирования
Базы данных, SQL, Oracle
Ваш досуг. Полезные советы
Интернет Маркетинг, SEO
Разное (uncategorized)
Powered by WordPress, Design by Aph1na
RSS: Posts, Comments
СертификатJava - Эксперт
www.quizful.net