Re[5]: Порка: TestMeCode.com
От: Аноним  
Дата: 16.02.19 16:43
Оценка:
Здравствуйте, swame, Вы писали:

S>Просто склонировать 20 — летнего возраста опенсорсный продукт, а теперь еще просить за него деньги — я в недоумении.


Брррр, Вы о чем?
Вы тестированием занимались?
DUnit пользовались? Тесты САМИ делали?
Много общего?
Единственное, что на мой взгляд общего это фраза: "тестирование units" — Все!!!
В TestCode нет не только не одной строчки, даже символа из DUnit.
Но то, что для меня самое важно и почему я написал этот продукт и пользуюсь сам уже очень много лет, это то что он создан абсолютно по другим принципам.
И если Вы занимались тестированием, это сразу видно.
Я этот продукт делал в первую очередь для себя.
И написал его т.к. как раз DUnit и другие продукты тестирования, на тот момент, мне не давали тех возможностей, которые я хотел.
Где Вы там нашли обшее с DUnit я не представляю.
И тем более, на каком основании обвинять в плагиате, основываясь только на том, что продукт тоже тестирует код?

Так что могу процитировать Вас самих:
S> — я в недоумении.



Vladimir Garamzin
Отредактировано 16.02.2019 16:45 Garamzin . Предыдущая версия . Еще …
Отредактировано 16.02.2019 16:44 Garamzin . Предыдущая версия .
Re[6]: Порка: TestMeCode.com
От: swame  
Дата: 16.02.19 19:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, swame, Вы писали:


S>>Просто склонировать 20 — летнего возраста опенсорсный продукт, а теперь еще просить за него деньги — я в недоумении.


А>Вы тестированием занимались?


Занимался и продолжаю. Но я не тестер.

А>DUnit пользовались? Тесты САМИ делали?


Тесты для DUnit САМ делал

А>Много общего?


Принцип идентичный. Реализации разные.

А>Единственное, что на мой взгляд общего это фраза: "тестирование units" — Все!!!

А>В TestCode нет не только не одной строчки, даже символа из DUnit.

Верю.

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

А>И если Вы занимались тестированием, это сразу видно.

А>Я этот продукт делал в первую очередь для себя.


Так уже есть еще хоть 1 пользователь?

А>И написал его т.к. как раз DUnit и другие продукты тестирования, на тот момент, мне не давали тех возможностей, которые я хотел.


Каких конкретно таких что было легче сделать свой продукт чем немножко допилить имеющийся?

А>Где Вы там нашли обшее с DUnit я не представляю.


Вижу только 2 различия
1. Движок тестирования вынесен в отдельное приложение — но это только недостаток.
2. Несколько более удобный синтаксис записи тестов по сравнению с DUnit.
Этого можно было бы достичь хелпером на несколько десятков строк.

Про отладочные сообщения ничего не говорю — это вообще отдельный продукт, непонятно зачем он объединен c юнит тестированием.
Известный, но несравнимо более зрелый аналог — CodeSite.

А>И тем более, на каком основании обвинять в плагиате, основываясь только на том, что продукт тоже тестирует код?


Ни в коем случае не обвиняю в плагиате — ведь не обвиняют же друг друга разработчики разных компиляторов С.

А>Так что могу процитировать Вас самих:

S>> — я в недоумении.
А>


А>Vladimir Garamzin
Re[9]: Порка: TestMeCode.com
От: icezone  
Дата: 16.02.19 22:46
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Ну, любая немецкая машина к пенсии превращается в Опель Может просто у тебя ожидания завышены?


нет, когда речь идет о пятизначной сумме, мои ожидания вполне объяснимы

bnk>Imho, писателям опенсорсных библиотек, у которых есть заметное комьюнити, памятники надо ставить а не критиковать.


я опенсорс уже давно избегаю, основные претензии к коммерческим продуктам

bnk>Код, который "обнять и плакать", не так уж и часто попадается..


у меня ниша узкая, поэтому выбор невелик
Re[7]: Порка: TestMeCode.com
От: Garamzin  
Дата: 17.02.19 07:56
Оценка:
Здравствуйте, swame, Вы писали:

А>>DUnit пользовались? Тесты САМИ делали?

S>Тесты для DUnit САМ делал

Очень хорошо!
Попробуйте только на одну функцию сделать тест с помощью TestCode и сравнить с DUnit.
Если Вы регулярно делайте тесты, Вы увидите отличие.
Кроме этого 100 параметров, без покупки, вполне хватит для тестирования небольшого приложения.
Для полного, профессионального тестирования это конечно же мало, так как тесты в дальнейшем накладываются на все и вся.
Но для ознакомления или на первом этапе, вполне хватит.
Re[8]: Порка: TestMeCode.com
От: swame  
Дата: 17.02.19 09:04
Оценка:
Здравствуйте, Garamzin, Вы писали:

G>Здравствуйте, swame, Вы писали:


А>>>DUnit пользовались? Тесты САМИ делали?

S>>Тесты для DUnit САМ делал

G>Очень хорошо!

G>Попробуйте только на одну функцию сделать тест с помощью TestCode и сравнить с DUnit.
G>Если Вы регулярно делайте тесты, Вы увидите отличие.
G>Кроме этого 100 параметров, без покупки, вполне хватит для тестирования небольшого приложения.
G>Для полного, профессионального тестирования это конечно же мало, так как тесты в дальнейшем накладываются на все и вся.
G>Но для ознакомления или на первом этапе, вполне хватит.

Вот пример типичного рутинного теста из моего кода сложнее калькулятора.
Как бы он выглядел в вашей системе?
Насколько проще?
Хотя бы на 20%?
Ладно, на 10%?

  Код 1

function TTestBlocking.FindBlocking (const ABlockedKey, ABlockingKey, Msg: string;
  var VBlocked, VBlocking: TVectorView; bExists : boolean = true): TBlockingInfo;
begin
  VBlocked :=  (Scheme.FindLUni (ABlockedKey)  as TNamedBlock).VOwnerFirst as TVectorView;
  VBlocking := (Scheme.FindLUni (ABlockingKey) as TNamedBlock).VOwnerFirst as TVectorView;
  CheckTrue (Assigned (VBlocked)); CheckTrue (Assigned (VBlocking), Msg + '.0');
  Result := GetBlockingInfo(Scheme).FindBindingByID (VBlocked.TechMain.RTID, VBlocking.TechMain.RTID) as TBlockingInfo;
  CheckTrue (Assigned (Result)= bExists, Msg + '.1');
end;

procedure TTestBlocking.TestBlocked (Bi: TBlockingInfo; const Msg: string;
  BlockedBlocked, BlockingBlocked: boolean);
var
  B : boolean;
begin
  //B := BI.BlkisBlocked;
  B := BI.IsViewLocked2(nil, BI.FirstLink.Obj as TNamedBlock, DevNull_Str);
  CheckTrue ( B = BlockedBlocked, Msg + '.1\');

  //B := BI.CtlisBlocked;
  B := BI.IsViewLocked2(nil, BI.SecondLink.Obj as TNamedBlock, DevNull_Str);
  CheckTrue ( B = BlockingBlocked, Msg + '.2');

end;

procedure TTestBlocking.Test_Imer_CreateBlockingsWikat;
var
  VC : array [0..3] of TVectorView;
  LB : TBlockingInfo;
begin
  OpenFile (1);
  {выкатной выключатель}
  LB := FindBlocking ('ПС_Имелетинская_ЗН_КЛ_10_кВ__Им206', 'ПС_Имелетинская_В_10_кВ_Им206',
                      'Test_CreateBlockings 2.1');
  TestBlocked (LB, 'Test_CreateBlockings 2.1.11', true, false);
  CheckIs(LB.ControlItemT.View, TWiklWid, 'Test_CreateBlockings 2.1.12');

  (LB.ControlItemT.View as TWiklWid).TrolleyState := tsService;
  try
    TestBlocked (LB, 'Test_CreateBlockings 2.1.13', false, false);
  finally
    (LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
  end;
  {}

  LB := FindBlocking ('ПС_Имелетинская_ЗН_СВ-43_10_кВ', 'ПС_Имелетинская_СВ_43_10_кВ',
                      'Test_CreateBlockings 2.2');
  TestBlocked (LB, 'Test_CreateBlockings 2.2.11', true, false);
  CheckIs(LB.ControlItemT.View, TWiklWid, 'Test_CreateBlockings 2.2.12');
  VC[0] := (Scheme.FindLUni ('#1142\\\Схема\СП 3 С СВ 43 10 кВ') as TnamedBlock).VrepFirst as TVectorView;

  (LB.ControlItemT.View as TWiklWid).TrolleyState := tsService;
  (VC[0] as TShassi).TrolleyState := tsService;
  try
    TestBlocked (LB, 'Test_CreateBlockings 2.2.13.1', false, false);
  finally
    (LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
    (VC[0] as TShassi).TrolleyState := tsWork;
  end;

  {На секции 6-10 кВ если для ячеек потребителей не создавать блок с ЗН на секции}
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_1_С_Т-1',
                      'Test_CreateBlockings 2.3.1', true);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', '#1143\\\Схема\полушасси[1]',
                      'Test_CreateBlockings 2.3.2', true);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', '#1141\\\Схема\СП 1 С СВ 21 10 кВ',
                      'Test_CreateBlockings 2.3.3', true);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_ТСН-1',
                      'Test_CreateBlockings 2.3.4', true);

  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им101',
                      'Test_CreateBlockings 2.3.5', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им103',
                      'Test_CreateBlockings 2.3.6', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им105',
                      'Test_CreateBlockings 2.3.7', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им107',
                      'Test_CreateBlockings 2.3.8', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им109',
                      'Test_CreateBlockings 2.3.9', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им111',
                      'Test_CreateBlockings 2.3.10', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им113',
                      'Test_CreateBlockings 2.3.11', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им115',
                      'Test_CreateBlockings 2.3.12', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_ДГР-1',
                      'Test_CreateBlockings 2.3.13', false);

  {блокировка с тележкой автомата}
  LB := FindBlocking ('ПС_Имелетинская_ЗН_КЛ_10_кВ_ТСН-2', 'ПС_Имелетинская_АВ_0,4_кВ_ТСН-2',
                      'Test_CreateBlockings 2.4.1', true);

  {блокировк c  ВКЛ только рядом расположенного }
  LB := FindBlocking ('ПС_Имелетинская_ЗН_БСК-1', 'ПС_Имелетинская_В_10_кВ_БСК-1',
                      'Test_CreateBlockings 2.4.1', false);

end;


  Код 2
unit Protokol_Test;

interface

uses
  SysUtils, math,
  TestFramework, TypeViewsBuilder, SDETask3, SDETask.Run, Blank.Constant, Blank.Operation;

type
  TTestProtokol = class(TTestCase)
  private
    B: TViewsBuilder;
    procedure Setup10;
  protected
    procedure SetUp; override;
    procedure TearDown; override;
    function Task: TSDETaskRun;
    function Protokol: TSDETask;
    function MergedProtokol: TSDETask;
    function PrintAStatus (const A: array of TScheduleStatus): string;
    function PrintAсts (const A: array of integer): string;
    function PrintTask (ATask: TSDETask): string;
    procedure CheckMaxRate (Rate: integer);
    procedure CheckRate (Rate: integer);
    procedure CheckProtokol (Acts: array of integer; Schedule: array of TScheduleStatus; MaxRate, Rate: integer);
  public
    procedure AddCommand (ATask: TSDETask; Acts: array of integer); overload;
    function AddCommand (ATaskNode: TTaskNode; Act: integer): TSDEOperation3; overload;
    function AddAltNode (AlterOrder: TAlterOrder): TAltTaskNode;
    procedure RenderTask (ATask: TSDETask);
    procedure CheckCommand (ATask: TSDETask; Acts: array of integer);
    procedure CheckSchedule (ATask: TSDETask; Acts: array of TScheduleStatus);
    procedure CheckInvertCount (ATask: TSDETask; N: integer; Up: boolean; Cnt: integer);
  published
    procedure Test_Normal;
    procedure Test_Miss_1;
    procedure Test_Miss_3;
    procedure Test_Miss_4;
    procedure Test_Unecessary_1;
    procedure Test_Unecessary_2;
    procedure Test_Replace;
    procedure Test_Repeat;
    procedure Test_Other;
    procedure Test_Groups;
    procedure Test_Early_1;
    procedure Test_Early_2;
    procedure Test_Early_4;
    procedure Test_Early_5;
    procedure Test_Alt_Any_1;
    procedure Test_Alt_All_1;
    procedure Test_Alt_Strict_1;
    procedure Test_Alt_Order_1;
    procedure Test_Alt_Alternate_1;
    procedure Test_Alt_Alternate_2;
  end;

const
  N = ssNormal;
  M = ssMiss;
  U = ssUnecessary;
  E = ssEarly;
  L = ssLate;

SScheduleStatus : array [TScheduleStatus] of string = ('N', 'M', 'U', 'E', 'L','M');


implementation

uses
  Common,
  SWApplication, IFaceForms, Views0, Constan, FloatType, PageList, Blanks_Form, Views0.Constant;

{ TTestProtokol }

procedure TTestProtokol.SetUp;
begin
  inherited;
  Setup10;
end;

procedure TTestProtokol.TearDown;
begin
  inherited;

end;

function TTestProtokol.Task: TSDETaskRun;
begin
  //Result := frmBlanksForm.frmBlankEditor.Task as TSDETaskRun;
  Result := Tasks.CurrentTask;
end;

function TTestProtokol.Protokol: TSDETask;
begin
  //Result := (frmBlanksForm.frmBlankEditor.Task as TSDETaskRun).Protokol;
  Result := Tasks.CurrentTask.CheckProtokol;
end;

function TTestProtokol.MergedProtokol: TSDETask;
begin
  //Result := (frmBlanksForm.frmBlankEditor.Task as TSDETaskRun).MergedProtokol;
  Result := Tasks.CurrentTask.CheckMergedProtokol;
end;

procedure TTestProtokol.Test_Normal;
begin
  {совпадает протокол и бланк}
  AddCommand(Task, [1, 2, 3, 4, 5]);
  CheckCommand (Task, [1,2,3,4,5]);
  AddCommand(Protokol, [1, 2, 3, 4, 5]);
  CheckCommand (Protokol, [1,2,3,4,5]);
  Task.LinkProtokol;
  Task.MergeProtokol;
  CheckCommand(MergedProtokol, [1, 2, 3, 4, 5]);
  CheckSchedule (MergedProtokol, [N, N, N, N, N]);
  CheckRate (11111);
  CheckMaxRate (11111);
end;

procedure TTestProtokol.Test_Miss_1;
begin
  AddCommand(Task, [1, 2, 3, 4, 5]);
  AddCommand(Protokol, [2, 3, 4, 5]);
  Task.LinkProtokol;
  Task.MergeProtokol.Render;
  //frmBlanksForm.frmProtokol.RenderBlank(MergedProtokol);
  CheckCommand(MergedProtokol, [1, 2, 3, 4, 5]);
  CheckSchedule(MergedProtokol, [M, N, N, N, N]);
  CheckMaxRate (11111);
  CheckRate (11110);
end;

procedure TTestProtokol.Test_Miss_3;
begin
  AddCommand(Task, [1, 2, 3, 4, 5]);
  {пропущенные действия}
  AddCommand(Protokol, [1, 2, 4, 5]);
  Task.LinkProtokol;
  Task.MergeProtokol.Render;
  //frmBlanksForm.frmProtokol.RenderBlank(MergedProtokol);
  CheckCommand(MergedProtokol, [1, 2, 3, 4, 5]);
  CheckSchedule (MergedProtokol, [N, N, M, N, N]);
  CheckMaxRate (11111);
  CheckRate (11011);
end;

procedure TTestProtokol.Test_Miss_4;
begin
  AddCommand(Task, [1, 2, 3, 4, 5, 1]);
  {пропущенные действия}
  AddCommand(Protokol, [1, 2, 3, 4, 5]);
  Task.LinkProtokol;
  Task.MergeProtokol;
  CheckCommand(Protokol, [1, 2, 3, 4, 5]);
  CheckSchedule (Protokol, [N, N, N, N, N, M]);
  CheckCommand(MergedProtokol, [1, 2, 3, 4, 5, 1]);
  CheckSchedule (MergedProtokol, [N, N, N, N, N, M]);
  CheckMaxRate (11112);
  CheckRate (011111);
end;

procedure TTestProtokol.Test_Unecessary_1;
begin
  AddCommand(Task, [1, 2, 3, 4, 5, 1]);
  {лишние действия}
  AddCommand(Protokol, [1, 2, 3, 4, 5, 6]);
  Task.LinkProtokol;
  Task.MergeProtokol;
  CheckCommand(Protokol, [1, 2, 3, 4, 5, 6]);
  CheckSchedule (Protokol, [N, N, N, N, N, U]);
  CheckCommand(MergedProtokol, [1, 2, 3, 4, 5, 6]);
  CheckSchedule (MergedProtokol, [N, N, N, N, N, U]);
  CheckMaxRate (11112);
  CheckRate (011111);
end;

procedure TTestProtokol.Test_Unecessary_2;
begin
  AddCommand(Task, [1, 2, 3, 4, 5]);
  {лишние действия}
  AddCommand(Protokol, [1, 2, 3, 4, 5, 1]);
  Task.LinkProtokol;
  Task.MergeProtokol;
  CheckCommand(Protokol, [1, 2, 3, 4, 5, 1]);
  CheckSchedule (Protokol, [N, N, N, N, N, U]);
  CheckCommand(MergedProtokol, [1, 2, 3, 4, 5, 1]);
  CheckSchedule (MergedProtokol, [N, N, N, N, N, U]);
  CheckMaxRate (11111);
  CheckRate (11111);
end;

procedure TTestProtokol.Test_Replace;
begin
  AddCommand(Task, [1, 2, 3, 4, 5]);
  {лишние действия}
  AddCommand(Protokol, [1, 2, 6, 4, 5]);
  Task.LinkProtokol;
  Task.MergeProtokol;
  CheckCommand(Protokol, [1, 2, 6, 4, 5]);
  CheckSchedule (Protokol, [N, N, U, N, N]);
  CheckCommand(MergedProtokol, [1, 2, 3, 6, 4, 5]);
  CheckSchedule (MergedProtokol, [N, N, M, U, N, N]);
  CheckMaxRate (11111);
  CheckRate (11011);
end;

procedure TTestProtokol.Test_Repeat;
begin
  AddCommand(Task, [1, 1, 1, 1, 1]);
  {лишние действия}
  AddCommand(Protokol, [1]);
  Task.LinkProtokol;
  Task.MergeProtokol;
  CheckCommand(Protokol, [1]);
  CheckSchedule (Protokol, [N]);
  CheckCommand(MergedProtokol, [1, 1, 1, 1, 1]);
  CheckSchedule (MergedProtokol, [N, M, M, M, M]);
  CheckMaxRate (5);
  CheckRate (1);
end;

procedure TTestProtokol.Test_Other;
begin
  AddCommand(Task, [1, 2, 3, 4, 5]);
  {лишние действия}
  AddCommand(Protokol, [6]);
  Task.LinkProtokol;
  Task.MergeProtokol;
  CheckCommand(Protokol, [6]);
  CheckSchedule (Protokol, [U]);
  CheckCommand(MergedProtokol, [1, 2, 3, 4, 5, 6]);
  CheckSchedule (MergedProtokol, [M, M, M, M, M, U]);
  CheckMaxRate (11111);
  CheckRate (0);
end;

procedure TTestProtokol.Test_Groups;
begin
  AddCommand(Task, [1, 2, 3, 4, 5, 3]);
  {лишние действия}
  AddCommand(Protokol, [1, 2, 4, 5, 3]);
  Task.LinkProtokol;
  Task.MergeProtokol;
  CheckCommand(Protokol, [1, 2, 4, 5, 3]);
  CheckSchedule (Protokol, [N, N, N, N, N]);
  CheckCommand(MergedProtokol, [1, 2, 3, 4, 5, 3]);
  CheckSchedule (MergedProtokol, [N, N, M, N, N, N]);

  AddCommand(Protokol, [1, 2, 3, 4, 5, 3]);
  Task.LinkProtokol;
  Task.MergeProtokol;
  CheckCommand(Protokol, [1, 2, 3, 4, 5]);
  CheckSchedule (Protokol, [N, N, N, N, N]);
  CheckCommand(MergedProtokol, [1, 2, 3, 4, 5, 3]);
  CheckSchedule (MergedProtokol, [N, N, N, N, N, M]);
end;

procedure TTestProtokol.Test_Early_1;
begin
  AddCommand(Task, [1, 2, 3, 4, 5]);
  AddCommand(Protokol, [3, 1, 2, 4, 5]);
  Task.LinkProtokol;
  CheckInvertCount(Protokol, 0, false, 2);
  CheckInvertCount(Protokol, 1, true, 1);
  Task.CalcSchedule;
  CheckSchedule(Protokol, [E, N, N, N, N]);
  CheckMaxRate (11111);
  CheckRate (11011);
end;

procedure TTestProtokol.Test_Early_2;
begin
  AddCommand(Task, [1, 2, 3, 4, 5]);
  AddCommand(Protokol, [1, 3, 2, 4, 5]);
  Task.CalcSchedule;
  CheckSchedule(Protokol, [N, E, N, N, N]);
  CheckMaxRate (11111);
  CheckRate (11011);
end;

procedure TTestProtokol.Test_Early_4;
begin
  AddCommand(Task, [1, 2, 3, 4, 5]);
  AddCommand(Protokol, [1, 2, 4, 3, 5]);
  Task.CalcSchedule;
  CheckSchedule (Protokol, [N, N, E, N, N]);
  Protokol.Render;
  //frmBlanksForm.frmProtokol.RenderBlank(Protokol);
  CheckMaxRate (11111);
  CheckRate (10111);
end;

procedure TTestProtokol.Test_Early_5;
begin
  AddCommand(Task, [1, 2, 3, 4, 5]);
  AddCommand(Protokol, [1, 2, 4, 5, 3]);
  Task.CalcSchedule;
  CheckSchedule (Protokol, [N, N, N, N, L]);
  //frmBlanksForm.frmProtokol.RenderBlank(Protokol);
  Protokol.Render;
  CheckMaxRate (11111);
  CheckRate (11011);
end;

function TTestProtokol.AddAltNode (AlterOrder: TAlterOrder): TAltTaskNode;
var
  AN: TAltTaskNode;
  Op1, Op2: TSDEOperation3;
begin
  Task.Clear;
  AN := Task.Operations.AddNodeN ('AltNode', TAltTaskNode) as TAltTaskNode;
  AN.AlterOrder := AlterOrder;
  Op1 := AddCommand (AN, 1);
  Op1.Rate := 1;

  Op1 := AddCommand (AN, 2);
  Op1.Rate := 10;
  Result := AN;
  Task.Operations.Renumerate;
end;

procedure TTestProtokol.Test_Alt_Any_1;
begin
  AddAltNode (aoAny);

  CheckProtokol ([1, 2], [N, N], 11, 11);
  CheckProtokol ([2, 1], [E, N], 11, 11);
  CheckProtokol ([1], [N], 11, 1);
  CheckProtokol ([2], [N], 11, 10);
end;

procedure TTestProtokol.Test_Alt_All_1;
begin
  AddAltNode (aoAll);

  CheckProtokol ([1, 2], [N, N], 11, 11);
  CheckProtokol ([2, 1], [E, N], 11, 11);
  CheckProtokol ([1], [N], 11, 0);
  CheckProtokol ([2], [N], 11, 0);
end;

procedure TTestProtokol.Test_Alt_Strict_1;
begin
  AddAltNode (aoStrict);

  CheckProtokol ([1, 2], [N, N], 11, 11);
  CheckProtokol ([2, 1], [E, N], 11, 0);
  CheckProtokol ([1], [N], 11, 0);
  CheckProtokol ([2], [N], 11, 0);
end;

procedure TTestProtokol.Test_Alt_Order_1;
begin
  AddAltNode (aoOrder_);
  CheckProtokol ([1, 2], [N, N], 11, 11);
  CheckProtokol ([2, 1], [E, N], 11, 1); //??? или не засчитывать ничего ?
  CheckProtokol ([1], [N], 11, 1);
  CheckProtokol ([2], [N], 11, 10);
end;

procedure TTestProtokol.Test_Alt_Alternate_1;
begin
  AddAltNode (aoAlternate);

  CheckProtokol ([1, 2], [N, N], 10, 10);
  CheckProtokol ([2, 1], [E, N], 10, 10); //??? [N, N] ?
  CheckProtokol ([1], [N], 10, 1);
  CheckProtokol ([2], [N], 10, 10);
end;

procedure TTestProtokol.Test_Alt_Alternate_2;
var
  AN: TAltTaskNode;
  Op1, Op2: TSDEOperation3;
begin
(*
  AddAltNode (aoAlternate);
  Op1 := AddCommand (Task.Operations, 3);
  Op1.Rate := 100;
  Task.Operations.Renumerate;

  CheckProtokol ([1, 2], [N, N], 10, 10);
  CheckProtokol ([2, 1], [E, N], 10, 10); //??? [N, N] ?
  CheckProtokol ([1], [N], 10, 1);
  CheckProtokol ([2], [N], 10, 10);


  AN := Task.Operations.AddNodeN ('AltNode', TAltTaskNode) as TAltTaskNode;
  AN.AlterOrder := AlterOrder;
  Op1 := AddCommand (AN, 1);
  Op1.Rate := 1;

  Op1 := AddCommand (AN, 2);
  Op1.Rate := 10;
  Result := AN;
  Task.Operations.Renumerate;
*)
end;

procedure TTestProtokol.Setup10;
var
  i: Integer;
  sdef: ISDEF;
  V: TVectorView;
  B: TViewsBuilder;
  P: TPageList;
begin
  sdef := App.SDEF(App.MainDoc);
  sdef.Clear;
  P := sdef.GetSchemeSet.ListWN[0];
  sdef.GetSchemeBox.Data := P;
  B := TViewsBuilder.Create(P, sdef.GetSchemeBox);
  for i := 0 to 10 do
  begin
    V := B.AddView(tcWikl, FloatPoint(i * 5 + 10, 10), 0);
    with V.CreateSubscript do
    begin
      SubscriptName := IntToStr(V.Tag);
      SubscriptPosition := pBottom;
    end;
    //SubscriptColor.RGBColor := VViolet;
  end;
  B.Free;
end;

function TTestProtokol.AddCommand (ATaskNode: TTaskNode; Act: integer): TSDEOperation3;
var
  i: integer;
  V: TVectorView;
  sdef: ISdef;
  P: TPageList;
  Op: TSDEOperation3;
begin
  sdef := App.SDEF (App.MainDoc);
  P := sdef.GetSchemeSet.ListWN [0];
  V := P.FindView (tcWikl, Act) as TVectorView;
  Result := ATaskNode.AddOperationN ('Действие ' + IntToStr(Act), V.TechMain, 'положение', 'отключен');
  RenderTask (ATaskNode.Task);
end;

procedure TTestProtokol.RenderTask (ATask: TSDETask);
begin
  ATask.Render;
  {if ATask = Task then
    frmBlanksForm.frmBlankEditor.RenderBlank (ATask)
  else if (ATask = Protokol) then
    frmBlanksForm.frmProtokol.RenderBlank (ATask);}
end;

procedure TTestProtokol.AddCommand(ATask: TSDETask; Acts: array of integer);
var
  i: integer;
  V: TVectorView;
  sdef: ISdef;
  P: TPageList;
  Op: TSDEOperation3;
begin
  sdef := App.SDEF (App.MainDoc);
  P := sdef.GetSchemeSet.ListWN [0];
  ATask.Clear;
  for i := low (Acts) to high (Acts) do begin
    V := P.FindView (tcWikl, Acts[i]) as TVectorView;
    Op := ATask.Operations.AddOperationN
      ('Действие ' + IntToStr(Acts[i]), V.TechMain, 'положение', 'отключен');
    if ATask = Task then
      Op.Rate := round(IntPower(10, Acts[i]-1));
  end;
  ATask.Operations.Renumerate;
  RenderTask (ATask);
end;

procedure TTestProtokol.CheckCommand (ATask: TSDETask; Acts: array of integer);
var
  i: integer;
  V: TVectorView;
  sdef: ISdef;
  P: TPageList;
  S: string;
begin
  sdef := App.SDEF (App.MainDoc);
  P := sdef.GetSchemeSet.ListWN [0];
  S := PrintTask (ATask) + PRet + PrintAсts (Acts);
  for i := 0 to ATask.Operations.Count-1 do begin
    V := (ATask.Operations.Nodes [i] as TSDEOperation3).Element;
    CheckEquals (V.Tag, Acts [i], S);
  end;
end;

procedure TTestProtokol.CheckMaxRate (Rate: integer);
begin
  CheckEquals (Task.CalcMaxRate, Rate);
end;

procedure TTestProtokol.CheckRate (Rate: integer);
begin
  CheckEquals (Task.CalcRate, Rate);
end;

procedure TTestProtokol.CheckProtokol (Acts: array of integer; Schedule: array of TScheduleStatus; MaxRate, Rate: integer);
begin
  Protokol.Clear;
  AddCommand(Protokol, Acts);
  Task.LinkProtokol;
  Task.CalcSchedule;
  CheckSchedule (Protokol, Schedule);
  Protokol.Render;
  //frmBlanksForm.frmProtokol.RenderBlank(Protokol);
  CheckMaxRate (MaxRate);
  CheckRate (Rate);
end;

function TTestProtokol.PrintAStatus (const A: array of TScheduleStatus): string;
var
  i: integer;
begin
  Result := '';
  for i := 0 to High (A) do
    Result := Result + SScheduleStatus [A[i]] + ' ';
end;

function TTestProtokol.PrintAсts (const A: array of integer): string;
var
  i: integer;
begin
  Result := '';
  for i := 0 to High (A) do
    Result := Result + IntToStr (A[i]) + ' ';
end;

function TTestProtokol.PrintTask (ATask: TSDETask): string;
var
  i: integer;
  Op: TSDEOperation3;
begin
  Result := '';
  for i := 0 to ATask.Operations.Count-1 do begin
    Op := ATask.Operations.Nodes [i] as TSDEOperation3;
    Result := Result + Op.IIDS + ' ';
  end;
end;

procedure TTestProtokol.CheckSchedule (ATask: TSDETask; Acts: array of TScheduleStatus);
var
  i: integer;
  Op: TSDEOperation3;
  OpActs: array of TScheduleStatus;
begin
  SetLength (OpActs, ATask.Operations.Count);
  for i := 0 to ATask.Operations.Count-1 do begin
    Op := ATask.Operations.Nodes [i] as TSDEOperation3;
    OpActs [i] := Op.Schedule;
  end;

  for i := 0 to ATask.Operations.Count-1 do begin
    Op := ATask.Operations.Nodes [i] as TSDEOperation3;
    Check (Op.Schedule = Acts [i],
      PrintTask (ATask) + PRet +
      PrintAStatus (Acts) + PRet +
      PrintAStatus (OpActs));
  end;
end;

procedure TTestProtokol.CheckInvertCount (ATask: TSDETask; N: integer; Up: boolean; Cnt: integer);
var
  Op: TSDEOperation3;
  С: integer;
  S: string;
begin
  S := PrintTask (ATask);
  Op := ATask.Operations.Nodes [N] as TSDEOperation3;
  if Up then
    С := Task.CalcInversionsUp (Op)
  else
    С := Task.CalcInversionsDown (Op);
  CheckEquals (С, Cnt);
end;

initialization
  TestFramework.RegisterTest('TestProtokol Suite', TTestProtokol.Suite);
end.


Кстати, вот еще минус вашего подхода.
Если заворачивать тестовые случаи в обычные методы с параметрами, то при изменении состава параметров передаваемых в метод, о необходимости изменения параметров вызовов скажет компилятор и приложение не соберется.
А в вашем случае если забыли поменять параметры, то все соберется, но начнут падать тесты и по каждому придется разбираться в изменениях.
Это если я правильно понял, что у вас параметры передаются как массив вариантов.
Отредактировано 17.02.2019 10:36 swame . Предыдущая версия . Еще …
Отредактировано 17.02.2019 9:34 swame . Предыдущая версия .
Отредактировано 17.02.2019 9:10 swame . Предыдущая версия .
Отредактировано 17.02.2019 9:07 swame . Предыдущая версия .
Re[7]: Порка: TestMeCode.com
От: Unhandled_Exception Россия  
Дата: 17.02.19 09:23
Оценка:
Здравствуйте, swame, Вы писали:

S>Тесты для DUnit САМ делал


Любопытно, а чем сейчас покрытие считают для юнит тестов на дельфи?
Re[8]: Порка: TestMeCode.com
От: swame  
Дата: 17.02.19 09:37
Оценка:
Здравствуйте, Unhandled_Exception, Вы писали:

U_E>Здравствуйте, swame, Вы писали:


S>>Тесты для DUnit САМ делал


U_E>Любопытно, а чем сейчас покрытие считают для юнит тестов на дельфи?


Не сталкивался, у меня покрытие тестами небольшое, пишу тесты только на хрупкие к изменению алгоритмов куски кода,
все покрыть тестами слишком дорого.
Re[8]: Порка: TestMeCode.com
От: rudzuk  
Дата: 17.02.19 10:52
Оценка: 4 (1)
Здравствуйте, Unhandled_Exception, Вы писали:

UE> Любопытно, а чем сейчас покрытие считают для юнит тестов на дельфи?


https://sourceforge.net/projects/delphicodecoverage/
avalon/2.0.6
Re[9]: Порка: TestMeCode.com
От: Unhandled_Exception Россия  
Дата: 17.02.19 10:59
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>https://sourceforge.net/projects/delphicodecoverage/


Спасибо!

Там на форуме один пост. Просто тема юнит тестирования не очень актуальна для дельфи?..
Re[10]: Порка: TestMeCode.com
От: rudzuk  
Дата: 17.02.19 11:06
Оценка:
Здравствуйте, Unhandled_Exception, Вы писали:

UE> Там на форуме один пост. Просто тема юнит тестирования не очень актуальна для дельфи?..


Да кто его знает. Проект раньше жил на почившем гуглокоде, там, вроде, активность какая-то была.
avalon/2.0.6
Re[9]: Порка: TestMeCode.com
От: Garamzin  
Дата: 17.02.19 13:11
Оценка:
Здравствуйте, swame, Вы писали:

S>Вот пример типичного рутинного теста из моего кода сложнее калькулятора.

S>Как бы он выглядел в вашей системе?

Брось компилируемый проект на почту с одной функцией и с тестами на адрес: garamzin.vladimir(at)майл.ру
Re[10]: Порка: TestMeCode.com
От: swame  
Дата: 17.02.19 17:29
Оценка:
Здравствуйте, Garamzin, Вы писали:

G>Здравствуйте, swame, Вы писали:


S>>Вот пример типичного рутинного теста из моего кода сложнее калькулятора.

S>>Как бы он выглядел в вашей системе?

G>Брось компилируемый проект на почту с одной функцией и с тестами на адрес: garamzin.vladimir(at)майл.ру


Не так просто. Там примерно 2000 модулей 1KK строк кода и 15 сторонних пакетов компонентов.
Я хотел получить просто набросок-идею. Компилить для этого не обязательно.
Если очень хочется могу дать доступ к машине где настроена сборка.
Re[2]: Порка: TestMeCode.com
От: licedey  
Дата: 17.02.19 19:13
Оценка:
Здравствуйте, falcoware, Вы писали:



F>ИМХО, тулсы для разработчиков не взлетают. Кто тут ОКСЕТТУ делал и пролетел?


А почему не взлетают? Интересно ваше мнение.

Я конечно понимаю, что проще продать 1000 генераторов инвойсов, чем 1000 отладчиков, но все же. JetBrains тоже начинали со скромной IDE для Java. Потом чуваки которые сделали PVS-Studio, тоже вроде не бедствуют.
Уж молчу про забугорных коллег. Вы только посмотрите кого купила Microsoft. 80% — это компании разработчики тулсов для нас.
Re[11]: Порка: TestMeCode.com
От: Garamzin  
Дата: 17.02.19 20:57
Оценка:
Здравствуйте, swame, Вы писали:

S>Я хотел получить просто набросок-идею. Компилить для этого не обязательно.


Вот смотри. Давай попробуем разобрать 1 твой тест метод TTestBlocking.Test_Imer_CreateBlockingsWikat;
  Код 1

// ***  ОТКРЫТИЕ ФАЙЛА БЕЗ ПРОВЕРКИ 
 OpenFile (1);


// *** 1-Й БЛОК ТЕСТА
  {выкатной выключатель}
  LB := FindBlocking ('ПС_Имелетинская_ЗН_КЛ_10_кВ__Им206', 'ПС_Имелетинская_В_10_кВ_Им206',
                      'Test_CreateBlockings 2.1');
  TestBlocked (LB, 'Test_CreateBlockings 2.1.11', true, false);
  CheckIs(LB.ControlItemT.View, TWiklWid, 'Test_CreateBlockings 2.1.12');

  (LB.ControlItemT.View as TWiklWid).TrolleyState := tsService;
  try
    TestBlocked (LB, 'Test_CreateBlockings 2.1.13', false, false);
  finally
    (LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
  end;
  {}

// *** 2-Й БЛОК ТЕСТА

  LB := FindBlocking ('ПС_Имелетинская_ЗН_СВ-43_10_кВ', 'ПС_Имелетинская_СВ_43_10_кВ',
                      'Test_CreateBlockings 2.2');
  TestBlocked (LB, 'Test_CreateBlockings 2.2.11', true, false);
  CheckIs(LB.ControlItemT.View, TWiklWid, 'Test_CreateBlockings 2.2.12');
  VC[0] := (Scheme.FindLUni ('#1142\\\Схема\СП 3 С СВ 43 10 кВ') as TnamedBlock).VrepFirst as TVectorView;

  (LB.ControlItemT.View as TWiklWid).TrolleyState := tsService;
  (VC[0] as TShassi).TrolleyState := tsService;
  try
    TestBlocked (LB, 'Test_CreateBlockings 2.2.13.1', false, false);
  finally
    (LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
    (VC[0] as TShassi).TrolleyState := tsWork;
  end;


// *** ДАЛЕЕ ТО, ЧТО ДОЛЖНО ТЕСТИРОВАТЬСЯ, НО НИЖЕ НЕТ КОДА ТЕСТИРОВАНИЯ, ПРОСТО ПЕРЕЧЕНЬ ДАННЫХ.

  {На секции 6-10 кВ если для ячеек потребителей не создавать блок с ЗН на секции}
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_1_С_Т-1',
                      'Test_CreateBlockings 2.3.1', true);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', '#1143\\\Схема\полушасси[1]',
                      'Test_CreateBlockings 2.3.2', true);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', '#1141\\\Схема\СП 1 С СВ 21 10 кВ',
                      'Test_CreateBlockings 2.3.3', true);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_ТСН-1',
                      'Test_CreateBlockings 2.3.4', true);

  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им101',
                      'Test_CreateBlockings 2.3.5', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им103',
                      'Test_CreateBlockings 2.3.6', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им105',
                      'Test_CreateBlockings 2.3.7', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им107',
                      'Test_CreateBlockings 2.3.8', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им109',
                      'Test_CreateBlockings 2.3.9', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им111',
                      'Test_CreateBlockings 2.3.10', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им113',
                      'Test_CreateBlockings 2.3.11', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_Им115',
                      'Test_CreateBlockings 2.3.12', false);
  LB := FindBlocking ('ПС_Имелетинская_ЗН_1_С_10_кВ', 'ПС_Имелетинская_В_10_кВ_ДГР-1',
                      'Test_CreateBlockings 2.3.13', false);

  {блокировка с тележкой автомата}
  LB := FindBlocking ('ПС_Имелетинская_ЗН_КЛ_10_кВ_ТСН-2', 'ПС_Имелетинская_АВ_0,4_кВ_ТСН-2',
                      'Test_CreateBlockings 2.4.1', true);

  {блокировк c  ВКЛ только рядом расположенного }
  LB := FindBlocking ('ПС_Имелетинская_ЗН_БСК-1', 'ПС_Имелетинская_В_10_кВ_БСК-1',
                      'Test_CreateBlockings 2.4.1', false);

end;


Тестируемый код:
// *** 1-Й БЛОК ТЕСТА
  {выкатной выключатель}
  LB := FindBlocking ('ПС_Имелетинская_ЗН_КЛ_10_кВ__Им206', 'ПС_Имелетинская_В_10_кВ_Им206',
                      'Test_CreateBlockings 2.1');
  TestBlocked (LB, 'Test_CreateBlockings 2.1.11', true, false);
  CheckIs(LB.ControlItemT.View, TWiklWid, 'Test_CreateBlockings 2.1.12');

  (LB.ControlItemT.View as TWiklWid).TrolleyState := tsService;
  try
    TestBlocked (LB, 'Test_CreateBlockings 2.1.13', false, false);
  finally
    (LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
  end;


Опустим необходимость подготовки тестовых данных, проверки открытия файла и тд, состредоточимся только на этом участке кода.
Как это все будет выглядеть в TestCode.
Открой страницу теста для калькулятора.
Я тут буду приводить номера пунктов, что бы понять о чем я говорю. Конечно в живом диалоге и с рабочим примером лучше объясняться, но я постараюсь.
1.Сделать в модуле и рабочем классе как описано в пунктах: 2.1, 2.2, 2.3.
2. Пункт 2.4.2 Создать тип метода, что мы будем тестировать
Тут важно знать, какой объект мы будем тестировать, который уже создан или который нужно создавать для теста
Если нужно создать то прописываем например создание и удаление объекта и инициализацию в случае креша какого то теста и других непредвиденных обстоятельств
 type
 // имя тут может быть любое
   TTestMethod = ( 
            ,tmInit
            ,tmCreateObject
            ,tmTestBlocked // тестируем 1. метод
            ,tmFreeObject 
         );


Мы же предположим, что объект на момент теста будет уже создан, поэтому тестируем только 1 метод.
 type
   TTestMethod = ( // имя может быть любым
            tmTestBlocked // тестируем 1. метод
         );


3. Регистрация метода который будем тестировать п. 2.4.4.
  IRegisterMethod(tmTestBlocked  ,'Test Blocked'  ,'Проверка поиска текста и дополнительной информации ');// Test methods


4. Добавляем наши параметры для теста
//Тест на Истину (объяснения ниже)
 IRegisterMethodParams(['ПС_Имелетинская_ЗН_КЛ_10_кВ__Им206', 'ПС_Имелетинская_В_10_кВ_Им206'] // 1-й массив что мы тестируем
                         ,['Test_CreateBlockings 2.1','Test_CreateBlockings 2.1.11','Test_CreateBlockings 2.1.13']// 2-й массив, с чем мы сравниваем
                         ,'Тут описание, я пишу тут параметры и какой д/б результат'); // True result
//Тест на ЛОЖЬ (объяснения ниже)
 IRegisterMethodParams(['ПС_Имелетинская_ЗН_КЛ_10_кВ__Им206', 'ПС_Имелетинская_В_10_кВ_Им206'] // 1-й массив что мы тестируем
                         ,['Test_CreateBlockings =ТУТ ПИШЕМ ЧЕГО НЕ ДОЛЖНО БЫТЬ!!!','ошибка','ошибка'] // 2-й массив,специально создаем ошибку, но кол-во строк д/б равно первой регистрации параметров иначе будет ошибка регистрации. Смотри параметр TParamCheckOptions
                         ,'Тут описание метода, например ТУТ ОШИБКА'
                         ,trError // НОВЫЙ ПАРАМЕТР ПРОВЕРКИ НА ОШИБКУ
); // True result

Объяснения: "Тест на Истину" и "Тест на ЛОЖЬ"
Проверка д/б не только на ИСТИНУ но и на ЛОЖЬ, при этом итоговый результат д/б положительный "Тест пройден"
Пример калькулятора:
1) "Тест на Истину"
IRegisterMethodParams([2,2],[1],'2 div 2=1'); // True result
То есть 2 div 2 = 1. Если результат не равен 1, то будет ошибка.
2) "Тест на ЛОЖЬ"
IRegisterMethodParams([4,4],[4],'4 div 4=4 trError it''s Ok',trError); // Error = Ok
4 div 4 =4 — Это заведомо явный ввод ошибки, тест ОБЯЗАН вернуть ошибку. НО после всех тестов д/б результат Ok, а не ERROR, поэтому мы пишем, что с этими данными должна быть сгенерирована ошибка, и если ее не будет, то ЭТО будет считаться ошибкой. Поэтому мы прописываем доп. параметр trError, уведомляя систему тестирования, что возврат кода ошибки, означает, что тест ПРОЙДЕН!
Очень ВАЖНО писать тесты как на Истину, так и на Ложь и с TestCode делать это очень просто.

Может быть я банальные вещи пишу, но я стараюсь объяснить, как лучше тестировать код, тем кто это не делает.


5. Пункт 2.4.5. Реализация самого теста. Допустим есть объект который мы тестируем MyObj

case TTestMethod(IMethod.IGetNumParamUser)  of
    tmTestBlocked:
      begin
//  LB := FindBlocking ('ПС_Имелетинская_ЗН_КЛ_10_кВ__Им206', 'ПС_Имелетинская_В_10_кВ_Им206',
//                      'Test_CreateBlockings 2.1');

    LB := MyObj.FindBlocking (IMethod_AsAnsiString(IMethod.IGetArrParam(0)), IMethod_AsAnsiString(IMethod.IGetArrParam(1))
     // я не понял назначение этой строки если это результат который д/б то прописать так:
                        ,IMethod_AsAnsiString(IMethod.IGetArrResultForTestMethod(0)));

  // Далее, как я понял проверяются элементы TBlockingInfo   
  {  TestBlocked (LB, 'Test_CreateBlockings 2.1.11', true, false);
  CheckIs(LB.ControlItemT.View, TWiklWid, 'Test_CreateBlockings 2.1.12');

  (LB.ControlItemT.View as TWiklWid).TrolleyState := tsService;
  try
    TestBlocked (LB, 'Test_CreateBlockings 2.1.13', false, false);
  finally
    (LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
  end;
}
    // их можно проверять по правилу "Все или Ничего", 
    // т.е. только в конце ставим результат trOk, а сейчас выставим ошибку, что бы менише писать if begin .. end
     result:=trError;
           (LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
         if not MyObj.TestBlocked (LB, IMethod.IGetArrResultForTestMethod(1)), true, false) then exit;
           (LB.ControlItemT.View as TWiklWid).TrolleyState := tsService;
         if not MyObj.TestBlocked (LB, IMethod.IGetArrResultForTestMethod(2)), true, false) then exit;
        result:=trOk; // если дошли до конца, значит тест пройдет
      end;
  end; // case

Я бы не использовал при тестировании в тестах код try..finally, как и try..except
Вместо try..finally проинициализовал бы в начале: (LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
А try..except не надо использовать, тк исключения ловятся выше уровнем.


Мне сложно писать абстрактный пример, если бы был рабочий тест на DUnit, мне было бы намного проще показать преимущества.
Но ты наверно заметил, что в TestCode жестко разделаются параметры и сам тестовый код. Это одно из принципиальных отличий.
И отличий очень много.

S>Если заворачивать тестовые случаи в обычные методы с параметрами, то при изменении состава параметров передаваемых в метод, о необходимости изменения параметров вызовов скажет компилятор и приложение не соберется.

S>А в вашем случае если забыли поменять параметры, то все соберется, но начнут падать тесты и по каждому придется разбираться в изменениях.
Нет, не соберется, если будет вызов тестируемого метода, если конечно не будет Default параметров, но это точно так же будет и при любом другом использовании измененного кода.

S>Движок тестирования вынесен в отдельное приложение — но это только недостаток

На мой взгляд это огромный плюс, так как позволяет тестировать несколько приложений и DLL одновременно.

S>Про отладочные сообщения ничего не говорю — это вообще отдельный продукт, непонятно зачем он объединен c юнит тестированием.

То что сейчас есть в продукте TestCode & TestSend, это лишь наверно 1/10 из того, что запланировано.
И почему я объеденил?
Потому что мне так удобнее, мне не надо что то еще запускать и все, чем я пользуюсь, но находится в отдельных модулях, я хочу интегрировать в одно приложение.
Re[12]: Порка: TestMeCode.com
От: swame  
Дата: 18.02.19 10:26
Оценка:
Здравствуйте, Garamzin, Вы писали:

G>Здравствуйте, swame, Вы писали:


S>>Я хотел получить просто набросок-идею. Компилить для этого не обязательно.


G>Может быть я банальные вещи пишу, но я стараюсь объяснить, как лучше тестировать код, тем кто это не делает.


Я понимаю принципы тестирования и понимаю как писать тесты в твоей системе, просил описать преимущества, пока вижу только усложнение.
А ты рекламируешь ее как дающую самое дешевое написание тестов.

G>5. Пункт 2.4.5. Реализация самого теста. Допустим есть объект который мы тестируем MyObj



G>[/pascal]

G>

G> Я бы не использовал при тестировании в тестах код try..finally, как и try..except
G> Вместо try..finally проинициализовал бы в начале: (LB.ControlItemT.View as TWiklWid).TrolleyState := tsWork;
G> А try..except не надо использовать, тк исключения ловятся выше уровнем.


Я и не использую try..except
try..finally используется для возврата старого значения.
Понимаю, что где-то делаю не по канонам, но в данном случае так кажется проще.

G>Но ты наверно заметил, что в TestCode жестко разделаются параметры и сам тестовый код. Это одно из принципиальных отличий.


Понимаю это отличие , что оно дает? Пока вижу только ненужное усложнение.

S>>Если заворачивать тестовые случаи в обычные методы с параметрами, то при изменении состава параметров передаваемых в метод, о необходимости изменения параметров вызовов скажет компилятор и приложение не соберется.

S>>А в вашем случае если забыли поменять параметры, то все соберется, но начнут падать тесты и по каждому придется разбираться в изменениях.
G>Нет, не соберется, если будет вызов тестируемого метода, если конечно не будет Default параметров, но это точно так же будет и при любом другом использовании измененного кода.

ТО ты хочешь сказать что если мы вместо
IRegisterMethodParams([4,4],[4],'4 div 4=4 trError it''s Ok',trError);


напишем

IRegisterMethodParams([4,4,4],[4],'4 div 4=4 trError it''s Ok',trError);


то код не соберется ? (нужно именно чтобы не собрался).

S>>Движок тестирования вынесен в отдельное приложение — но это только недостаток

G>На мой взгляд это огромный плюс, так как позволяет тестировать несколько приложений и DLL одновременно.

О чем это и зачем?

S>>Про отладочные сообщения ничего не говорю — это вообще отдельный продукт, непонятно зачем он объединен c юнит тестированием.

G>То что сейчас есть в продукте TestCode & TestSend, это лишь наверно 1/10 из того, что запланировано.
G>И почему я объеденил?
G>Потому что мне так удобнее, мне не надо что то еще запускать и все, чем я пользуюсь, но находится в отдельных модулях, я хочу интегрировать в одно приложение.

Так не стоит делать хотя бы потому что код со скомпилированными тестами не должен уходить от разработчика, а логирование можно поставить и в релиз.
И логирование и тесты никак не связаны.
Re[13]: Порка: TestMeCode.com
От: Garamzin  
Дата: 18.02.19 14:01
Оценка:
Здравствуйте, swame, Вы писали:


S>ТО ты хочешь сказать что если мы вместо

S>
S>IRegisterMethodParams([4,4],[4],'4 div 4=4 trError it''s Ok',trError);
S>


S>напишем


S>
S>IRegisterMethodParams([4,4,4],[4],'4 div 4=4 trError it''s Ok',trError); 
S>



S>то код не соберется ? (нужно именно чтобы не собрался).


Если про эти параметры, то нет, не нужно, что бы не собирался проект, т.к. есть методы с плавающим количеством параметров к примеру тот же Write.
Есть методы с дефаулт параметрами, которые то же необходимо тестировать .




S>>>Движок тестирования вынесен в отдельное приложение — но это только недостаток

G>>На мой взгляд это огромный плюс, так как позволяет тестировать несколько приложений и DLL одновременно.

S>О чем это и зачем?

тестировать несколько приложений и DLL одновременно

Если одно приложение, то наверно этот функционал излишен, но если несколько приложений работают в связке, то он востребован.

S>Так не стоит делать хотя бы потому что код со скомпилированными тестами не должен уходить от разработчика, а логирование можно поставить и в релиз.

S>И логирование и тесты никак не связаны.
Была мысль сделать пароль на тесты, в принципе можно и прикрутить.
Отредактировано 18.02.2019 14:04 Garamzin . Предыдущая версия .
Re[14]: Порка: TestMeCode.com
От: rudzuk  
Дата: 18.02.19 15:34
Оценка:
Здравствуйте, Garamzin, Вы писали:

G> S>
G> S>IRegisterMethodParams([4,4,4],[4],'4 div 4=4 trError it''s Ok',trError);
G> S>


Как такой подход уживается с var и out параметрами?
avalon/2.0.6
Re: Порка: TestMeCode.com
От: ArcticLine2 http://www.IconDesignLAB.com
Дата: 19.02.19 15:34
Оценка:
Здравствуйте, Garamzin, Вы писали:

G>Хочу посоветоваться:

G> 1. Что в первую очередь "причесать" для старта продаж?


Мы все еще пишем на Делфи. И, потенциально, я ваш клиент. Сделать разработку проще, а тестирование более дешевым интересно. Но, зайдя на сайт, я вообще не понял, что вы продаете и как это мне может помочь. Технари, конечно, поняли, но я не технарь.
Вывод: тексты надо переписывать в первую очередь.


--
С уважением, Роман.
дизайн иконок и Клуб по интересам для шароварщиков
Re: Порка: TestMeCode.com
От: VladFein США  
Дата: 19.02.19 22:54
Оценка:
Здравствуйте, Garamzin, Вы писали:


G>- Перенес сайт с домена TestMe-On.com на TestMeCode.com


TestMyCode.com ? Пока свободен...
Re: Порка: TestMeCode.com
От: rean  
Дата: 20.02.19 07:27
Оценка:
deleted
Отредактировано 22.04.2019 8:51 deleted2 . Предыдущая версия . Еще …
Отредактировано 22.04.2019 8:09 deleted2 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.