вторник, 18 февраля 2014 г.

Как тестировать "вообще нетестируемое"

Вот тут - http://programmingmindstream.blogspot.ru/2014/02/blog-post_15.html я попытался расписать "алгоритм" тестирования "нетестируемой" архитектуры и то как привести её к "тестируемой".

Давайте зайдём с другой стороны.

Пусть у нас есть "в принципе нетестируемое приложение".

Давайте рассмотрим "САМЫЙ УЖАСНЫЙ" случай.

Всё делается в "обработчике" 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 тесты же к нему я буду публиковать в блоге.

Комментариев нет:

Отправить комментарий