Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.06.2012, 20:26
Wiali Wiali вне форума
Прохожий
 
Регистрация: 25.06.2012
Сообщения: 3
Репутация: 10
По умолчанию Пара вопросов по тестированию и рефакторингу

Здравствуйте, возникла необходимость сделать рефакторинг чужого кода + решил разобраться и освоить модульное тестирование.

В процессе возникло несколько вопросов:

1. DUnit;
1.1. Стандартный кодогенератор создает шаблон теста так, что если тестируешь класс, то на тест идут только public методы. Понятно, почему: методы тестирования работают с объектом класса, которому доступны только паблик методы. Но ошибки могут быть и в приватных методах, как быть?

1.2. Предположим, класс DBConnector содержит два метода (процедуры), которые инкапсулируют внутри множество методов.

Код:
procedure GetAuthenticationData;
procedure ConnectByDataBase;


Т.е. после GetAuthenticationData изменяются поля класса и ConnectByDataBase использует эти значения для своей работы.

Как тогда протестировать отдельно тот же ConnectByDataBase, которая работает с приватными полями класса?


2. Рефакторинг

2.1. Есть события formcreate, ontimer и часть других методов, которые отвечают за инициализацию данных и вызываются в разное время.

Я так понимаю, лучшее решение воспользоваться паттерном "одиночка"
и инициализировать данные как: singleton.getInstance.egg1,singleton.getInstance.e gg2 и т.д. ?

2.2. Обработка исключений на разных уровнях вложенности функций.

Я просто запутался. Вот к примеру есть такая ситуация ( я сознательсно опускаю некоторые элементы синтаксиса:

Код:
function A;
begin
try
 function B;
except on ExceptionFromB
end

function B;
begin
try
 function C;

 //некоторый код, который поднимает исключение ExceptionFromB

except on ExceptionFromC
end

function C;
begin
 //некоторый код, который поднимает исключение ExceptionFromC
end

Bargest: оформляем код тегами [ code] [ /code]!

Нормальная ли такая конструкция где в функции B и вызывается функция C и поднимается исключение, которое будет обработано на уровне функции А.

+ тут такая ситуация, что если будет поднято исключение ExceptionFromC, то даже в случае того, если будет поднято ExceptionFromB, будет обработано только ExceptionFromC на уровне функции B. Как тогда быть с обработкой исключения на уровне функции А ?

А если я захочу поймав исключение на самом нижнем уровне прекратить выполнение всех функций?


Заранее спасибо

Последний раз редактировалось Bargest, 25.06.2012 в 20:51.
Ответить с цитированием
  #2  
Старый 25.06.2012, 21:24
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

здесь некоторые даже не рекомендуют тестировать private методы

1.2 скорее всего надо разбивать на функции или вроде того; я изолированно не тестировал, может потому, что с тестами ещё не освоился; по идее тесты должны повышать качество кода, но для изоляции приходится всякие mock объекты использовать

2 я понимаю singleton, просто как способ сгруппировать глобальные переменные, функции

2.2 какое применение этих Exception-ов?

Последний раз редактировалось Pyro, 25.06.2012 в 21:39.
Ответить с цитированием
  #3  
Старый 25.06.2012, 22:07
Wiali Wiali вне форума
Прохожий
 
Регистрация: 25.06.2012
Сообщения: 3
Репутация: 10
По умолчанию

Bargest, сорри, учту на будущее.

Блин, столько писал и меня выкинуло с аккаунта и все сообщения пропали, так как писал быстрое сообщение.

Восстанавливаю

Pyro

1) Гляну ссылку, спасибо
Но тогда я не понимаю идеологии, если не тестировать приватные методы, то как быть с полями? Многие методы тесно связаны с полями класса. Как я могу тестировать публичный метод, который не принимает ни каких параметров, а работает со значениями приватных полей и методов?

2. Это понятно, просто сейчас в коде идет работа в oncreate, а потом в ontimer. Используются и локальные и глобальные переменные.

Инкапсулировать все в синглетон мне не совсем нравится, так как эти переменные/функции будут нужны не везде.

Сделать все в виде локальных переменных класса каждого обработчика тоже не вариант, так как я говорил работа взаимосвязана.

Совместить все в обработчике одного события не представляется возможным.

Я думал сделать два класса, один из которых будет работать с oncreate и результаты его работы будут передаваться в другой класс работы с ontimer, но по сути это один итот же класс и я исскуственно делю его сущность на две и это опять мне не совсем нравится

2.2. Т.е.? Просто есть структура: функция вызывает некоторый код и функцию, та функция в свою очередь некоторый код и функцию и т.д.

во время выполнения каждой функции может сгенерироваться стандартное исключение, либо поднятое мною. Мне нужно пронести инфу об этом исключении по всем уровням, прекратив выполнение всех уровней и внешней функции.
Ответить с цитированием
  #4  
Старый 25.06.2012, 22:18
Wiali Wiali вне форума
Прохожий
 
Регистрация: 25.06.2012
Сообщения: 3
Репутация: 10
По умолчанию

Прочитал ссылку, вообщем-то понятно предложение делать эти методы защищенными и не тестировать методы доступа.

Но все равно это не решает проблемы, когда метод работает с приватными полями ( именно полями)
и мы никак не можем выставить им значения так как мы тестируем именно МОДУЛЬНО, изолированно от других методов.
Ответить с цитированием
  #5  
Старый 26.06.2012, 08:03
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

2.2 в обработке исключения можно сделать
Код:
raise ExceptionFromB.create //если не ошибаюсь

Цитата:
oncreate, а потом в ontimer
даже не представляю что там происходит, и что с этим можно сделать
по идее надо инкапсулировать в классы исходя из их ответственности(имён)

Цитата:
изолированно от других методов
изолированно я сам не делал ещё, скорее всего для этого надо делать рефакторинг, повышающий тестабилити, например здесь книжку рекомендуют, может там что-то есть
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:30.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter