25 August 2013 TestRuns, Tests, TFS Robert Muehsig

Ü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:

image

 

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:

image

Im Web-Interface vom TFS sieht man dies ebenfalls:

image 

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:

image

… und die Ergebnisse aus diesem Build:

image

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:

image

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.


Written by Robert Muehsig

Software Developer - from Dresden, Germany, now living & working in Switzerland. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de

If you like the content and want to support me you could buy me a beer or a coffee via Litecoin or Bitcoin - thanks for reading!