Вот тут - http://programmingmindstream.blogspot.ru/2014/02/blog-post_15.html я попытался расписать "алгоритм" тестирования "нетестируемой" архитектуры и то как привести её к "тестируемой".
Давайте зайдём с другой стороны.
Пусть у нас есть "в принципе нетестируемое приложение".
Давайте рассмотрим "САМЫЙ УЖАСНЫЙ" случай.
Всё делается в "обработчике" OnClick на ФОРМЕ и при этом ОБРАБАТЫВАЮТСЯ ДАННЫЕ из БД.
А именно:
Оно - МОНОЛИТНОЕ и работающее с DataSet'ами на форме.
Примерно так:
Давайте протестируем его:
Немного изменим код проекта:
Добавим тест:
Мысль понятна?
Как писать CompareWithEtalon?
Как найти "ту самую" TMainForm?
Как обеспечить "повторяемость" теста?
Как обеспечить "состояние базы"?
Это - ВОПРОСЫ - ДА.
Они - ОБСУЖДАЕМЫ!
Но!
Приложение ведь ПЕРЕСТАЛО быть "нетестируемым"?
Не так ли?
ВОПРОСЫ - ЕСТЬ.
Много вопросов.
Но!
Они - обсуждаемы.
По "ходу пьесы".
Но они "обсуждаемы" уже не АБСТРАКТНО - "а что делать когда всё плохо", а вполне - КОНКРЕТНО, в виде - "а что делать если есть ТАКАЯ КОНКРЕТНАЯ проблема".
Надеюсь, что я обрисовал ещё "один из путей" - как тестировать "нетестируемое приложение".
И как "оторваться от "коня в вакууме"".
P.S. Понятное дело, что "это" самый что ни на есть "белый ящик". Но надо же С ЧЕГО-ТО НАЧИНАТЬ! За неимением "горничной"...
P.P.S. Ну и понятное дело, что ТУТ речь не идёт ни о "GUI-тестах", ни о "комплексных" тестах, ни ТЕМ БОЛЕЕ об "атомарных". Тут речь идёт ЛИШЬ о том, как написать "хоть какой-нибудь" тест. Типа - "с чего начать". Как ИНФРАСТРУТУРУ "выращивать".
Напишете десяток таких "кривых, косых и непонятных" тестов - дальше "дело пойдёт легче". Я ПРАКТИЧЕСКИ УВЕРЕН в этом. :-)
Дальше начнёте рефакторить и тесты и код. Избавляясь от "кривизны" и "Cut'n'Paste".
И дело "само пойдёт".
И со временем будет "правильные" тесты:
1. "Атомарные".
2. "Комплексные".
3. Регрессионные.
4. GUI.
А таких "кривых и косых" - НЕ ОСТАНЕТСЯ.
ГЛАВНОЕ - НАЧАТЬ!
Хоть "с чего-нибудь".
P.P.P.S. Понятное дело, что САМОЕ СЛОЖНОЕ если по ButtonClick "вдруг" поднимется МОДАЛЬНЫЙ ДИАЛОГ. Это тоже - ВОПРОС. Который МОЖНО и НУЖНО обсуждать.
Но это уже - ВОПРОС, а не "конь в вукууме".
P.P.P.P.S. Вот тут - http://programmingmindstream.blogspot.ru/2014/02/anemicdomainmodel.html?showComment=1392717297690#c4055365633171954826 - мне "бросили вызов" :-) Я его - ПРИНИМАЮ :-)
Всеволод прислал мне проект, который предстоит протестировать.
Сам проект пока лежит вот тут - https://dl.dropboxusercontent.com/u/60632578/DummyCalculator.zip тесты же к нему я буду публиковать в блоге.
Давайте зайдём с другой стороны.
Пусть у нас есть "в принципе нетестируемое приложение".
Давайте рассмотрим "САМЫЙ УЖАСНЫЙ" случай.
Всё делается в "обработчике" OnClick на ФОРМЕ и при этом ОБРАБАТЫВАЮТСЯ ДАННЫЕ из БД.
А именно:
Оно - МОНОЛИТНОЕ и работающее с DataSet'ами на форме.
Примерно так:
type TMainForm = class(TForm) DataSet: TDataSet; Grid: TGrid; Button: TButton; Label: TLabel; end;//TMainForm procedure TMainForm.ButtonClick(aSender: TObject); begin Label.Caption := Grid.SomeRow.SomeCalculations; end; ... begin Application.CreateForm(TMainForm, MainForm); Application.Run; end.
Давайте протестируем его:
Немного изменим код проекта:
... begin Application.CreateForm(TMainForm, MainForm); GUITestRunner.TGuiTestRunnerForm.Create(Application); // - тут мы вставили окно с "запускалкой тестов" Application.Run; end.
Добавим тест:
unit MyTest; interface uses TestFramework; type TMyTest = class(TTestCase) published procedure DoIt; end;//TMyTest implementation uses MainForm // - ДА ТУТ мы ЗНАЕМ про ГЛАВНУЮ форму приложения ; procedure TMyTest.DoIt; var l_Form : TForm; begin for l_Form in Screen.ActiveForms do if (l_Form Is TMainForm) then begin TMainForm(l_Form).Button.Click; l_Text := TMainForm(l_Form).Label.Caption; CompareWithEtalon(l_Text); break; end;//l_Form Is TMainForm end; initialization TestFramework.RegisterTest(TMyTest);
Мысль понятна?
Как писать CompareWithEtalon?
Как найти "ту самую" TMainForm?
Как обеспечить "повторяемость" теста?
Как обеспечить "состояние базы"?
Это - ВОПРОСЫ - ДА.
Они - ОБСУЖДАЕМЫ!
Но!
Приложение ведь ПЕРЕСТАЛО быть "нетестируемым"?
Не так ли?
ВОПРОСЫ - ЕСТЬ.
Много вопросов.
Но!
Они - обсуждаемы.
По "ходу пьесы".
Но они "обсуждаемы" уже не АБСТРАКТНО - "а что делать когда всё плохо", а вполне - КОНКРЕТНО, в виде - "а что делать если есть ТАКАЯ КОНКРЕТНАЯ проблема".
Надеюсь, что я обрисовал ещё "один из путей" - как тестировать "нетестируемое приложение".
И как "оторваться от "коня в вакууме"".
P.S. Понятное дело, что "это" самый что ни на есть "белый ящик". Но надо же С ЧЕГО-ТО НАЧИНАТЬ! За неимением "горничной"...
P.P.S. Ну и понятное дело, что ТУТ речь не идёт ни о "GUI-тестах", ни о "комплексных" тестах, ни ТЕМ БОЛЕЕ об "атомарных". Тут речь идёт ЛИШЬ о том, как написать "хоть какой-нибудь" тест. Типа - "с чего начать". Как ИНФРАСТРУТУРУ "выращивать".
Напишете десяток таких "кривых, косых и непонятных" тестов - дальше "дело пойдёт легче". Я ПРАКТИЧЕСКИ УВЕРЕН в этом. :-)
Дальше начнёте рефакторить и тесты и код. Избавляясь от "кривизны" и "Cut'n'Paste".
И дело "само пойдёт".
И со временем будет "правильные" тесты:
1. "Атомарные".
2. "Комплексные".
3. Регрессионные.
4. GUI.
А таких "кривых и косых" - НЕ ОСТАНЕТСЯ.
ГЛАВНОЕ - НАЧАТЬ!
Хоть "с чего-нибудь".
P.P.P.S. Понятное дело, что САМОЕ СЛОЖНОЕ если по ButtonClick "вдруг" поднимется МОДАЛЬНЫЙ ДИАЛОГ. Это тоже - ВОПРОС. Который МОЖНО и НУЖНО обсуждать.
Но это уже - ВОПРОС, а не "конь в вукууме".
P.P.P.P.S. Вот тут - http://programmingmindstream.blogspot.ru/2014/02/anemicdomainmodel.html?showComment=1392717297690#c4055365633171954826 - мне "бросили вызов" :-) Я его - ПРИНИМАЮ :-)
Всеволод прислал мне проект, который предстоит протестировать.
Сам проект пока лежит вот тут - https://dl.dropboxusercontent.com/u/60632578/DummyCalculator.zip тесты же к нему я буду публиковать в блоге.
Комментариев нет:
Отправить комментарий