public void Run(string testDllFullPath, string testCategory, string individualTestName)
{
try
{
var msTestPath = @"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\MSTest.exe";
string testDllFolder = new FileInfo(testDllFullPath).DirectoryName;
var msTestArgs = string.Format("/testcontainer:{0}", testDllFullPath);
if (!string.IsNullOrWhiteSpace(testCategory))
{
msTestArgs = string.Format("{0} /testcategory:{1}", msTestArgs, testCategory);
}
else if (!string.IsNullOrWhiteSpace(individualTestName))
{
msTestArgs = string.Format("{0} /test:{1}", msTestArgs, individualTestName);
}
var myProcess = new Process();
var myProcessStartInfo = new ProcessStartInfo(msTestPath, msTestArgs)
{
WindowStyle = ProcessWindowStyle.Normal,
WorkingDirectory = testDllFolder,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true
};
myProcess.StartInfo = myProcessStartInfo;
myProcess.Start();
string outputErrors = myProcess.StandardError.ReadToEnd();
string output = myProcess.StandardOutput.ReadToEnd();
myProcess.WaitForExit();
if (output.Contains("For switch syntax, type \"MSTest /help\""))
{
throw new ApplicationException(string.Format("MSTest invoked with invalid command line: [{0}]", msTestArgs));
}
if (!string.IsNullOrWhiteSpace(outputErrors))
{
throw new ApplicationException(string.Format("MSTest standard error: args=[{0}] stderr=[{1}]", msTestArgs, outputErrors));
}
}
catch (Exception e)
{
Trace.WriteLine("ERROR: " + e.Message);
throw;
}
}
To parse results file:
public void ParseResultsFile(string fullResultsFilePath)
{
var resultsDoc = XDocument.Load(fullResultsFilePath);
var ns = resultsDoc.Root.Name.Namespace;
var summary = resultsDoc.Descendants(ns + "ResultSummary").FirstOrDefault();
if (summary != null)
{
var overallOutcome = summary.Attribute("outcome");
var counters = summary.Element(ns + "Counters");
if (counters != null)
{
var countTotal = counters.Attribute("total");
var countExecuted = counters.Attribute("executed");
var countPassed = counters.Attribute("passed");
var countError = counters.Attribute("error");
var countFailed = counters.Attribute("failed");
var countTimeout = counters.Attribute("timeout");
var countAborted = counters.Attribute("aborted");
var countInconclusive = counters.Attribute("inconclusive");
}
}
var testResults = resultsDoc.Descendants(ns + "UnitTestResult");
foreach (var testResult in testResults)
{
var testName = testResult.Attribute("testName");
var testOutcome = testResult.Attribute("outcome");
foreach (var error in testResult.Descendants(ns + "ErrorInfo"))
{
var message = error.Element(ns + "Message").Value;
var stackTrace = error.Element(ns + "StackTrace").Value;
}
foreach (var debugTrace in testResult.Descendants(ns + "DebugTrace"))
{
var traceMessage = debugTrace.Value;
}
}
}