Здравствуйте читатели.
Александр любезно предоставил мне "площадку" для понимания TDD.
Постижение написания кода через тестирование под руководством опытного наставника... Что может быть приятней :).
Небольшая преамбула:
18 февраля Всеволод Леонов предложил Александру показать каким образом приложение которое не задумывалось для тестирования превратить в full-testable system.
Приложением для примера был выбран обычный калькулятор:Проект был банален до невозможности, 4 кнопки 3 Edit.
Вводную часть Александр описал здесь. Вкратце его мысль заключалась в том что до изменений архитектуры, нам необходимо покрыть приложение тестами.
Первым делом добавляем к приложению тесты(DUnit), детали описаны здесь.
Следующим шагом Александр "посещает форму, присваивает 2 значения Едитам и проверяет кнопку Плюс".
Третий этап означал расширение тестов от одной операции(Плюс) до покрытия всех кнопок. Александр при этом выделил абстрактный класс - TOperationTest. В комментариях к этому посту развернулась довольно интересная дискуссия по поводу выделения абстрактного класса, зачем и почему читатели узнают из будущих постов :)
В четвертом посте Александр выделил класс "бизнес-логики" - TCalculator, в котором находятся функции для расчета всех операций калькулятора.
Ну а сегодня мы обсудим тестирование логики нашего приложения.
После изменений архитектуры мы можем протестиорвать непосредственно "логику приложения". Поэтому. Самый простой способ сделать это сейчас это написать класс TCalculatorOperation отнаследованный от TTestCase и проверить все операции. Я правда ещё и проверил ошибочность выполнения в одной из операций. Но я думаю что если читателям будет интересно то эту тему мы обсудим в комментариях.
Собственно код:
unit CalculatorOperationTest;
interface
uses
TestFrameWork,
Calculator
;
type
TCalculatorOperationTest = class(TTestCase)
published
procedure LogicTestDiv;
procedure LogicTestMul;
procedure LogicTestAdd;
procedure LogicTestSub;
procedure LogicTestSubError;
end;//TCalculatorOperationTest
implementation
uses
SysUtils;
const
cA = '5';
cB = '10';
{ TCalculatorOperationTest }
procedure TCalculatorOperationTest.LogicTestDiv;
var
x1, x2 : string;
result : Single;
begin
x1:= cA;
x2:= cB;
result := StrToFloat(TCalculator.Divide(x2, x1));
CheckTrue(2 = result);
end;
procedure TCalculatorOperationTest.LogicTestSub;
var
x1, x2 : string;
result : Single;
begin
x1:= cA;
x2:= cB;
result := StrToFloat(TCalculator.Sub(x2, x1));
CheckTrue(5 = result);
end;
procedure TCalculatorOperationTest.LogicTestSubError;
var
x1, x2 : string;
result : Single;
begin
x1:= cA;
x2:= cB;
result := StrToFloat(TCalculator.Sub(x2, x1));
CheckFalse(7 = result);
end;
procedure TCalculatorOperationTest.LogicTestMul;
var
x1, x2 : string;
result : Single;
begin
x1:= cA;
x2:= cB;
result := StrToFloat(TCalculator.Mul(x2, x1));
CheckTrue(50 = result);
end;
procedure TCalculatorOperationTest.LogicTestAdd;
var
x1, x2 : string;
result : Single;
begin
x1:= cA;
x2:= cB;
result := StrToFloat(TCalculator.Add(x2, x1));
CheckTrue(15 = result);
end;
initialization
TestFramework.RegisterTest(TCalculatorOperationTest.Suite);
end.
Таким образом мы ушли от "тестирования GUI" к тестированию "бизнес логики".
upd1. Залил исходнки на BitBucket.

use lambda, Luke
ОтветитьУдалитьGive me example, Father...
Удалитьhttp://ru.wikipedia.org/wiki/KISS_(%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF)
Удалитьлямбды Вы даже может и правы.
Удалитьтолько "бежите впереди паровоза"
и пихать их везде где возможно, не знаю...
http://habrahabr.ru/post/153225/
p.s.
В статье я писал "Самый простой способ". Или Вы по диагонали читаете ?
>Give me example, Father...
УдалитьСтарый пример на хаскеле: http://pastebin.com/RwkA2CTA
(на дельфи не пишу, но и лямбды и функции первого класса современный дельфи умеет)
>KISS
А что может быть проще одной функции?
>В статье я писал "Самый простой способ". Или Вы по диагонали читаете ?
с лямбдами проще же. Не стоит забывать про принцип DRY. =)
"Старый пример на хаскеле: http://pastebin.com/RwkA2CTA"
Удалить-- точно "по-диагонали" читаете...
"с лямбдами проще же"
Удалить-- в КАКОМ месте и ЧТО упрощать? Пальцем ткните, нам, недоумкам.
"DRY"
Удалить-- в КАКОМ месте примера было "повторение себя" или "по-русски" говоря "техника Cut'N'Paste"??
Можно увидеть?
> в КАКОМ месте примера было "повторение себя" или "по-русски" говоря "техника Cut'N'Paste"??
ОтветитьУдалитьсравните описанные процедуры тестирования.
>точно "по-диагонали" читаете...
поясните