Чтение лога скриптом Тест Комплита
#1
Отправлено 16 апреля 2008 - 15:42
Использую TestComplete 6, язык JScript.
После запуска скриптов нужно вывести текст лога в email.
Но удается обратиться только к последнему завершенному логу. То есть, если попыпаться обратиться к последнему логу непосредственно из запущенных тестовых скриптов (сразу после них в коде), определяется лог предыдущего запуска, а не текущий.
Поэтому, чтобы прочитать лог моих тестов, я запускаю после них другой скрипт, который находит последний завершенный лог в Тест Комплите.
Выглядит это так:
iCount = Project.Logs.LogItemsCount; // общее количество проектных логов
ALogItem = Project.Logs.LogItem( iCount - 1 ); // последний лог
Может быть, все таки существует способ обратиться к текущему логу, а не к предыдущему?
Заранее спасибо.
#2
Отправлено 17 апреля 2008 - 03:43
1. Выполнить проект ещё раз с ключём, который будет говорить скрипту, что надо просто распарсить лог предыдущего выполнения.
2. Экспортировать текущий лог во внешний файл и распарсить его, как обычный XML. Я нашёл пример. Он для TestComplete 4, однако, думаю, его можно будет переделать под TestComplete 6.
Дмитрий
#3
Отправлено 17 апреля 2008 - 04:44
procedure ExportResults;
var
FileName:OleVariant;
begin
FileName:=Project.ConfigPath+'Log\'+VarToString(Project.Variables.VariableByName['NumberOfTheFile'])+'MyResults.mht';
Log.SaveResultsAs(FileName,2);
FileName:=Project.ConfigPath+'Log\'+VarToString(Project.Variables.VariableByName['NumberOfTheFile'])+'MyResults.htm';
Log.SaveResultsAs(FileName,1);
end;
Потом думаю можно прикрепить этот файл к емайлу.
#4
Отправлено 17 апреля 2008 - 17:59
Кому интересно, код выглядит так:
// Global variables
var sSTARTED_TIME;
var sFINISHED_TIME;
var iPASSED = 0;
var iFAILED = 0;
//------------------------------------------------------------------------------------------------------------
// Exporting the log
function ExportLog()
{
var iIdx, ALogItem, Scheme, sText = "";
var iCount = Project.Logs.LogItemsCount;
if( iCount == 0 )
{
// If the project does not contain log items,
// post a message about this to the test log
Log.Message( "No logs for export." );
return;
}
else
{
// Get the last log data
ALogItem = Project.Logs.LogItem( iCount - 1 );
// For each parent node in the log
for( iIdx = 0; iIdx < ALogItem.ChildCount; iIdx++ )
{
//ExportLogData( ALogItem.Data( i ) );
Scheme = ALogItem.Child( iIdx ).Child( 0 ).Data( 0 ).Scheme;
// Determining the type of log item's data and exporting the data
switch( Scheme.DataType )
{
case ldtTable :
sText += ExportTable( ALogItem.Child( iIdx ).Child( 0 ).Data( 0 ) ); // Exporting table data
break;
}
}
}
SendEmailReport( sText );
}
//------------------------------------------------------------------------------------------------------------
// Exporting table data
function ExportTable( ALogData )
{
var sVerdict, iIdx, sText = "", Row;
var sGap = " ";
// Iterating through table records and exporting table data
for( iIdx = 0; iIdx < ALogData.RowCount; iIdx++ )
{
// Obtaining the row object
Row = ALogData.Rows( iIdx );
// Get started time
sSTARTED_TIME = VarToStr( ALogData.Rows( 0 ).ValueByIndex( 2 ) );
// Get parent log node
sText += GetParentNode( Row, sGap );
// Get child log nodes
sText += GetChildNodes( Row, "", sGap );
}
return sText;
}
//------------------------------------------------------------------------------------------------------------
function GetChildNodes( LogRow, sText, sGap )
{
var iIdx, Row;
var iCoint = LogRow.ChildRowCount;
if( iCoint == 0 )
return sText;
sGap += " ";
for( iIdx = 0; iIdx < iCoint; iIdx++ )
{
Row = LogRow.ChildRow( iIdx );
// Get parent log node
sText += GetParentNode( Row, sGap );
// Get child log nodes: recursion
sText = GetChildNodes( Row, sText, sGap );
}
return sText;
}
//------------------------------------------------------------------------------------------------------------
function GetParentNode( Row, sGap )
{
var sText, sVerdict;
var sMessage = VarToStr( Row.ValueByIndex( 6 ) );
// Get finished time
sFINISHED_TIME = VarToStr( Row.ValueByIndex( 2 ) );
if( Row.ChildRowCount == 0)
switch ( sMessage )
{
case "Message":
{
sVerdict = "<FONT color=\"blue\"> Passed <br>";
iPASSED++;
break;
}
case "Error":
{
sVerdict = "<FONT color=\"red\"> Failed <br>";
iFAILED++;
break;
}
}
else
sVerdict = "<br>";
if( VarToStr( sMessage ) != "Event" )
sText = sGap + "<FONT color=\"black\">" + VarToStr( Row.ValueByIndex(1) ) + sVerdict;
else
sText = "";
return sText;
}
//------------------------------------------------------------------------------------------------------------
function SendEmailReport( sText )
{
var sVerdict, sCaption, sSummary;
var schema = "http://schemas.micro...onfiguration/";
var mConfig = Sys.OleObject("CDO.Configuration");
with( mConfig.Fields )
{
Item(schema + "sendusing") = 2; // cdoSendUsingPort
Item(schema + "smtpserver") = "blabla"; // SMTP server
Item(schema + "smtpserverport") = 25; // Port number
Item(schema + "sendusername") = ""; // User name (if needed)
Item(schema + "sendpassword") = ""; // User password (if needed)
Update();
}
var Msg = Sys.OleObject("CDO.Message");
Msg.Configuration = mConfig;
Msg.BodyPart.Charset = "windows-1251";
Msg.From = "blabla@mail.ru";
Msg.To = "blabla@mail.ru";
sVerdict = ( iFAILED == 0 ) ? "Passed" : "Failed";
sSummary = "SXP automated test " + sVerdict;
sCaption = "<FONT face=\"arial\" size=2 color=\"black\">" + sSummary + "<br><br>";
sCaption += "Started on: " + sSTARTED_TIME + "<br>"
sCaption += "Completed on: " + sFINISHED_TIME + "<br>";
sCaption += "Operating system: " + Sys.OSInfo.Name + "<br><br>";
sCaption += "Total tests: " + VarToStr( iPASSED + iFAILED ) + "<br>";
sCaption += " " + "<FONT color=\"blue\">Passed: " + iPASSED + "<br>";
sCaption += " " + "<FONT color=\"red\">Failed: " + iFAILED + "<br><br>";
sCaption += "<FONT color=\"black\">Details:<br>";
Msg.Subject = sSummary;
Msg.HTMLBody = sCaption + sText;
Msg.Send();
}
#5
Отправлено 18 апреля 2008 - 05:12
Почему же нельзя? Можно в ТестИтемс поставить count>1 (count = 2) и будет скрипт выполняться дважыСпасибо за ответы. Пришлось в батнике 2 раза запускать TestComplete с разными ключами. Насколько я понимаю, не перезапуская TC, нельзя 2 раза запускать проектные скрипты.
#6
Отправлено 18 апреля 2008 - 08:28
Почему же нельзя? Можно в ТестИтемс поставить count>1 (count = 2) и будет скрипт выполняться дважыСпасибо за ответы. Пришлось в батнике 2 раза запускать TestComplete с разными ключами. Насколько я понимаю, не перезапуская TC, нельзя 2 раза запускать проектные скрипты.
А можно поподробнее?
Командная строка ТестКомплита выглядит так:
TestComplete.exe [file_name [/run [(/project:project_name) | (/project:project_name /projectitem:item_name) |
(/project:project_name /unit:unit_name /routine:routine_name)] [/exit]][/SilentMode][/ns]
Никаких count и TestItems я здесь не обнаружила.
Поэтому в первый раз я запускаю весь проект, а второй раз только нужный unit и routine, который экспортирует лог.
Как должна выглядеть командная строка, чтобы не перезапускать ТестКомплит?
#7
Отправлено 18 апреля 2008 - 12:35
#8
Отправлено 18 апреля 2008 - 15:49
Мне кажется, что если поставить Count = 2 или просто определить ещё один Test Item (см. раздел справки 'Specifying Execution Order for Tests'), то это всё равно будет только одно выполнение проекта. Два отдельных выполнения проекта без перезагрузки ТС возможны через его COM объект (раздел справки 'Working With TestComplete via COM').
Дмитрий
#9
Отправлено 22 апреля 2008 - 15:16
#10
Отправлено 22 апреля 2008 - 15:18
#11
Отправлено 24 апреля 2008 - 03:42
Можно делать всё через WSH скрипты. Например:
// RunTest.js var oTestComplete = WScript.CreateObject("TestComplete.TestCompleteApplication"); var oIntegrationObject = oTestComplete.Integration; oIntegrationObject.OpenProjectSuite("c:\\MyTests\\ProjSuite1\\ProjSuite1.pjs"); oIntegrationObject.RunRoutine("MyProject", "MyUnit", "MyFunction"); while (oIntegrationObject.IsRunning()) { WScript.Sleep(500); } var oTestCompleteResults = oIntegrationObject.GetLastResultDescription(); if (oTestCompleteResults.Status == 0) { WScript.Echo("The test complete run finished successfully"); } else if (oTestCompleteResults.Status == 1) { WScript.Echo("Warning messages were posted to the test log"); } else if (oTestCompleteResults.Status == 2) { WScript.Echo("Error messages were posted to the test log"); }
Дмитрий
#12
Отправлено 07 мая 2008 - 12:13
#13
Отправлено 06 июня 2008 - 09:37
[codebox]function GeneralEvents_OnStopTest(Sender)
{
var File;
var schema;
var mCfg;
var mMsg;
// в эти переменные присвоить параметры почтовой рассылки
var Mail_smtpserver; // адрес SMTP-сервера (сервер отправки почты, обычно работает через порт 25 -- smtpserverport)
// при использовании ExchangServer надо "sendusing" (см. ниже) присвоить 3, но мне не удалось реализовать отпраку через ExchangServer, по тому привожу рабочий пример с SMTP
var Mail_sendusername; // имя, отображаемое в графе "От:"
var Mail_From; // аккаунт, из которого будет произведена отправка
var Mail_To; // аккаунт получателя (можно список, разделённый "," -- CSV)
File = FormatDateTime("dd_mm_yyyy_hh_nn_ss_zzz", Now()) + ",mht";
Log.Message("Все тесты завершены", "Сейчас будет сформировано экспортированний журнал " + File + " и отправлено его адресатам [" + Mail_To + "]");
File = Project.ConfigPath + "Log\\" + File;
if (Log.SaveResultsAs(File, 2)) // 0 - XML+картинки, 1 - HTML+картинками; 2 - MHT (полная HTML-страничка с картинками и всем, чем положено, одним файлом)
{
schema = "http://schemas.micro...onfiguration/";
mCfg = Sys.OleObject("CDO.Configuration");
try
{
mCfg.Fields.Item(schema + "sendusing") = 2;
mCfg.Fields.Item(schema + "smtpserver") = Mail_smtpserver;
mCfg.Fields.Item(schema + "smtpserverport") = 25;
mCfg.Fields.Item(schema + "sendusername") = Mail_sendusername;
mCfg.Fields.Item(schema + "sendpassword") = "";
mCfg.Fields.Update();
mMsg = Sys.OleObject("CDO.Message");
try
{
mMsg.Configuration = mCfg;
mMsg.From = Mail_From;
mMsg.To = Mail_To;
mMsg.BodyPart.Charset = "koi8-r"; // можно исключить; по умолчанию ANSI, для Восточной Европы и РФ это "cp1251"
mMsg.Subject = "Журнал тестирования за " + FormatDateTime("dd.mm.yyyy", Now());
mMsg.TextBody = "Сохраните вложение, замените \",\" на \".\" (иначе не удаётся передати без потерь).";
// Можно mMsg.HTMLBody .
// На момент ниписания не было архиватора, а то хотел еще прикрутить slPacker передавать архив...
// но вот *.mht через CDO не хочет нормально передаваться, а HTML с картинками -- не отоха было морочиться (список файлов можно получить из Sys.OleObject("Scripting.FileSystemObject")).
mMsg.AddAttachment(File); // прикреплять можно несколько файлов -- каждый по отдельности
mMsg.Send();
}
catch(exception)
{
Log.Error("Exception", exception.description);
Log.Warning("Почта не отправлена.", "From: " + mMsg.From + "\r\nTo: " + mMsg.To + "\r\nSubject: " + mMsg.Subject + "\r\nAttachment: \"" + File + "\"\r\nBody:\r\n«" + mMsg.TextBody + "»");
}
finally
{
mMsg = null;
CollectGarbage();
}
}
catch(exception)
{
Log.Error("Exception", exception.description);
}
finally
{
mCfg = null;
CollectGarbage();
}
}
else
Log.Warning("Не удалося экспортировать журнал.");
}[/codebox]
#14
Отправлено 10 июня 2008 - 13:29
Если еще актуально -- вот скриптик который после выполнения проекта (не сьюта) на событии OnStopTest сохраняет логи в *.mht и отправляет на е-мейл...
А вот у меня была проблема, что ТС5 вызывает это событие не по окончанию всех тестов, а по окончании каждого... Тоже хотел сделать нотификацию, но не вышло...
Или мы говорим о разных версиях ТС?
Андрей Похилько
#15
Отправлено 11 июня 2008 - 03:35
Действительно, события OnStartTest и OnStopTest срабатывают для каждого Test Item. Однако, если уж вы используете Test Items, то вы можете просто добавить ещё один в конец, в котором и выполнять все необходимые действия.
Дмитрий
#16
Отправлено 11 июня 2008 - 13:07
Здравствуйте.
Действительно, события OnStartTest и OnStopTest срабатывают для каждого Test Item. Однако, если уж вы используете Test Items, то вы можете просто добавить ещё один в конец, в котором и выполнять все необходимые действия.
Но что делать если проект завалился посередине? Он не дойдет до этого элемента и не сделает нужных действий... Вообще странно что такого очевидного и нужного Event'а они не сделали...
Андрей Похилько
#17
Отправлено 12 июня 2008 - 03:39
Можете отправить запрос им в службу поддержки. Насколько я знаю, они все пожелания пользователей фиксируют и, когда запрос получает достаточно высокий "рейтинг", его реализуют.
Дмитрий
#18
Отправлено 16 июня 2008 - 06:42
Здравствуйте.
Можете отправить запрос им в службу поддержки. Насколько я знаю, они все пожелания пользователей фиксируют и, когда запрос получает достаточно высокий "рейтинг", его реализуют.
Мои ощущения от общения с ними таковы, что они переключились на работу с версией 6, которая стоит 2 000 долларов, а версию 5, которая стоит в два раза дешевле, задвинули в дальний ящик... Год назад они исправляли хотя бы 1 из 5 багов которые мы им постили, теперь тишина. Так что я разочаровался в этом варианте.
Но мы уже обходимся другими средствами для нотификации...
Андрей Похилько
#19
Отправлено 16 июня 2008 - 11:23
На мой взгляд, логично работать над новой версией продукта, уделяя при этом минимум внимания старой. Да и вопрос про OnStartTest и OnStopTest тоже, как мне кажется, не является багом. Скорее, отсутствием фичи.
Дмитрий
#20
Отправлено 17 июня 2008 - 08:19
Если еще актуально -- вот скриптик который после выполнения проекта (не сьюта) на событии OnStopTest сохраняет логи в *.mht и отправляет на е-мейл.
function GeneralEvents_OnStopTest(Sender){ var File; var schema; var mCfg; var mMsg; // в эти переменные присвоить параметры почтовой рассылки var Mail_smtpserver; // адрес SMTP-сервера (сервер отправки почты, обычно работает через порт 25 -- smtpserverport) // при использовании ExchangServer надо "sendusing" (см. ниже) присвоить 3, но мне не удалось реализовать отпраку через ExchangServer, по тому привожу рабочий пример с SMTP var Mail_sendusername; // имя, отображаемое в графе "От:" var Mail_From; // аккаунт, из которого будет произведена отправка var Mail_To; // аккаунт получателя (можно список, разделённый "," -- CSV) File = FormatDateTime("dd_mm_yyyy_hh_nn_ss_zzz", Now()) + ",mht"; Log.Message("Все тесты завершены", "Сейчас будет сформировано экспортированний журнал " + File + " и отправлено его адресатам [" + Mail_To + "]"); File = Project.ConfigPath + "Log\\" + File; if (Log.SaveResultsAs(File, 2)) // 0 - XML+картинки, 1 - HTML+картинками; 2 - MHT (полная HTML-страничка с картинками и всем, чем положено, одним файлом) { schema = "http://schemas.microsoft.com/cdo/configuration/"; mCfg = Sys.OleObject("CDO.Configuration"); try { mCfg.Fields.Item(schema + "sendusing") = 2; mCfg.Fields.Item(schema + "smtpserver") = Mail_smtpserver; mCfg.Fields.Item(schema + "smtpserverport") = 25; mCfg.Fields.Item(schema + "sendusername") = Mail_sendusername; mCfg.Fields.Item(schema + "sendpassword") = ""; mCfg.Fields.Update(); mMsg = Sys.OleObject("CDO.Message"); try { mMsg.Configuration = mCfg; mMsg.From = Mail_From; mMsg.To = Mail_To; mMsg.BodyPart.Charset = "koi8-r"; // можно исключить; по умолчанию ANSI, для Восточной Европы и РФ это "cp1251" mMsg.Subject = "Журнал тестирования за " + FormatDateTime("dd.mm.yyyy", Now()); mMsg.TextBody = "Сохраните вложение, замените \",\" на \".\" (иначе не удаётся передати без потерь)."; // Можно mMsg.HTMLBody . // На момент ниписания не было архиватора, а то хотел еще прикрутить slPacker передавать архив... // но вот *.mht через CDO не хочет нормально передаваться, а HTML с картинками -- не отоха было морочиться (список файлов можно получить из Sys.OleObject("Scripting.FileSystemObject")). mMsg.AddAttachment(File); // прикреплять можно несколько файлов -- каждый по отдельности mMsg.Send(); } catch(exception) { Log.Error("Exception", exception.description); Log.Warning("Почта не отправлена.", "From: " + mMsg.From + "\r\nTo: " + mMsg.To + "\r\nSubject: " + mMsg.Subject + "\r\nAttachment: \"" + File + "\"\r\nBody:\r\n«" + mMsg.TextBody + "»"); } finally { mMsg = null; CollectGarbage(); } } catch(exception) { Log.Error("Exception", exception.description); } finally { mCfg = null; CollectGarbage(); } } else Log.Warning("Не удалося экспортировать журнал.");}
А что за параметр Sender? откуда и как его взять?
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных