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,02 OK (3 tests)
Для тестирования более комплексных классов, могут пригодится методы setUp и tearDown. Первый метод может проинициализировать один или несколько экземпляров тестируемого класса для использования в нескольких TestCases, второй метод отпускает захваченные при инициализации ресурсы.
Тестирование с помощью JUnit становится все более популярным. Думаю, JUnit Framework во многом поможет вам.
Комментарии по поводу статьи приветствуются.
25 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 устроиться?:))))…
Спасибо за помощь
Вопрос тот же, что и у hudson.
Как запустить JUnit тесты не из-под IDE?
Giraffe, честно говоря давно это было. ? скорее всего дело было в CLASSPATH… )) Потому что тесты из командной строки я запускал.
А как тестировать методы, которые ничего не возвращают?
@Don:
Даже если метод ничего не возвращает, он все же меняет состояние каких-то объектов (если нет, то в по поводу необходимости такого метода есть боль?ие сомнения).
В таком случае нужно проверять, правильно ли было изменено состояние.
Так как тут описано, получается, работает. Но я читал, что такой способ устарел, т.е. нужно применять аннотации. Свой класс не должен наследоваться от CaseTest, а над тестирующем методом пи?ется @Test, так ничего не получается, все равно нужно наследовать свой класс от TestCase.
Есть примерчик, где описывается написание тестов от JUnit4?
Здравствуйте,
Разъясните, пожалуйста, ситуацию. В чем смысл JUnit? Например, строки
MathFunc math = new MathFunc(45);
assertTrue(math.plus(123) == 168);
не являются ли они надуманными, в плане проверки? Ведь при отладке метода мы все равно проверяем правильность его работы. Так в чем тогда смысл этих строк? Создается впечатление искусственности ситуации.
Действительно хочу понять.
Заранее спасибо,
To GX3P:
Все тесты в итоге являются надуманными, бездумные тесты никому не нужны и что они будут тестировать - большой вопрос…
На этом простом примере автор показал принцип использования JUnit с использованием простых операций, которые можем проверить самостоятельно: 45 + 123 = 168.
Отладка: бывает разная, все зависит от приложения - есть случаи когда без ручной отладки не обойтись никак (для этого собирают команды тестировщиков), а есть случаи, когда простые вещи можно проверить еще на этапе сборки приложения - для этого и создаются JUnit-тесты. Ведь согласитесь, гораздо приятнее когда работу человека выполняет железяка, да еще и быстро, и к тому же на этапе компиляции.
В данном примере использован всего один класс, а в реальности их может быть гораздо больше (и зависимостей между ними тоже), а значит и вероятность возникновения ошибки возрастает…
Очень редко случается что класс пишется один раз и навсегда, SDK и тот обновляется периодически. Вот отсюда и появляется необходимость в автоматических тестах.
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
Здравствуйте, далёк от программирования, но читаю про тестирование, выходит unit тестированием занимаются программисты в процессе написания кода?тоесть для определённого класса пишеться класс, в котором тестяться данные?
http://chinaexp.ru интернет-магазин!
a mozhno uznat’ kak testirovat proceduru, kotoraja nichego ne vovrawaet?
spasibo