Перейти к содержимому

Фотография

Чтение лога скриптом Тест Комплита


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 33

#1 Ksenia

Ksenia

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Дружинская Ксения
  • Город:Санкт-Петербург


Отправлено 16 апреля 2008 - 15:42

Добрый день,

Использую TestComplete 6, язык JScript.

После запуска скриптов нужно вывести текст лога в email.
Но удается обратиться только к последнему завершенному логу. То есть, если попыпаться обратиться к последнему логу непосредственно из запущенных тестовых скриптов (сразу после них в коде), определяется лог предыдущего запуска, а не текущий.
Поэтому, чтобы прочитать лог моих тестов, я запускаю после них другой скрипт, который находит последний завершенный лог в Тест Комплите.

Выглядит это так:
iCount = Project.Logs.LogItemsCount; // общее количество проектных логов
ALogItem = Project.Logs.LogItem( iCount - 1 ); // последний лог

Может быть, все таки существует способ обратиться к текущему логу, а не к предыдущему?

Заранее спасибо.
  • 0

#2 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 17 апреля 2008 - 03:43

Здравствуйте.

1. Выполнить проект ещё раз с ключём, который будет говорить скрипту, что надо просто распарсить лог предыдущего выполнения.

2. Экспортировать текущий лог во внешний файл и распарсить его, как обычный XML. Я нашёл пример. Он для TestComplete 4, однако, думаю, его можно будет переделать под TestComplete 6.
  • 0
С уважением,
Дмитрий

#3 Tuchka_84

Tuchka_84

    Активный участник

  • Members
  • PipPip
  • 105 сообщений
  • ФИО:Маша

Отправлено 17 апреля 2008 - 04:44

Я сохраняю лог текущего скрипта в файлы mht и htm. Если поможет вот пример:
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;

Потом думаю можно прикрепить этот файл к емайлу.
  • 0

#4 Ksenia

Ksenia

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Дружинская Ксения
  • Город:Санкт-Петербург


Отправлено 17 апреля 2008 - 17:59

Спасибо за ответы. Пришлось в батнике 2 раза запускать TestComplete с разными ключами. Насколько я понимаю, не перезапуская TC, нельзя 2 раза запускать проектные скрипты.

Кому интересно, код выглядит так:

// 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();
}
  • 0

#5 Tuchka_84

Tuchka_84

    Активный участник

  • Members
  • PipPip
  • 105 сообщений
  • ФИО:Маша

Отправлено 18 апреля 2008 - 05:12

Спасибо за ответы. Пришлось в батнике 2 раза запускать TestComplete с разными ключами. Насколько я понимаю, не перезапуская TC, нельзя 2 раза запускать проектные скрипты.

Почему же нельзя? Можно в ТестИтемс поставить count>1 (count = 2) и будет скрипт выполняться дважы
  • 0

#6 Ksenia

Ksenia

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Дружинская Ксения
  • Город:Санкт-Петербург


Отправлено 18 апреля 2008 - 08:28

Спасибо за ответы. Пришлось в батнике 2 раза запускать TestComplete с разными ключами. Насколько я понимаю, не перезапуская TC, нельзя 2 раза запускать проектные скрипты.

Почему же нельзя? Можно в ТестИтемс поставить count>1 (count = 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, который экспортирует лог.
Как должна выглядеть командная строка, чтобы не перезапускать ТестКомплит?
  • 0

#7 Tuchka_84

Tuchka_84

    Активный участник

  • Members
  • PipPip
  • 105 сообщений
  • ФИО:Маша

Отправлено 18 апреля 2008 - 12:35

Я имела ввиду зайти в ТестКомплит.Открыть свой проект, нажать на него правой кнопкой там будет Edit-TestItems.Откроется Форма со свойствами теститема в ней можно задать Count - т.е. число раз которые будет запускаться скрипт. Может если я Вас не так поняла извините :rtfm:
  • 0

#8 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 18 апреля 2008 - 15:49

Здравствуйте.

Мне кажется, что если поставить Count = 2 или просто определить ещё один Test Item (см. раздел справки 'Specifying Execution Order for Tests'), то это всё равно будет только одно выполнение проекта. Два отдельных выполнения проекта без перезагрузки ТС возможны через его COM объект (раздел справки 'Working With TestComplete via COM').
  • 0
С уважением,
Дмитрий

#9 Ksenia

Ksenia

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Дружинская Ксения
  • Город:Санкт-Петербург


Отправлено 22 апреля 2008 - 15:16

Да, мне надо автоматически из батника запускать автоматизацию ночью после построения билда, так что этот способ не подходит.
  • 0

#10 Ksenia

Ksenia

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Дружинская Ксения
  • Город:Санкт-Петербург


Отправлено 22 апреля 2008 - 15:18

Спасибо, Dmitry N, про COM я не знала, это интересно, буду разбираться.
  • 0

#11 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 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");
}

  • 0
С уважением,
Дмитрий

#12 Ksenia

Ksenia

    Новый участник

  • Members
  • Pip
  • 20 сообщений
  • ФИО:Дружинская Ксения
  • Город:Санкт-Петербург


Отправлено 07 мая 2008 - 12:13

Спасибо, буду разбираться.
  • 0

#13 vdm0

vdm0

    Новый участник

  • Members
  • Pip
  • 6 сообщений
  • ФИО:Вадим Лащевский
  • Город:Киев

Отправлено 06 июня 2008 - 09:37

Если еще актуально -- вот скриптик который после выполнения проекта (не сьюта) на событии OnStopTest сохраняет логи в *.mht и отправляет на е-мейл.
[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]
  • 0

#14 APC

APC

    Опытный участник

  • Members
  • PipPipPipPip
  • 293 сообщений
  • ФИО:Похилько Андрей Федорович
  • Город:Москва


Отправлено 10 июня 2008 - 13:29

Если еще актуально -- вот скриптик который после выполнения проекта (не сьюта) на событии OnStopTest сохраняет логи в *.mht и отправляет на е-мейл...


А вот у меня была проблема, что ТС5 вызывает это событие не по окончанию всех тестов, а по окончании каждого... Тоже хотел сделать нотификацию, но не вышло...

Или мы говорим о разных версиях ТС?
  • 0

#15 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 11 июня 2008 - 03:35

Здравствуйте.

Действительно, события OnStartTest и OnStopTest срабатывают для каждого Test Item. Однако, если уж вы используете Test Items, то вы можете просто добавить ещё один в конец, в котором и выполнять все необходимые действия.
  • 0
С уважением,
Дмитрий

#16 APC

APC

    Опытный участник

  • Members
  • PipPipPipPip
  • 293 сообщений
  • ФИО:Похилько Андрей Федорович
  • Город:Москва


Отправлено 11 июня 2008 - 13:07

Здравствуйте.

Действительно, события OnStartTest и OnStopTest срабатывают для каждого Test Item. Однако, если уж вы используете Test Items, то вы можете просто добавить ещё один в конец, в котором и выполнять все необходимые действия.


Но что делать если проект завалился посередине? Он не дойдет до этого элемента и не сделает нужных действий... Вообще странно что такого очевидного и нужного Event'а они не сделали...
  • 0

#17 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 12 июня 2008 - 03:39

Здравствуйте.

Можете отправить запрос им в службу поддержки. Насколько я знаю, они все пожелания пользователей фиксируют и, когда запрос получает достаточно высокий "рейтинг", его реализуют.
  • 0
С уважением,
Дмитрий

#18 APC

APC

    Опытный участник

  • Members
  • PipPipPipPip
  • 293 сообщений
  • ФИО:Похилько Андрей Федорович
  • Город:Москва


Отправлено 16 июня 2008 - 06:42

Здравствуйте.

Можете отправить запрос им в службу поддержки. Насколько я знаю, они все пожелания пользователей фиксируют и, когда запрос получает достаточно высокий "рейтинг", его реализуют.


Мои ощущения от общения с ними таковы, что они переключились на работу с версией 6, которая стоит 2 000 долларов, а версию 5, которая стоит в два раза дешевле, задвинули в дальний ящик... Год назад они исправляли хотя бы 1 из 5 багов которые мы им постили, теперь тишина. Так что я разочаровался в этом варианте.
Но мы уже обходимся другими средствами для нотификации...
  • 0

#19 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 16 июня 2008 - 11:23

Здравствуйте.

На мой взгляд, логично работать над новой версией продукта, уделяя при этом минимум внимания старой. Да и вопрос про OnStartTest и OnStopTest тоже, как мне кажется, не является багом. Скорее, отсутствием фичи.
  • 0
С уважением,
Дмитрий

#20 Acompany

Acompany

    Новый участник

  • Members
  • Pip
  • 5 сообщений
  • ФИО:Andrey

Отправлено 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 гостей, 0 анонимных