Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Тестирование рисования  (Прочитано 8564 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ysv_
Помогающий

ua
Offline Offline

« : 29-09-2006 13:11 » 

И так, с чего начать? В общем я хочу реализовать класс окна для отображения графика. Но не просто реализовать, а провести тестирование каждого блока или метода в этом классе. И вот уже на первых шагах возникли проблемы Жаль
Пока задача - нарисовать ось X с делениями. Ширина делений фиксированна, жестко прошыта в классе. Задается местонахождение точки начала координат в клиентской области окна и длина оси. Задаются также начальное, конечное значение по оси и шаг делений. Разбил все это на мелкие задачи.
1. Рисование линии. Исользую шаблонную функцию:
Код:
template <class DCT> inline void drawLine(DCT& dc, CPoint from, CPoint to)
{
  dc.MoveTo(from);
  dc.LineTo(to);
}

В тестовом коде подставляется MockDC, в приложении - наследник DC.
Проблем нет.

Начиная со второго пункта хотел все поместить в класс XAxe, но неудобно тестировать.

2. Рисование оси.
3. Рисование одного деления.
4. Рисование всех делений.

Начиная со второго пункта - проблемы.

Вот здесь напрашивается такой тест:
Код:
MockDC dc;
MockDrawLine drawer;
XAxe axe;
...//инициализация
axe.drawAxe(dc);
...// проверка
И в этом коде никак не пойму куда же нужно приткнуть drawer.
Если так для теста
Код:
XAxe<MockDrawLine> axe(&drawer);
, то для приложения ...?
Если
Код:
axe.drawAxe(dc, &drawer);
, то вопрос, каким образом я задам рисовалищика линий переносится на позже, но все равно в конце концов вылазит, а именно как записать вызов полного рисования оси?
Код:
axe.draw(dc, &lineDrawer, &scalePointDrawer)
?
Аналогично для третьего и четвертого пункта. Напрашивается введение ScalePointDrawer и ScalePointsDrawer. Тестирование в таком случае чрезвычайно упрощается, но как потом все это объединить?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 29-09-2006 15:59 » 

а зачем всё так сложно? Улыбаюсь

1) нарисовал одну ось
2) вторую
3) в цикле - нарисовал деления по одной оси
4) по второй

1...4 - это блок, рисующий систему координат. И ничего не надо придумывать Улыбаюсь

далее - рисуется информация, как нужно

Или я чего-то не понял?
Записан

ysv_
Помогающий

ua
Offline Offline

« Ответ #2 : 29-09-2006 16:23 » 

Так интересно сделать полностью по технологии сначала тест потом код (Test Driven Development). Один раз нужно понять как сделать, а потом можно использовать и в других случаях. Очень удобно, когда позже необходимо вносить изменения. Сразу видно где напортачил. Для логики приложения я TDD использовал, но там в основном шло через интерфейсы, здесь захотел через шаблоны (быстрее будет работать и проще релизовать (по идее)). Но вот не особо пока получается.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 29-09-2006 16:25 » 

ysv_, с твоим подходом тормозить будет всё Улыбаюсь

что проще, чем я предложил? Накосячить - негде, отладить - несложно, параметры переменные придумать туда - тоже вроде несложно... И передать их как аргуметнты
Записан

ysv_
Помогающий

ua
Offline Offline

« Ответ #4 : 29-09-2006 16:54 » 

Алексей, конечно твой подход проще. Но! Пока в этот код не потребуется вносить изменения. Например: сделал я подписи центрированные по центру делений, а теперь нужно еще и вариант для размещения подписей между деления (по центру). Начинаем править, где-то ошибся. Так в твоем случае, я должен запускать програму, смотреть где один вариант подписей, где второй все ли хорошо, данные разные повводить.
А в моем случае внес изменения, запустил тесты, все ли работает ОК. Значительно большая часть ошибок вылавливается еще на этапе написания тестов и их запуска практически на автомате.
А придуманное решения для этого случая, потом можно будет использовать и для других случаев.
Вот бы dimka отозвался. Как я понял они у себя на работе используют подобные методы (тестирование с использованием шаблонов). Может подкинет умную мысль Улыбаюсь
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #5 : 29-09-2006 18:25 » 

ysv_, на самом деле твой подход правильный - если раситываешь на длительный прект с потенциальными изменениями, то такой подход ИМХО единственно верный. Ессно, что он и сложней гораздо. Поэтому и ответить просто и быстро, подкинуть советик другой - не получится. Для это надно ооочень хорошо знать специфику модуля, примерную область его использования. Попытайся упростить вопрос, или разбей его на подвопросы. Пока из твоего первого топика я ничего не понял - у тебя проблемы с написанием тестового сценария? Или техническая реализация? Или у тебя проблемы с темплейтами? Не забывай - ты работаешь над проблемой уже некоторое время, некоторые моменты для тебя ясны и естесственны. Но к сожалению это не для всех так.
Так что если на реальную помощь расчитываешь, то давай от простого к сложному.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ysv_
Помогающий

ua
Offline Offline

« Ответ #6 : 03-10-2006 09:27 » 

Разбил задачу на части и у меня получается, что проще тестировать, если проверять не XAxe, а отдельно LineDrawer - класс (или функция) отвечающий за черчение линий, ScalePointDrawer - чертит одно деление, ScalePointsDrawer - чертит все деления.
XAxe использует LineDrawer и ScalePointsDrawer;
ScalePointsDrawer - ScalePointDrawer,
ScalePointDrawer - LineDrawer.
При создании объекта любого из трех вышеуказанных классов (XAxe, ScalePointsDrawer & ScalePointDrawer) необходимо обеспечить передачу объектов используемых классов (LineDrawer, ScalePointsDrawer, ScalePointDrawer).
При этом хочется, чтобы LineDrawer - представлял собой функцию, а MockLineDrawer - функтор.
Варианты передачи, которые я знаю:
1. Через указатель на интерфейс XAxe(LineDrawerI*) - не подходит. (Опускаю для XAxe второй параметр с целью упрощения записи).
2.  Как член темплейтного класса:
  template <class LineDrawerT> XAxe {...; LineDrawerT mLineDrawer; ...}; - не соображу как сделать если тип-параметр может быть и функцией и функтором.
3. Через наследование от темплейтного параметра:
  template <class LineDrawerT> XAxe: public LineDrawerT - 100% не подходит.

Вот собственно и вопрос, каким образом, исполузуя второй вариант задания LineDrawer для XAxe, обеспечить, чтобы его можно было использовать как сфункцией так и с функтором. У меня пока не получается Жаль
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines