Предыдущая серия была тут - http://programmingmindstream.blogspot.ru/2014/02/3.html
Продолжим наши посты.
Все исходники доступны тут - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/DraftsAndScketches/SomeTestProjects/DummyCalculator/Chapter4/
Будем считать, что мы "обеспечили минимальное тестовое покрытие" всех прецедентов использования нашего приложения.
В этом допущении теперь можно поговорить об ИЗМЕНЕНИИ архитектуры приложения.
Введём "бизнес-класс" TCalculator в который соберём бизнес-логику приложения.
Вот он:
Теперь код главной формы проекта становится таким:
Прогоняем наши тесты. Они - проходят.
Что выходит? Мы БЕЗБОЛЕЗНЕННО изменили архитектуру приложения и протестировали, что "ничего" не сломалось.
Идея понятна?
Мы СНАЧАЛА обеспечили "минимальное тестовое покрытие" ВСЕХ прецедентов использования приложения. А ТОЛЬКО ПОТОМ - поменяли его архитектуру.
Выделили класс с "бизнес-логикой". И проверили, что "НИЧЕГО не сломалось".
Почему МИНИМАЛЬНОЕ, потому что там "есть вопросы". Например со случайными данными - https://sourceforge.net/p/rumtmarc/code-0/HEAD/tree/trunk/Blogger/DraftsAndScketches/SomeTestProjects/DummyCalculator/Chapter4/Tests/GUI/RandomPlusTest.pas
"Почему" и "что" - мы ПОЗЖЕ обсудим.
Пока же смотрите на то, что есть. Надеюсь, что это будет вам полезно.
Продолжим наши посты.
Все исходники доступны тут - 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
"Почему" и "что" - мы ПОЗЖЕ обсудим.
Пока же смотрите на то, что есть. Надеюсь, что это будет вам полезно.
Комментариев нет:
Отправить комментарий