Über die TFS API kann man Allerlei Informationen dem TFS entlocken. In den Vorangegange Blogposts habe ich bereits gezeigt wie man Build, Changeset oder WorkItem Informationen abrufen kann. Als letzten “Über-Punkt” kommt das Thema Testing.
Testing? Was heisst das?
Ganz im Groben würde ich erstmal “Code”-Tests (Unit-Tests / Coded-UI Tests) und die Testpläne aus dem Test Manager unterscheiden – allerdings bin ich an der Stelle kein TFS Experte, daher könnte man Wording auch falsch an dieser Stelle sein – aber zur Veranschaulichungen reicht es.
Zu den “Code”-Tests:
Das sind im Grunde normale Unit-Tests:
Die Tests vom Test Manager:
Der TFS kennt neben den “normalen” Unit-Tests noch wesentlich mehr – man kann Testpläne mit TestCases erstellen und diese haben wiederum Testschritte. Man kann damit sehr umfangreiche Tests anlegen, welche manuell als auch automatisiert basierend auf verschiedenen Umgebungen und Builds anwenden kann. Dies ist aber vermutlich der Teil des TFS den ich am wenigsten wirklich kenne. Zur Veranschaulichung gibt es auch ein eigenen Client nur für die Tests – der Microsoft Test Manager. Diese Tests können auch via API maniupuliert und abgefragt werden:
Im Web-Interface vom TFS sieht man dies ebenfalls:
Das Szenario: UnitTests & TestRuns der letzten Tage abrufen
Der Demo-Code soll die Test-Ergebnisse der letzten TestRuns (die, die man im Test Manager definiert) und die letzten Unit-Test Durchläufe anzeigen.
Im Grunde diese Ergebnisse aus dem Test Manager:
Das sind alle Testdurchläufe für den einen Testplan den ich erstellt habe. Darunter sind die konkreten Ergebnisse für jeden Test-Step:
… und die Ergebnisse aus diesem Build:
Code:
Für den Code werden folgende Assemblies benötigt:
- Microsoft.TeamFoundation.Client
- Microsoft.TeamFoundation.Common
- Microsoft.TeamFoundation.TestManagement.Client
- Microsoft.TeamFoundation.TestManagement.Common
- Microsoft.TeamFoundation.WorkItemTracking.Client
Alle Assemblies finden sich im ReferenceAssemblies Ordner (C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0 für VS 2012)
class Program { static void Main(string[] args) { TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri("https://code-inside.visualstudio.com/DefaultCollection")); ITestManagementService testManagement = (ITestManagementService)tfs.GetService(typeof(ITestManagementService)); // WIQL for Test: http://blogs.msdn.com/b/duat_le/archive/2010/02/25/wiql-for-test.aspx?Redirected=true string query = "SELECT * FROM TestRun WHERE TestRun.CompleteDate > '" + DateTime.Now.AddDays(-3).Year + "-" + DateTime.Now.AddDays(-3).Month + "-" + DateTime.Now.AddDays(-3).Day + "'"; var testRuns = testManagement.QueryTestRuns(query); foreach (var testPlan in testRuns) { Console.WriteLine("------------------"); Console.WriteLine("TestPlan-Title: {0}", testPlan.Title); Console.WriteLine("Overall State: {0}", testPlan.State); Console.WriteLine("Overall DateCreated: {0}", testPlan.DateCreated); Console.WriteLine("Overall PassedTests: {0}", testPlan.PassedTests); var testRunResults = testPlan.QueryResults(); Console.WriteLine("Test Run Results:"); foreach (var testRunResult in testRunResults) { Console.WriteLine(" TestRun: {0}", testRunResult.TestCaseTitle); Console.WriteLine(" State: {0}", testRunResult.State); if (testRunResult.TestCaseId != 0) { var testCaseDetail = testManagement.GetTeamProject("Grocerylist").TestCases.Find(testRunResult.TestCaseId); foreach (var steps in testRunResult.Iterations) { foreach (var action in steps.Actions) { var actionFromTestCase = (ITestStep)testCaseDetail.FindAction(action.ActionId); Console.WriteLine(" " + actionFromTestCase.Title + " : " + action.Outcome); } } } else { Console.WriteLine(" No TestCase behind this Testrun"); } } } Console.ReadLine(); }
Erklärung:
Es gibt einen SQL-ähnlichen Syntax um alle TestRuns abzufragen – in dem Falle Grenz ich dies noch anhand des Datums ein.
Als Ergebnisse von QueryTestRuns kommen sowohl Unit-Tests (die z.B. bei einem Build angestossen wurden) als auch die Tests aus dem Test Manager als ITestRun Objekt. Etwas schwieriger ist es wirklich die konkreten TestSteps bei einem Test Manager Test zu bekommen. Interessanterweise gibt die API auch nur die Titel mit HTML Tags aus – eine andere Art habe ich nicht gefunden.
Als Ergebnisse des Codes kommt dies:
Hierbei hatte ich vorher ein Build mit Unit-Tests angestossen und 3 Testläufe vom “Blogpost Testplan” durchgeführt. Über die API bekommt man auch mit ob es ein automatischer oder manueller Test ist. In den Properties sieht man auch ob der Test aufgrund eines Builds angestossen wurde – alles was man im Visual Studio sieht, bekommt man irgendwie auch über die API hin.
Hier gibt es zudem noch einige Code-Snippets:
Code snippets on Test Management APIs?
Den gesamten Code gibt es auch auf GitHub.