понедельник, 24 февраля 2014 г.

Тестируем калькулятор №4. Меняем архитектуру приложения

Предыдущая серия была тут - http://programmingmindstream.blogspot.ru/2014/02/3.html

Продолжим наши посты.

Все исходники доступны тут - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/DraftsAndScketches/SomeTestProjects/DummyCalculator/Chapter4/

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

В этом допущении теперь можно поговорить об ИЗМЕНЕНИИ архитектуры приложения.

Введём "бизнес-класс" TCalculator в который соберём бизнес-логику приложения.

Вот он:

unit Calculator;

interface

type
 TCalculator = class
  public
   class function Add(const A, B: string): string;
   class function Sub(const A, B: string): string;
   class function Mul(const A, B: string): string;
   class function Divide(const A, B: string): string;
 end;//TCalculator

implementation

uses
  SysUtils
  ;

class function TCalculator.Add(const A, B: string): string;
var
  x1, x2, x3 : single;
begin
  x1 := StrToFloat(A);
  x2 := StrToFloat(B);
  x3 := x1 + x2;
  Result := FloatToStr(x3);
end;

class function TCalculator.Sub(const A, B: string): string;
var
  x1, x2, x3 : single;
begin
  x1 := StrToFloat(A);
  x2 := StrToFloat(B);
  x3 := x1 - x2;
  Result := FloatToStr(x3);
end;

class function TCalculator.Mul(const A, B: string): string;
var
  x1, x2, x3 : single;
begin
  x1 := StrToFloat(A);
  x2 := StrToFloat(B);
  x3 := x1 * x2;
  Result := FloatToStr(x3);
end;

class function TCalculator.Divide(const A, B: string): string;
var
  x1, x2, x3 : single;
begin
  x1 := StrToFloat(A);
  x2 := StrToFloat(B);
  x3 := x1 / x2;
  Result := FloatToStr(x3);
end;

end.

Теперь код главной формы проекта становится таким:

unit MainForm;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TfmMain = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  fmMain: TfmMain;

implementation

uses
  Calculator
  ;

{$R *.dfm}

procedure TfmMain.Button1Click(Sender: TObject);
begin
 Edit3.Text := TCalculator.Add(Edit1.Text, Edit2.Text);
end;

procedure TfmMain.Button2Click(Sender: TObject);
begin
 Edit3.Text := TCalculator.Sub(Edit1.Text, Edit2.Text);
end;

procedure TfmMain.Button3Click(Sender: TObject);
begin
 Edit3.Text := TCalculator.Mul(Edit1.Text, Edit2.Text);
end;

procedure TfmMain.Button4Click(Sender: TObject);
begin
 Edit3.Text := TCalculator.Divide(Edit1.Text, Edit2.Text);
end;

end.

Прогоняем наши тесты. Они - проходят.

Что выходит? Мы БЕЗБОЛЕЗНЕННО изменили архитектуру приложения и протестировали, что "ничего" не сломалось.

Идея понятна?

Мы СНАЧАЛА обеспечили "минимальное тестовое покрытие" ВСЕХ прецедентов использования приложения. А ТОЛЬКО ПОТОМ - поменяли его архитектуру.

Выделили класс с "бизнес-логикой". И проверили, что "НИЧЕГО не сломалось".

Почему МИНИМАЛЬНОЕ, потому что там "есть вопросы". Например со случайными данными - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/DraftsAndScketches/SomeTestProjects/DummyCalculator/Chapter4/Tests/GUI/RandomPlusTest.pas

"Почему" и "что" - мы ПОЗЖЕ обсудим.

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

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

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