Вы можете взглянуть на классы модульного тестирования, доступные в нашем модуле с открытым исходным кодом SynCommons . Он используется в нашей среде с открытым исходным кодом для всех регрессионных тестов. Возможно, это не самое лучшее, но на это стоит взглянуть. Смотри http://blog.synopse.info/post/2010/07/23/Unit-Testing-light-in-Delphi
В новой версии 1.13 также есть новый механизм ведения журналов с трассировкой стека любого возбуждаемого исключения, например, MadExcept, с использованием содержимого файла .map в качестве источника.
Теперь он используется классами модульного тестирования, поэтому при любом сбое создается запись в журнале с исходной строкой и трассировкой стека:
C:\Dev\lib\SQLite3\exe\TestSQL3.exe 0.0.0.0 (2011-04-13)
Host=Laptop User=MyName CPU=2*0-15-1027 OS=2.3=5.1.2600 Wow64=0 Freq=3579545
TSynLogTest 1.13 2011-04-13 05:40:25
20110413 05402559 fail TTestLowLevelCommon(00B31D70) Low level common: TDynArray "" stack trace 0002FE0B SynCommons.TDynArray.Init (15148) 00036736 SynCommons.Test64K (18206) 0003682F SynCommons.TTestLowLevelCommon._TDynArray (18214) 000E9C94 TestSQL3 (163)
Разница между тестовым костюмом без каротажа и тестовым костюмом с каротажем заключается только в следующем:
procedure TSynTestsLogged.Failed(const msg: string; aTest: TSynTestCase);
begin
inherited;
with TestCase[fCurrentMethod] do
fLogFile.Log(sllFail,'%: % "%"',
[Ident,TestName[fCurrentMethodIndex],msg],aTest);
end;
Механизм регистрации может использоваться для отслеживания рекурсивных вызовов. Он может использовать интерфейсный механизм для регистрации при входе и выходе из любого метода:
procedure TMyDB.SQLExecute(const SQL: RawUTF8);
var ILog: ISynLog;
begin
ILog := TSynLogDB.Enter(self,'SQLExecute');
// do some stuff
ILog.Log(sllInfo,'SQL=%',[SQL]);
end; // when you leave the method, it will write the corresponding event to the log
Это будет зарегистрировано так:
20110325 19325801 + MyDBUnit.TMyDB(004E11F4).SQLExecute
20110325 19325801 info SQL=SELECT * FROM Table;
20110325 19325801 - MyDBUnit.TMyDB(004E11F4).SQLExecute
Здесь имя метода задается в коде ('SQLExecute'). Но если у вас есть связанный файл .map, механизм ведения журналов может прочитать эту символьную информацию и записать точный номер строки события.
Обратите внимание, что по умолчанию у вас есть время и дата, записанные в журнал, но также возможно заменить это время на метки времени с высоким разрешением. Благодаря этому вы сможете профилировать свое приложение с данными, поступающими со стороны клиента, на его настоящий компьютер. С помощью метода Enter (и его функции автоматического выхода) у вас есть вся информация, необходимая для этого. ;)
Как это:
0000000000000B56 + TTestCompression(00AB3570).000E6C79 SynSelfTests.TTestCompression.TestLog (376)
0000000000001785 - TTestCompression(00AB3570).000E6D09 SynSelfTests.TTestCompression.TestLog (385)
Мне все еще нужно написать какой-нибудь инструмент для вычисления профилирования, но уже есть специальный класс TSynLogFile, способный читать файл .log и распознавать его содержимое.
При первом чтении файла .map создается файл .mab, который будет содержать всю необходимую информацию о символах. Вы можете отправить файл .mab с файлом .exe своему клиенту или даже встроить его содержимое в файл .exe. Этот файл .mab оптимизирован: .map 927,984 байта сжимается в файл 71,943 .mab.
Так что это устройство может быть признано естественным потомком свадьбы DUnit и MadExcept в чистом OpenSource. :)
Дополнительная информация доступна на нашем форуме . Не стейсняйся спросить. Отзывы и пожелания приветствуются! Работает с Delphi 6 до XE.