Форум: "Прочее";
Текущий архив: 2008.03.02;
Скачать: [xml.tar.bz2];
Вниз
А как вы тестируете свои шедевры? Найти похожие ветки
← →
Галинка © (2008-01-23 13:05) [0]собсно сабж. В основном интересует ситуация, если ошибка/баг вылазит не все время (т.е. при трассировке то вылазит, то нет).
← →
Riply © (2008-01-23 13:08) [1]> [0] Галинка © (23.01.08 13:05)
Меня очень "логи" выручают.
Прописываю их во всех подозрительных местах. :)
← →
Palladin © (2008-01-23 13:08) [2]подробнейший лог
честно сказать, я F7/F8 никогда и не пользуюсь
← →
ZoldBerger (2008-01-23 13:23) [3]procedure TfrmMain.MyExceptionHandler(Sender : TObject; E : Exception );
var
QuerySQL : string;
nrID : string;
FileName : string;
CS : string;
N : TNotifyEvent;
ErrorS : TStringList;
PropInfo : PPropInfo;
jpgImg: TJPEGImage;
begin
..
ErrorS := TSTringList.Create;
screen.cursor := crDefault;
cs := "ABCDEF0123456789";
fileName := IncludeTrailingBackslash(GetCurrentDir)+"LOGS\ERROR-"+DateToStr(date)+"-"+IntToStr(Random(99999))+cs[Random(16)]+".bmp";
with frmError do
begin
VMSG.Lines.Clear;
VMSG.Lines.Add(E.Message);
// VMSG.Lines.Add(GetClassHelp(e.ClassName));
UpdateType.caption := e.ClassName;
ErrorMsg.Lines.Clear;
ErrorMsg.Lines.Add(E.Message);
ErrorMsg.Lines.Add(E.ClassName);
GetBaseClassInfo(Sender,ErrorMsg.Lines);
ErrorMsg.Lines.Add("");
ErrorMsg.Lines.Add("");
ScreenShot(IMage1.Picture.Bitmap);
// jpgImg:= TJPEGImage.Create;
// jpgImg.Assign(IMage1.Picture.Bitmap);
// jpgImg.SaveToFile(fileName);
Image1.Picture.SaveToFIle(FileName);
with ErrorMsg.Lines do
begin
add("Родитель класса: " + e.ClassParent.ClassName);
add("=== Базовые методы ===");
GetBaseMethodInfo(PTypeInfo(e.classtype), ErrorMsg.lines);
add("=== Дифференциальные методы ===");
GetMethodDefinition(PTypeInfo(e.classtype),
ErrorMsg.lines);
add("=== Родительские свойства ===");
add("Родитель: " + sender.Classname);
add("Имя: " +(sender as TComponent).Name);
end; //sender.
// ShowModal;
with frmMain.ADOQuerySp do
begin
close;
sql.Clear;
QuerySQL := "DECLARE @nResult INT, @nId INT " +
"EXECUTE @nResult = DBO.up_InsertReleaseError @nId OUTPUT,"+
(runl)+","+
QuotedStr(ErrorMsg.Lines.text)+","+QuotedStr(E.ClassName)+
" SELECT @nResult RESULT, @nID ID";
sql.Add(QuerySQL);
open;
nrID := FieldByName("ID").AsString;
end;
screen.cursor := crHourGlass;
if nrID = "" then begin
screen.Cursor := crDefault;
end else
begin
ADOQuerySp.sql.text:="UPDATE ut_LogReleaseError SET MSG_PICT=:b WHERE ID="+nrID;
ADOQuerySp.parameters.parseSQL(ADOQuerySp.sql.text, true);
ADOQuerySp.parameters.parambyname("b").LoadFromFile( fileName,ftBlob);
ADOQuerySp.execsql;
screen.Cursor := crDefault;
if not ReadBoolean("CONFIG","SaveLOGS") then deletefile(fileName);
end;
end;
errors.free;
if not ReadBoolean("CONFIG","SaveLOGS") then deletefile(fileName);
frmWarning.ShowMess("Запомните номер","В программе произошла ошибка, свяжитесь с разработчиком и назовите номер ошибки: "#"+nrID+""");
← →
SerJaNT © (2008-01-23 13:25) [4]
> ZoldBerger (23.01.08 13:23) [3]
шо это было?
← →
ZoldBerger (2008-01-23 13:27) [5]
> SerJaNT © (23.01.08 13:25) [4]
во многих приложениях, которые работают с БД, использую слежку за ошибками
← →
Palladin © (2008-01-23 13:28) [6]это бред
← →
Галинка © (2008-01-23 13:31) [7]логи это мысль. Спасибо за наводку.
← →
Slym © (2008-01-23 13:31) [8]Нужно тестировать не проект вцелом, а "кубики" из которых проект сделан...
В папке с проектом имеем папку TEST с набором тестовых приложений для тестирования "кубиков"
← →
Ega23 © (2008-01-23 14:01) [9]
> ZoldBerger (23.01.08 13:23) [3]
Какой ужас....
ещё и со скрин-шотом....
← →
OSokin (2008-01-23 14:04) [10]Я обычно проверяю, вызывает строка кода ошибку или нет, вызовом MessageBox(0,0,0,0) до и после нее (исключения, конечно, хорошо, но в программах на WinAPI они не работают :/ ). А логи в неконсольных приложениях делаю так:
AssignFile(Output, "Log.Log");
Rewrite(Output);
...
WriteLn("Logged string");
← →
ZoldBerger (2008-01-23 14:05) [11]
> Ega23 © (23.01.08 14:01) [9]
ты предложи ...
← →
Семеныч (2008-01-23 14:07) [12]> OSokin (23.01.08 14:04) [10]
> исключения, конечно, хорошо, но в программах на WinAPI они не работают
Посмотрите Win32Check.
← →
Lamer@fools.ua © (2008-01-23 14:08) [13]>>OSokin (23.01.08 14:04) [10]
RaiseLastOSError не спасёт отца русской демократии?
← →
DiamondShark © (2008-01-23 14:13) [14]
> исключения, конечно, хорошо, но в программах на WinAPI они
> не работают
uses SysUtils;
← →
Ega23 © (2008-01-23 14:15) [15]
> ты предложи ...
Что предложить?procedure TMyClass.TMyMethod
begin
try
except on E : Exception do
LogError("TMyClass.TMyMethod : " + E.Message);
// если надо - raise Exception.Create("TMyClass.TMyMethod : " + E.Message);
end;
end;
Ну и то же самое на уровне Application.OnException.
← →
Mystic © (2008-01-23 14:18) [16]Иногда помогает медитация на исходники.
← →
ZoldBerger (2008-01-23 14:20) [17]Правильно обрати внимание на название процедуры MyExceptionHandler
Вот посмотри, какую информацию, я кидаю в SQL
ErrorMSG: Необходимо объявить скалярную переменную "@nIdDir_A"
ErrorCLASS: EOleException
Тип: tkClass
Размер: 1328
Модуль: uObjClaimPrep
Номер свойства: 104
Параметр: jClaimPrep
Родитель класса: EOleSysError
=== Базовые методы ===
Имя класса:
Тип: tkRecord
Номер параметра: 0
=== Дифференциальные методы ===
procedure ;
=== Родительские свойства ===
Родитель: TfrmObjClaimPrep
Имя: frmObjClaimPrep
Что твой лог пишет? и думаешь хранение скриншота глупо?
← →
Palladin © (2008-01-23 14:23) [18]бред
← →
OSokin (2008-01-23 14:25) [19]
> DiamondShark © (23.01.08 14:13) [14]
> Lamer@fools.ua © (23.01.08 14:08) [13]
> Семеныч (23.01.08 14:07) [12]
Да знаю я. Я имел в виду обработку исключений по OnException. А делать подобное просто лень =)
← →
No_Dead © (2008-01-23 14:25) [20]> думаешь хранение скриншота глупо?
имхо, я бы еще видео— и аудио— записи сделал.
наверняка, это раз.
на память, это два.
место ж надо куда-то девать на винте, это три.
100% доказетльство начальству что я работаю, это четыре.
%>
← →
OSokin (2008-01-23 14:28) [21]А в самом обработчике исключений в [3] исключение может возникнуть в нескольких местах ;)
> ErrorS := TSTringList.Create;
> Image1.Picture.SaveToFIle(FileName);
> ADOQuerySp.execsql;
И это на первый взгляд ;)
← →
Dennis I. Komarov © (2008-01-23 14:31) [22]Вот почему исходники так много весят...
← →
Игорь Шевченко © (2008-01-23 14:37) [23]1. пишем юнит-тесты.
2. при возникших исключениях отправляется письмо разработчику с детальной информацией об исключении и несколькими последними действиями пользователя.
← →
Галинка © (2008-01-23 14:43) [24]Про исключения. Тестится программа не на такие ошибки. А на ошибки логики сорее. Или на просчеты. По ним исключения не выдаются, но программа работает не так как хотелось бы. Вот и хочется посмотреть, что же мы там имеем.
← →
Palladin © (2008-01-23 14:46) [25]
> [24] Галинка © (23.01.08 14:43)
А это и есть самый распространенный тип ошибки. Люди тут на исключения съехали, а ловить то не их нужно (они сами поймаются), а логику исполнения приведшую к ним.
← →
OSokin (2008-01-23 14:50) [26]
> Галинка © (23.01.08 14:43) [24]
Все равно логами и MessageBox"ами проблему решаю. Просто вывожу на экран или в лог значения необходимых переменных и проверяю. Хотя проще всего использовать консольное окно для этого.
← →
Kolan © (2008-01-23 14:53) [27]> 2. при возникших исключениях отправляется письмо разработчику
> с детальной информацией об исключении и несколькими последними
> действиями пользователя.
Можно пример простой? Как выглядит процедцра с исключением, без посылки писем ессно :)
← →
Игорь Шевченко © (2008-01-23 15:36) [28]Kolan © (23.01.08 14:53) [27]
> Можно пример простой? Как выглядит процедцра с исключением,
> без посылки писем ессно :)
Процедура с исключением выглядит также, как обычная процедура. Исключения в ней могут возникнуть во время работы из-за неверных данных, неверной логики и т.п.
Процедура обработки исключений выглядит как обработчик события Application.OnException
← →
Sandman25 (2008-01-23 15:44) [29]1. Unit test
2. assert
3. LOG.debug(...)
PS. Java рулит :)
← →
Mystic © (2008-01-23 15:55) [30]> Sandman25 (23.01.08 15:44) [29]
Иногда этого недостаточно :) Взять, например, генератор ходов в шахматах. Как при помощи указанных инструментов проверить, что он правильно генерирует все возможные ходя для любой позиции?
← →
engine © (2008-01-23 15:57) [31]Может кто-нибудь пояснить, что за зверь такой — юнит-тест.
Где можно почитать про это?
← →
Sandman25 (2008-01-23 15:58) [32]Mystic © (23.01.08 15:55) [30]
3. LOG.debug(...)
← →
Марсер © (2008-01-23 16:07) [33]
> Riply © (23.01.08 13:08) [1]
>
> > [0] Галинка © (23.01.08 13:05)
> Меня очень "логи" выручают.
+100
Правда, в моей специфике без них вообще сложно...
← →
Игорь Шевченко © (2008-01-23 16:27) [34]
> Может кто-нибудь пояснить, что за зверь такой — юнит-тест.
>
> Где можно почитать про это?
тут: http://www.exprogramming.ru/
← →
Галинка © (2008-01-23 16:53) [35]дык когда писалось на си без возможности отладки, тогда логи само собой. Но блин трасировка тоже достает.
сделала лог. Сразу исправила 3 бага.
"Спасибо этому дому" (с)
← →
data © (2008-01-23 17:16) [36]
> В основном интересует ситуация, если ошибка/баг вылазит
> не все время
логи, и отдел тестирования стоит напрячь
← →
Галинка © (2008-01-23 17:36) [37]data © (23.01.08 17:16) [36]
"Мы говорим Партия, подразумеваем Ленин. Мы говорим Ленин, подразумеваем Партия" (за точность не ручаюсь). Отдел тестирования это я... пока во всяком случае.
← →
vpbar © (2008-01-23 17:37) [38]исключения проверяю штукой типа madExcept. А логические ошибки логированием всего и вся.
← →
Kenny (2008-01-23 19:17) [39]В Delphi очень не хватает джавовского стека вызовов при исключениях...
← →
Mystic © (2008-01-23 19:20) [40]> Sandman25 (23.01.08 15:58) [32]
>
> 3. LOG.debug(...)
LOG.debug(...) помогает исправить ошибку. Но для этого ее еще надо найти :)
← →
Mystic © (2008-01-23 19:21) [41]Т. е. обнаружить. А при помощи LOG.debug() ты находишь саму ошибку в коде и исправляешь.
← →
Kolan © (2008-01-23 19:24) [42]>
> Процедура обработки исключений выглядит как обработчик события
> Application.OnException
А имя процедуры не отправляется например?
← →
@!!ex © (2008-01-23 19:27) [43]> Нужно тестировать не проект вцелом, а "кубики" из которых
> проект сделан...
> В папке с проектом имеем папку TEST с набором тестовых приложений
> для тестирования "кубиков"
Это конечно хорошо, но на практике мало реализуемо... особенно у нас. :((
Да и вообще, тесты - это скорее из рода фантастики, слишком сложно, слишком долго писать тесты для всего....
поэтому их применение очень редко(Я в бытность работы в 4 относительно немаленьких конторах, не видел использования мелких тестов ниразу, максимум - глобальный тест, который тестирует все, и то не автоматически, а просто выводит данные, на которые уже ориентируется программер).
← →
Kenny (2008-01-23 19:42) [44]> тесты - это скорее из рода фантастики
У кого как.. )
← →
Псалтырь (2008-01-23 21:10) [45]eurekalog.com
← →
iZEN © (2008-01-23 23:13) [46]
> Галинка © (23.01.08 14:43) [24]
>
> Про исключения. Тестится программа не на такие ошибки. А
> на ошибки логики сорее. Или на просчеты. По ним исключения
> не выдаются, но программа работает не так как хотелось бы.
> Вот и хочется посмотреть, что же мы там имеем.
В простейшем случае:
System.out.println("Случилась бяка: " + msg);
(работает везде)
В других случаях:
1) Assert"s
2) JUnit Case
3) Java Platform Debugger Architecture (JPDA)
← →
Игорь Шевченко © (2008-01-23 23:14) [47]
> А имя процедуры не отправляется например?
Всенепременно отправляется. Весь стек вызовов, который доступен.
← →
Галинка © (2008-01-23 23:42) [48]всем. Я теперь ужо недели три как опять приземлилась на шарпе. Опять разукрашиваю. Только теперь текст. Вот и надо смотреть, в правильные ли места записались символы форматирования.
@!!ex © (23.01.08 19:27) [43]
почти правильно. Потому как труд тестеров тоже стоит деньгов. А программеры заняты текущими проектами. Поэтому тестим на скорую руку непосредственно перед "внедрением в производство". ((
И проблема всегда остается - видишь не то, что накодено, а то, что хотелось бы видеть. Никогда не забуду, как два дня билась над SQL-запросом, а потом оказалось, что я двоеточее там где-то забыла. ((( И не увидишь это сразу (((
← →
MsGuns © (2008-01-24 09:26) [49]>data © (23.01.08 17:16) [36]
>и отдел тестирования стоит напрячь
Да че там мелочиться с отделом - можно сразу напрячь всю корпорацию тестирования ;)
← →
Sandman25 (2008-01-24 11:21) [50]Mystic © (23.01.08 19:20) [40]
У меня LOG.debug ставится не тогда, когда надо найти ошибку, а почти после каждой строчки. Так что по логам можно узнать и значения переменных, и путь выполнения программы (в какой ветке if был, сколько раз выполнился while) и т.д.
Так что по такому логу искать ошибку одно удовольствие.
← →
Sandman25 (2008-01-24 11:23) [51]Mystic © (23.01.08 19:21) [41]
А. Теперь понял. Такого инструмента в принципе быть не может: если у неизвестной задачи известен ответ, то это не задача :)
← →
Asker (2008-01-24 15:09) [52]unit-тесты это инструмент разработчика, а не тестера
иначе уверенности в работоспособности нету никакой
непроверенный код - это нерабочий код - один из утверждений юнит-тестирования)
← →
iZEN (2008-01-24 16:00) [53]
> Asker (24.01.08 15:09) [52]
>
> unit-тесты это инструмент разработчика, а не тестера
> иначе уверенности в работоспособности нету никакой
> непроверенный код - это нерабочий код - один из утверждений
> юнит-тестирования)
Вопрос о качестве покрытия кода unit-тестами у вас не стоит?
Как вы определяете, нужно ли писать unit-тест или нет? (принцип: "сначала пишется тест" часто ли вы соблюдаете?)
← →
Asker (2008-01-24 17:30) [54]iZEN (24.01.08 16:00) [53]
есть же утилиты проверяющие покрытие кода, а код для которого нужно писать тесты или нет непростой, обычно нужно писать для всего кроме того для чего уже писались тесты в прошлом(сходные операции) и стало быть в работоспособности нету сомнений
← →
Марсер © (2008-01-24 21:50) [55]
> data © (23.01.08 17:16) [36]
>
>
> > В основном интересует ситуация, если ошибка/баг вылазит
> > не все время
>
> логи, и отдел тестирования стоит напрячь
Господи, и живут же люди! :-(
← →
Марсер © (2008-01-24 21:50) [56]
> data © (23.01.08 17:16) [36]
>
>
> > В основном интересует ситуация, если ошибка/баг вылазит
> > не все время
>
> логи, и отдел тестирования стоит напрячь
Господи, и живут же люди! :-(
← →
Mystic © (2008-01-29 12:42) [57]> У меня LOG.debug ставится не тогда, когда надо найти ошибку,
> а почти после каждой строчки. Так что по логам можно узнать
> и значения переменных, и путь выполнения программы (в какой
> ветке if был, сколько раз выполнился while) и т.д.
> Так что по такому логу искать ошибку одно удовольствие.
Вспоминаю один свой проект: восстановление трехмерной поверхности по результатам интерференции в белом свете . Там анализировалось и обрабатывалось ~50-200 Mb информации. Мысленно представил себе лог, который протоколирует каждое действие... Вряд ли бы я дождался бы окончание логирования...
← →
Sandman25 (2008-01-29 13:20) [58]Mystic © (29.01.08 12:42) [57]
if (LOG.isDebugEnabled()){
for (...){
LOG.debug(..);
...
}
}
else
for (...){
...
}
← →
Mystic © (2008-01-29 14:44) [59]> Sandman25 (29.01.08 13:20) [58]
Ну так отладка и занимала все время. Точнее смесь отладки/составления алгоритма и т. д. Просто если есть лог в котором записан миллион шагов, то по этому логу я не смогу дойти до места ошибки, не смогу определить, а была ли ошибка, или это выброс в данных...
Обычно процесс шел таким образом: выполняем некоторый шаг в MATAB. Потом строим по промежуточным данным всякие графики. Берем сомнительные места. Прогоняем на них все наши вычисления еще раз. И т. д. и т. п.
← →
Галинка © (2008-01-29 14:53) [60]Mystic © (29.01.08 14:44) [59]
вообще-то это больше похоже на выверку мат.модели, а не на анализ работы программы.
← →
Sandman25 (2008-01-29 15:23) [61]Mystic © (29.01.08 14:44) [59]
Никто не заставляет писать миллион шагов. В каждом классе свой логгер, а в конфигурационных файлах прописано, какие логгеры какую информацию выводят, причем настройки иерархические. Например, все логгеры из пакета (и вложенных пакетов) com.foo.bar работают в режиме INFO, логгер com.foo.bar.dog работает в режиме DEBUG, остальные логгеры работают в режиме ERROR. То есть можно динамически включать только те сообщения, которые нужны.
← →
Mystic © (2008-01-29 15:24) [62]> Галинка © (29.01.08 14:53) [60]
Математический софт тоже ведь надо отлаживать?
← →
Mystic © (2008-01-29 15:38) [63]> Sandman25 (29.01.08 15:23) [61]
Не помогает это никак :) Потому что я должен логировать все, потому что я не знаю, что меня заинтересует при последующем просмотре. Т. е. я не знаю заранее, какой шаг из миллиона меня заинтересует.
Например, разрешение камеры 400 x 1600, я делаю попиксельную обработку 800 фреймов. Соответственно или лог будет на каждый пиксел, либо его вообще не будет. Либо мне прийдется заранее вычислить интересные точки
if (IsInterestPoint(x, y))
log(something);
что тоже не очень удачно, потому что интерес к точке (x, y) может породить интерес к точке (x1, y1), для этого надо будет еще раз запускать всю программу и т. п. Да и построить графики по результатам надо будет в каком-то другом приложении...
← →
Sandman25 (2008-01-29 16:11) [64]Mystic © (29.01.08 15:38) [63]
То есть грубо говоря, приходит случайный невоспроизводимый набор данных, интересно буквально всё, но записывать всё не хочется? Тогда, конечно, наука бессильна :)
← →
Mystic © (2008-01-29 17:04) [65]> Тогда, конечно, наука бессильна :)
Почему бессильна? Тут рулит MATLAB :) Вообще спасет любая интерпретация, когда нет никаких проблем в отладке выполнить еще парочку операторов, построить график и т. п. Другой вариант --- самому писать аналогичную консоль.
← →
Sandman25 (2008-01-29 17:09) [66]Mystic © (29.01.08 17:04) [65]
Это называется отладка: приостановил выполнение, посмотрел переменные, изменил их значение, продолжил...
← →
Mystic © (2008-01-29 20:11) [67]> Это называется отладка: приостановил выполнение, посмотрел
> переменные, изменил их значение, продолжил...
Посмотреть мало. Надо экспортнуть, построить графики, возможно пофильтровать, и т. п. Т. е. обычно при отладке таких вещей используется нечто больше, чем просто "посмотреть".
← →
Loginov Dmitry © (2008-01-30 00:35) [68]> собсно сабж. В основном интересует ситуация, если ошибка/баг
> вылазит не все время (т.е. при трассировке то вылазит, то
> нет).
Если у пользователя один раз произошел глюк, то он наверняка произойдет и второй, и пятый, и десятый. Единственный надежный и эффективный способ отладки (на компьютере пользователя) - это писать в лог по возможности все этапы работы программы. Во всех ее потоках. Все сообщения об ошибках. Все имена функций (цепочку вызовов, приведших к ошибке). Однако это приведет к сильному увеличению размеров логов, так что можно в программе предусмотреть настройку, включающую либо отключающую ведение таких детальных логов. Пользователь напорится на ошибку раз, второй, затем включит детальный лог, сэмитирует ошибку еще раз и отправит лог разработчику. Уверен, не многие таким способом пользуются :)
На самом деле отладка - это слишком сложная тема, чтобы давать какие-либо однозначные рекомендации. Если можно, то лучше отлаживать и тщательнейшим образом тестировать программу до выхода в тираж.
← →
Sandman25 (2008-01-30 08:42) [69]Mystic © (29.01.08 20:11) [67]
То есть всё упирается в экспорт. Если есть экспорт, с данными можно делать всё, что угодно.
← →
Mystic © (2008-01-30 11:29) [70]> Sandman25 (30.01.08 08:42) [69]
Я уже писал: в данном случае мне очень помогал MATLAB: отлаживаешь/составляешь алгоритм в нем, а потом просто в C++ добиваешься идентичной работы уже имея промежуточные результаты. Как вариант можно использовать отладочную консоль, где бы можно было во время работы программы экспортнуть нужный вектор.
В общем общей панацеи, которая бы работала во всех случаях, нет. С другой стороны мне рассказывали об одном человеке, который обходился вообще без отладки. Программу на C++ набирал в Far. Потом долго смотрел на нее. Считал, что если в программе остались синтаксические ошибки, то наверняка в ней есть и семантические. Как только изучение исходного текста проходило его требовательный взгляд, программа компилировалась (без ошибок компиляции) и баги в ней были очень редки :)
← →
ketmar © (2008-01-30 11:31) [71]>[70] Mystic ©(30.01.08 11:29)
там ошибка была уже в прокладке, которая выбрала C++ (я не холиварю! %-)
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2008.03.02;
Скачать: [xml.tar.bz2];
Память: 0.65 MB
Время: 0.036 c