Friday, July 4, 2014

Get log from .trx file

Get log from .trx file:-


We can get the logs in details from *.trx file to csv.
Sample code would be like:-


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

using System.IO;

using System.Xml;

namespace ParseTraceResulttoCSV



{
 
/// <summary>

/// Class to read Xml Trace file.

/// </summary>

public class DebugTrace



{
 
/// <summary>

/// List to store all event occured in trace file

/// </summary>

private List<ResultObject> xmlTestResults;

/// <summary>

/// Hashtable to store execution ids and test ids

/// </summary>

private Hashtable xmlTestExecutions = new Hashtable();

/// <summary>

/// Constructor

/// </summary>

public DebugTrace()



{
 
xmlTestExecutions = new Hashtable();

xmlTestResults = new List<ResultObject>();



}
 
/// <summary>

/// Calling method for parsing Trace file

/// </summary>

/// <param name="args">filePath</param>

/// <param name="fileType">generated file type</param>

public void Run(string args, string fileType = "csv")



{
 
string str = "";

Hashtable tests = new Hashtable();

string ext = string.Empty;

if (!string.IsNullOrEmpty(args))

ext = (new FileInfo(args)).Extension;

if (args != null && ext.Contains("trx"))



{
 
try



{
 
TextReader tr = new StreamReader(args);



str = tr.ReadToEnd();
 
XmlDocument resultFile = new XmlDocument();



resultFile.LoadXml(str);
 
XmlNamespaceManager atomNamespaceManager = new XmlNamespaceManager(resultFile.NameTable);

atomNamespaceManager.AddNamespace("x", @"http://microsoft.com/schemas/VisualStudio/TeamTest/2010");

XmlNode appNode = resultFile.SelectSingleNode(@"x:TestRun", atomNamespaceManager);

foreach (XmlNode eachTest in appNode.SelectNodes(@"x:TestDefinitions/x:UnitTest", atomNamespaceManager))



{
 
string testName = "";

string testId = "";

foreach (XmlAttribute xmlAttribute in eachTest.Attributes)



{
 
if (xmlAttribute.Name == "id")



testId = xmlAttribute.Value;
 
if (xmlAttribute.Name == "name")



testName = xmlAttribute.Value;

}

tests.Add(testId, testName);

}
 
foreach (XmlNode eachTest in appNode.SelectNodes(@"x:TestDefinitions/x:OrderedTest", atomNamespaceManager))



{
 
string testName = "";

string testId = "";

foreach (XmlAttribute xmlAttribute in eachTest.Attributes)



{
 
if (xmlAttribute.Name == "id")



testId = xmlAttribute.Value;
 
if (xmlAttribute.Name == "name")



testName = xmlAttribute.Value;

}

tests.Add(testId, testName);

}

xmlTestExecutions.Clear();
 
testExecutionList(appNode.SelectSingleNode(@"x:TestEntries", atomNamespaceManager), atomNamespaceManager);



xmlTestResults.Clear();
 
XmlNode newappnode = appNode.SelectSingleNode(@"x:Results/x:TestResultAggregation/x:InnerResults", atomNamespaceManager);

if (newappnode != null)



testResultList(newappnode, atomNamespaceManager);
 
foreach (XmlNode testResults in appNode.SelectNodes(@"x:Results/x:UnitTestResult", atomNamespaceManager))



{

testResult(testResults, atomNamespaceManager);

}

}
 
catch (Exception e)



{
 
Console.WriteLine("Exception Occured While Reading File.\r\nMessage : " + e.Message);



}

}
 
else



{
 
Console.WriteLine("Incorrect File. Please Check.");



}
 
if (xmlTestResults.Count > 0)



{
 
try



{
 
string file = args.Replace(".trx", ".csv");

TextWriter tr = new StreamWriter(file);

tr.WriteLine("ParentTest,Test,Step,Action,ControlType,ControlProperties,Status,Comment,Duration");

foreach (ResultObject resultObject in xmlTestResults)



{
 
string parentTest = "";

string test = "";

if (resultObject.ParentTest != null)



parentTest = tests[xmlTestExecutions[resultObject.ParentTest]].ToString();
 
if (resultObject.Test != null)



test = tests[resultObject.Test].ToString();
 
resultObject.Action = resultObject.Action == null ? "" : resultObject.Action;

resultObject.ControlType = resultObject.ControlType == null ? "" : resultObject.ControlType;

resultObject.ControlProperties = resultObject.ControlProperties == null ? "" : resultObject.ControlProperties;

resultObject.Comment = resultObject.Comment == null ? "" : resultObject.Comment;

tr.WriteLine(parentTest + "," + test + "," + resultObject.Step + "," + resultObject.Action.Replace(",", "_") + "," + resultObject.ControlType.Replace(",", "_") + "," + resultObject.ControlProperties.Replace(",", "_") + "," + resultObject.Status + "," + resultObject.Comment.Replace(",", "_") + "," + resultObject.Duration);



}

tr.Close();
 
Console.WriteLine("File Created Successfully.");

Console.WriteLine(file);



}
 
catch (Exception e)



{
 
Console.WriteLine("Exception Occured While Writing File.\r\nMessage : " + e.Message);



}

}

}
 
/// <summary>

/// gets lists of executions made

/// </summary>

/// <param name="xml">xml node</param>

/// <param name="xmlNamespaceManager">namespaces of xml</param>

private void testExecutionList(XmlNode xml, XmlNamespaceManager xmlNamespaceManager)



{
 
foreach (XmlNode node in xml.SelectNodes(@"x:TestEntry", xmlNamespaceManager))



{
 
string testId = "";

string executionId = "";

foreach (XmlAttribute xmlAttribute in node.Attributes)



{
 
if (xmlAttribute.Name == "testId")



testId = xmlAttribute.Value;
 
if (xmlAttribute.Name == "executionId")



executionId = xmlAttribute.Value;

}

xmlTestExecutions.Add(executionId, testId);
 
foreach (XmlNode childNode in node.SelectNodes(@"x:TestEntries", xmlNamespaceManager))



{

testExecutionList(childNode, xmlNamespaceManager);

}

}

}
 
/// <summary>

/// Gets all the detailed result nodes

/// </summary>

/// <param name="xml">Result Xml node</param>

/// <param name="xmlNamespaceManager">namespaces of xml</param>

private void testResultList(XmlNode xml, XmlNamespaceManager xmlNamespaceManager)



{
 
foreach (XmlNode node in xml.SelectNodes(@"x:UnitTestResult", xmlNamespaceManager))



{

testResult(node, xmlNamespaceManager);

}
 
foreach (XmlNode childNode in xml.SelectNodes(@"x:TestResultAggregation/x:InnerResults", xmlNamespaceManager))



{

testResultList(childNode, xmlNamespaceManager);

}

}
 
/// <summary>

/// Method to read unit test result trace

/// </summary>

/// <param name="xml">debug xml node of trcae file</param>

/// <param name="xmlNamespaceManager">namespaces of xml</param>

private void testResult(XmlNode xml, XmlNamespaceManager xmlNamespaceManager)



{
 
ResultObject resultObject = new ResultObject();

foreach (XmlAttribute xmlAttribute in xml.Attributes)



{
 
if (xmlAttribute.Name == "testId")



resultObject.Test = xmlAttribute.Value;
 
if (xmlAttribute.Name == "parentExecutionId")



resultObject.ParentTest = xmlAttribute.Value;
 
if (xmlAttribute.Name == "outcome")



resultObject.Status = xmlAttribute.Value;
 
if (xmlAttribute.Name == "duration")



resultObject.Duration = xmlAttribute.Value;

}

xmlTestResults.Add(resultObject);
 
int i = 0;

XmlNode testNode = xml.SelectSingleNode(@"x:Output/x:DebugTrace", xmlNamespaceManager);

string testFile = testNode.InnerText;

while (testFile.Contains("a class=") || testFile.Contains("Trace Message Log ("))



{
 
int index_a = testFile.IndexOf("a class=");

int index_Trace = testFile.IndexOf("Trace Message Log (");



index_Trace = index_Trace == -1 ? index_a + 1 : index_Trace;
 
if (testFile.Contains("a class=") && testFile.Contains("Playback - ") && index_a < index_Trace)



{

i++;
 
string row = testFile.Substring(testFile.IndexOf("Playback - "));

ResultObject resultObjectTemp = new ResultObject();



resultObjectTemp.Test = resultObject.Test;

resultObjectTemp.ParentTest = resultObject.ParentTest;

resultObjectTemp.Step = i.ToString();
 
xmlTestResults.Add(control(resultObjectTemp, row.Substring(0, row.IndexOf("/a"))));

if (row.Contains("a class="))

row = row.Substring(row.IndexOf("/a"));



testFile = row;

}
 
else if (testFile.Contains("Trace Message Log ("))



{
 
string message = testFile.Substring(testFile.IndexOf("Trace Message Log (")+19);




 
ResultObject resultObj = new ResultObject();



resultObj.ParentTest = resultObject.ParentTest;

resultObj.Test = resultObject.Test;
 
resultObj.Step = "=>";

resultObj.Action = message.Substring(0, message.IndexOf(")"));



xmlTestResults.Add(resultObj);

testFile = message;

}

}

}
 
private ResultObject control(ResultObject resultObject, string str)



{
 
string text = "";

text = str.Substring(0, str.IndexOf("ControlType='"));

text = text.Substring(text.LastIndexOf("["));

resultObject.ControlType = text + valuebetween(str, "ControlType='", "'");

if (str.Contains("[SUCCESS]"))



{
 
resultObject.Action = valuebetween(str, "[SUCCESS] ", " - \"" + text);

resultObject.Status = "SUCCESS";



}
 
else if (str.Contains("[FAILED]"))



{
 
string failure = valuebetween(str, "[FAILED] ", text);

if (failure.Contains("Search"))



{

resultObject.Comment = failure;
 
resultObject.Action = "Search";



}
 
else

resultObject.Action = failure.Replace(" - \"", "");

resultObject.Status = "FAILED";

//text = "Searching...." + valuebetween(str, "ControlType='", "'") + " '" + IDValue(str) + "'";



}

resultObject.ControlProperties = IDValue(str);
 
return resultObject;



}
 
/// <summary>

/// Returns the properties of control extracted from trace

/// </summary>

/// <param name="str">trace log string</param>

/// <returns>properties seperated by pipes</returns>

private string IDValue(string str)



{
 
string ret = "";

string prop = "";

do



{
 
prop = "";

if (str.Contains(" DisplayText="))



{
 
prop = str.Substring(str.IndexOf(" DisplayText=") + 13);

prop = "DisplayText=" + valuebetween(prop, "'", "'");

str = str.Replace(" DisplayText=", "");



}
 
else if (str.Contains(" FriendlyName="))



{
 
prop = str.Substring(str.IndexOf(" FriendlyName=") + 14);

prop = "FriendlyName=" + valuebetween(prop, "'", "'");

str = str.Replace(" FriendlyName=", "");



}
 
else if (str.Contains(" InnerText="))



{
 
prop = str.Substring(str.IndexOf(" InnerText=") + 11);

prop = "InnerText=" + valuebetween(prop, "'", "'");

str = str.Replace(" InnerText=", "");



}
 
else if (str.Contains(" Id="))



{
 
prop = str.Substring(str.IndexOf(" Id=") + 4);

prop = "Id=" + valuebetween(prop, "'", "'");

str = str.Replace(" Id=", "");



}
 
else if (str.Contains(" TagInstance="))



{
 
prop = str.Substring(str.IndexOf(" TagInstance=") + 13);

prop = "TagInstance=" + valuebetween(prop, "'", "'");

str = str.Replace(" TagInstance=", "");



}
 
else if (str.Contains(" Text="))



{
 
prop = str.Substring(str.IndexOf(" Text=") + 6);

prop = "Text=" + valuebetween(prop, "'", "'");

str = str.Replace(" Text=", "");



}
 
else if (str.Contains(" Value="))



{
 
prop = str.Substring(str.IndexOf(" Value=") + 7);

prop = "Value=" + valuebetween(prop, "'", "'");

str = str.Replace(" Value=", "");



}
 
else if (str.Contains(" ValueAttribute="))



{
 
prop = str.Substring(str.IndexOf(" ValueAttribute=") + 16);

prop = "ValueAttribute=" + valuebetween(prop, "'", "'");

str = str.Replace(" ValueAttribute=", "");



}
 
else if (str.Contains(" Name="))



{
 
prop = str.Substring(str.IndexOf(" Name=") + 6);

prop = "Name=" + valuebetween(prop, "'", "'");

str = str.Replace(" Name=", "");



}
 
else if (str.Contains(" Instance="))



{
 
prop = str.Substring(str.IndexOf(" Instance=") + 10);

prop = "Instance=" + valuebetween(prop, "'", "'");

str = str.Replace(" Instance=", "");



}
 
ret = ret + "|" + prop;

} while (!string.IsNullOrEmpty(prop));

return ret;



}
 
/// <summary>

/// Get string value between to provided strings

/// </summary>

/// <param name="atr">main string</param>

/// <param name="start">start string</param>

/// <param name="end">end string</param>

/// <returns>string value between start and end string</returns>

private string valuebetween(string atr, string start, string end)



{
 
string controltyp = "";

try



{

controltyp = atr.Substring(atr.IndexOf(start) + start.Length);

controltyp = controltyp.Substring(0, controltyp.IndexOf(end));

}
 
catch { }

return controltyp;



}

}

}
 
 

No comments:

Post a Comment