Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/27: Рейтинг темы: голосов - 27, средняя оценка - 4.89
ICEberg

Unit тесты

04.01.2011, 16:19. Показов 5508. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток!
Хочу попросить сторонников и противников Unit тестирования высказать свое мнение по этому поводу.
Какие негативные позитивные стороны в этом подходе? Почему его стоит не стоит применять.
Спасибо.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2011, 16:19
Ответы с готовыми решениями:

Unit-тесты
Как для класса Person сделать unit-тесты (equalsverifier) ??? public class Person { //создание класса Person private...

Unit тесты
Не подскажете как грамотно составить unit тесты? И какие основные моменты нужно тестировать в приложениях? То есть например если я делаю...

Тесты и бд
Здравствуйте. Помогите советом пожалуйста, я тестирую DAO слой(Hibernate + Spring). Я создал аналогичную тестовую бд. Вот код теста: ...

14
3 / 3 / 0
Регистрация: 25.08.2010
Сообщений: 213
04.01.2011, 17:19
Негативный подход - человеческий фактор. А именно юнит тест - это тестирование компонентов, но если у тебя работают все компоненты, то это не значит что и система без багов. К тому же второй негативный фактор - хорошо протестить компонент - повторноеисполнение методов, а также их поведение при граничных значениях.

Положительные стороны: при качественном составлении тестиров можно быть уверенным что твои компоненты работают правильно. То есть при каких-то багах ищешь ошибку в логике или взаимосвязях, но не в самих компонентах, что соответственно сужает область поиска ошибки, что ведет к ее скорейшему устранению.

Лично мое мнение - двумя руками за.
Использую и очень доволен.
Времени немного занимает, зато мелкие и самые пакостные ошибки видны сразу.

PS стоит также применять совместно с такими тулами (JUnit я полагаю) еще test coverage тулы - они показывают процент покрытия тестов кодами. То есть помогает увидеть все ли куски компонент корректно протестированы.
0
paradise
05.01.2011, 09:12
Если не трудно, подкиньте реальный (читай не абстрактный) пример тестирования. Пример, который был написан не ради примера.
4 / 4 / 1
Регистрация: 13.08.2008
Сообщений: 931
05.01.2011, 10:42
ну держи, если не шутишь пару методов попроще, на самом деле в этом классе тестов около 20:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import junit.framework.TestCase;
 
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Collection;
import java.util.Iterator;
import java.util.ArrayList;
 
/**
 * <p>$Id$</p>
 *
 */
public class ArNoteDataTest extends TestCase {
 
    private ArNoteData data;
 
    private static final String DATE_PATTERN = 'yyyy-MM-dd';
    private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat(DATE_PATTERN);
 
    private Date callDate;
    private static final String CALL_TIME_STRING = '15:20:00';
 
    private static final Date DATE_EXPECTED = new GregorianCalendar(2004, Calendar.OCTOBER, 22, 15, 20, 00).getTime();
 
    protected void setUp() throws Exception {
        data = new ArNoteData();
        data._setBcust('TEST CUST');
        data._setInvno('99999');
        data._setCall_no('001');
 
        callDate = DATE_FORMATTER.parse('2004-10-22');
 
        // call date & time
        data.setCall_dte(callDate);
        data.setCall_time(CALL_TIME_STRING);
 
        // multiple call codes
        data.setCall_codes('EMS, POD');
    }
 public void testSetCallDateTimeTimeIsNull() {
        data.setCall_time(null);
        assertEquals(new GregorianCalendar(2004, Calendar.OCTOBER, 22, 0, 0, 0).getTime(),
                     data.getCallDateTime());
    }
 
    public void testSetCallDateTime() {
        // reset
        data.setCall_dte(null);
        data.setCall_time(null);
 
        data.setCallDateTime(DATE_EXPECTED);
 
        // date
        Calendar dateOnly = new GregorianCalendar(2004, Calendar.OCTOBER, 22);
        assertEquals('Dates should be equal.', dateOnly.getTime(), data.getCall_dte());
 
        // time
        assertEquals('Wrong time returned.', '15:20:00', data.getCall_time());
    }
}
тестов существует 5 уровней - от юнит и выше до acceptance test у заказчика.
0
ICEberg
05.01.2011, 12:07
2 mr_dronski:

а ты не мог бы детальнее рассказать о тех 5 уровнях?
ICEberg
05.01.2011, 12:12
2 mr_dronski:

и вообще... что тебе это дает? Ведь ты тратишь время на этот код. В чем эффект? По какому критерию ты отбираеш то, что нужно тестить...
Ведь очевидно, что существуют классы, которые в связи со своей простотой не нуждаются в тестировании.
4 / 4 / 1
Регистрация: 13.08.2008
Сообщений: 931
05.01.2011, 12:33
про уровни очень хорошо сказано в JUnit in Action (functional, integration, unit, acceptance, etc.).

ессно, не стоит тестировать простые методы. но простые - это get/set без логики. политика такая - если у вас нет теста, подтверждающего, что при данном input вы получаете ожидаемый output, то функционала фактически нет.

что дает? вам я привел простой пример теста выше. теперь представьте, что у вас 1000 классов и изменения малейших деталей могут повлечь за собой последствия, о которых вы просто не узнаете, а узнает ваш клиент в продакшн системе (пи'№;ц всем, короче). это дает уверенность при рефакторинге.

unit tests - всего лишь минимальный уровень тестирования. времени отнимает немного, но это единоразовое вложение времени окупается сполна.

теперь представьте более тяжелый случай интеграционных тестов - тестируем Struts в связке с EJB контейнером и database. тут уже нужно подготовить данные перед тестом, прогнать testcase, сравнить, что же на самом деле произошло в базе. DBUnit + StrutsTestCase отлично справляются с этой задачей.

думаю, идея уже яснее стала. да и дисциплина повышается, не говоря уже о качестве системы. про философию можете в книге, упомянутой выше почитать - лучше, чем там, сложнее объяснить.
0
ICEberg
06.01.2011, 11:22
Великолепно! Дабу ощутить всю мощь, я принялся тестировать. Это все конечно очнь корошё, но как быть с private методами? Ведь в методе setUp() просто создается экземпляр тестируемого класса. Соотв. к приватным методам не доберешся. Как поступить в данном случае? Может я делаю что-то не так?
4 / 4 / 1
Регистрация: 13.08.2008
Сообщений: 931
06.01.2011, 12:09
вообще-то есть способ, но такие закрученные, что не стоят того (в NetBeans был плагин для тестирования таких методов через динамическое создание внутренних статических классов в тестовом классе).

прикиньте сами - если метод private, значит он предназначается только для данного класса. есть методы, которые его будут использовать, их и тестируйте. если нет, тогда метод на самом деле должен быть protected (обычно это гибче, чем private). а с тестированием таких методов никаких проблем нет. необходимое условие - тест должен находиться в том же пакете (это не проблема, если иерархия ваших тестов копирует иерархию тестируемых классов).
0
paradise
07.01.2011, 11:19
Если я правильно понял, тестирование класса дает ответ на вопрос: 'Изменилось ли что-то в работе класса с внешней стороны?'.
Другими словами: 'Не нарушен ли контракт между поставщиком класса и тем, кто этот класс использует?'

При этом нет смысла тестировать private методы, так же как и количество и типы переменных... Все это не входит в контракт.
paradise
09.01.2011, 10:38
>про уровни очень хорошо сказано в JUnit in Action (functional, integration, unit, acceptance, etc.).

Может и ссылкой поделитесь?
paradise
09.01.2011, 15:37
Нашел здесь:
ftp://194.85.41.42/BOOKS
paradise
09.01.2011, 15:39
Прямая ссылка:
http://vf.bseu.by/stas/Junit%20In%20Action.rar
0 / 0 / 0
Регистрация: 28.08.2010
Сообщений: 42
20.01.2011, 10:07
Испoльзуем Spring framework в прoекте, нужнo прoтестирoвaть facade - business manager метoды, причем в oснoвнoм нa select - create, delete and update крaине редки. Есть схемa с тестoвыми дaнными в Oracle. Вoпрoс стoит тaк: пoмoжет ли мне dbUnit, пoдгoтoвить mock objects вытaщив их из бaзы? Пoкa чтo я увидел,чтo object тaм предстaвлен oбычнoй стрoкoй, кaк в бaзе. Т.е. если у меня слoжныи oбйецт, тoгдa пиши ручкaми тoнны кoдa нa инитиaлизaцию всеи гирлянды етoгo mock objecta. Другaя aлтернaтивa: срубить mockContext.xml file, в кoтoрoм oписaтъ mock objects сoглaснo требoвaний Spring. Вызывaи любoй mock object пo alias, не нaписaв ни стрoчки Java кoдa. Oднo плoхo: mockContext.xml дoлжен быть синхрoнизирoвaн с кoнтентoм test Oracle data. Пoдскaжите пo dbUnit, если ктo егo юзaл, стoит мне с ним связывaтъся или нет?

Thanks in advance...
0
4 / 4 / 1
Регистрация: 13.08.2008
Сообщений: 931
20.01.2011, 10:52
зависит, конечно, от сложности проекта и ресурсов, которыми вы располагаете.

если вы уверены в том, что этап кода->база работает без проблем (скажем, O/R mapping делает контейнер), то в вашем сетапе dbUnit не много добавит.

однако, когда вы уже пишете интеграционные тесты, то очень помогает. скажем, существуют проблемы с автоматическим тестированием web страниц, но если вы, скажем, используете StrutsTestCase, то получается неплохая связка именно для такого тестирования. dbUnit может работать и по живой базе (добавить записи перед тестом, удалить после), и на чистой (удалить все записи, добавить тестовые, удалить после).

идея вся в том, хотите ли вы тестировать участок между кодом и базой. если нет, то dbUnit не стоит, наверное, использовать, а тестировать business layer с mock'ами.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.01.2011, 10:52
Помогаю со студенческими работами здесь

Тесты в JAVA
Пошел на курсы по JAVA, препод уже несколько лент рассказывает про тесты, говорит что все методы ПО которое мы пишем обязательно необходимо...

JUnit тесты
Мне нужно сделать тесты к проекту, собранному в Maven. Не понимаю, как создать тест. У меня в программе реализуется модуль .jar, который...

Тесты на java
здраствуйте, как сделать, что б при нажатию на кнопку мои ответы не суммировались, а обновлялись. Выходит отвечаешь на все вопросы и...

Тесты по Java
Всем привет, готовлюсь к тестированию по Java есть несколько для меня непонятных вопросов, помогите...

Python unit tests в maven
Есть Maven-проект, в котором есть некоторые питоновские скрипты. Для тестирования этих скриптов написал юнитесты. Хотелось бы знать, можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru