13

He encontrado varios ejemplos sobre la recuperación de resultados de pruebas usando la API TFS, pero no hay documentación sobre cómo crear resultados programáticamente. Mi objetivo es crear una alternativa ligera al uso de Microsoft Test Manager para ejecutar pruebas manuales. ¿Alguien tiene experiencia con esto? ¿Hay algún ejemplo que me falta?¿Cómo crear una ejecución de prueba y el resultado utilizando la API de Team Foundation Server?

Esto es lo que tengo hasta ahora:

ITestCaseResult CreateNewTestCaseResult(ITestSuiteEntry testCaseEntry) 
{ 
    var run = testCaseEntry.TestSuite.Plan.CreateTestRun(false /* not automated */); 
    run.AddTest(testCaseEntry.TestCase.Id, suiteEntry.TestSuite.DefaultConfigurations[0].Id, suiteEntry.TestSuite.Plan.Owner); 
    run.Save(); // so that results object is created 
    return run.QueryResults()[0]; 
} 

no estoy seguro si esta es la forma correcta de initate una nueva ejecución, y no estoy seguro de cómo registrar los resultados de cada acción de la prueba.

Respuesta

12

Actualización 15 Ago 2012:

El ejemplo siguiente se ha integrado en mi abierta herramienta de editor de pasos de prueba TFS de origen. En la última versión, obtuvo la capacidad de publicar resultados de pruebas en TFS. Ver la fuente en GitHub.


Ahora tengo código de trabajo para publicar los resultados de las pruebas. Tenga en cuenta que el siguiente código acepta ITestPoint (esto representa un caso de prueba dentro de un conjunto particular) y tiene algunas de mis clases internas (no incluidas) que solo proporcionan rutas de resultados y adjuntos para cada paso.

var tfsRun = _testPoint.Plan.CreateTestRun(false); 

tfsRun.DateStarted = DateTime.Now; 
tfsRun.AddTestPoint(_testPoint, _currentIdentity); 
tfsRun.DateCompleted = DateTime.Now; 
tfsRun.Save(); // so results object is created 

var result = tfsRun.QueryResults()[0]; 
result.Owner = _currentIdentity; 
result.RunBy = _currentIdentity; 
result.State = TestResultState.Completed; 
result.DateStarted = DateTime.Now; 
result.Duration = new TimeSpan(0L); 
result.DateCompleted = DateTime.Now.AddMinutes(0.0); 

var iteration = result.CreateIteration(1); 
iteration.DateStarted = DateTime.Now; 
iteration.DateCompleted = DateTime.Now; 
iteration.Duration = new TimeSpan(0L); 
iteration.Comment = "Run from TFS Test Steps Editor by " + _currentIdentity.DisplayName; 

for (int actionIndex = 0; actionIndex < _testEditInfo.TestCase.Actions.Count; actionIndex++) 
{ 
    var testAction = _testEditInfo.TestCase.Actions[actionIndex]; 
    if (testAction is ISharedStepReference) 
     continue; 

    var userStep = _testEditInfo.SimpleSteps[actionIndex]; 

    var stepResult = iteration.CreateStepResult(testAction.Id); 
    stepResult.ErrorMessage = String.Empty; 
    stepResult.Outcome = userStep.Outcome; 

    foreach (var attachmentPath in userStep.AttachmentPaths) 
    { 
     var attachment = stepResult.CreateAttachment(attachmentPath); 
     stepResult.Attachments.Add(attachment); 
    } 

    iteration.Actions.Add(stepResult); 
} 

var overallOutcome = _testEditInfo.SimpleSteps.Any(s => s.Outcome != TestOutcome.Passed) 
    ? TestOutcome.Failed 
    : TestOutcome.Passed; 

iteration.Outcome = overallOutcome; 

result.Iterations.Add(iteration); 

result.Outcome = overallOutcome; 
result.Save(false); 
11

La Acción de prueba no parece tener propiedades para configurar el pase/no funciona o para agregar archivos adjuntos.

public interface ITestAction : INotifyPropertyChanged { 
    int Id { get; } 
    ITestBase Owner { get; } 
    ITestActionGroup Parent { get; } 

    ITestAction CopyToNewOwner(ITestBase newOwner); 
    void MoveToNewOwner(ITestBase newOwner); } 

Eso se hace a nivel primario (TestCase).

ITestCaseResult result = run.QueryResults()[0]; 
IAttachmentCollection collection = result.Attachments; 
string x = result.Comment; 

Aquí es cómo se inicia correctamente una nueva ejecución:

namespace SampleRunCreation 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      TfsTeamProjectCollection tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("http://pradeepn-tcm:8080/tfs/DefaultCollection")); 
      ITestManagementTeamProject project = tfs.GetService<ITestManagementService>().GetTeamProject("Pradeep"); 

      // Create a test case. 
      ITestCase testCase = CreateTestCase(project, "My test case"); 

      // Create test plan. 
      ITestPlan plan = CreateTestPlan(project, "My test plan"); 

      // Create test configuration. You can reuse this instead of creating a new config everytime. 
      ITestConfiguration config = CreateTestConfiguration(project, string.Format("My test config {0}", DateTime.Now)); 

      // Create test points. 
      IList<ITestPoint> testPoints = CreateTestPoints(project, 
                  plan, 
                  new List<ITestCase>(){testCase}, 
                  new IdAndName[] { new IdAndName(config.Id, config.Name) }); 

      // Create test run using test points. 
      ITestRun run = CreateTestRun(project, plan, testPoints); 

      // Query results from the run. 
      ITestCaseResult result = run.QueryResults()[0]; 

      // Fail the result. 
      result.Outcome = TestOutcome.Failed; 
      result.State = TestResultState.Completed; 
      result.Save(); 

      Console.WriteLine("Run {0} completed", run.Id); 
     } 

     private static ITestCase CreateTestCase(ITestManagementTeamProject project, 
               string title) 
     { 
      // Create a test case. 
      ITestCase testCase = project.TestCases.Create(); 
      testCase.Owner = null; 
      testCase.Title = title; 
      testCase.Save(); 
      return testCase; 
     } 

     private static ITestPlan CreateTestPlan(ITestManagementTeamProject project, string title) 
     { 
      // Create a test plan. 
      ITestPlan testPlan = project.TestPlans.Create(); 
      testPlan.Name = title; 
      testPlan.Save(); 
      return testPlan; 
     } 

     private static ITestConfiguration CreateTestConfiguration(ITestManagementTeamProject project, string title) 
     { 
      ITestConfiguration configuration = project.TestConfigurations.Create(); 
      configuration.Name = title; 
      configuration.Description = "DefaultConfig"; 
      configuration.Values.Add(new KeyValuePair<string, string>("Browser", "IE")); 
      configuration.Save(); 
      return configuration; 
     } 

     public static IList<ITestPoint> CreateTestPoints(ITestManagementTeamProject project, 
                 ITestPlan testPlan, 
                 IList<ITestCase> testCases, 
                 IList<IdAndName> testConfigs) 
     { 
      // Create a static suite within the plan and add all the test cases. 
      IStaticTestSuite testSuite = CreateTestSuite(project); 
      testPlan.RootSuite.Entries.Add(testSuite); 
      testPlan.Save(); 

      testSuite.Entries.AddCases(testCases); 
      testPlan.Save(); 

      testSuite.SetEntryConfigurations(testSuite.Entries, testConfigs); 
      testPlan.Save(); 

      ITestPointCollection tpc = testPlan.QueryTestPoints("SELECT * FROM TestPoint WHERE SuiteId = " + testSuite.Id); 
      return new List<ITestPoint>(tpc); 
     } 

     private static IStaticTestSuite CreateTestSuite(ITestManagementTeamProject project) 
     { 
      // Create a static test suite. 
      IStaticTestSuite testSuite = project.TestSuites.CreateStatic(); 
      testSuite.Title = "Static Suite"; 
      return testSuite; 
     } 

     private static ITestRun CreateTestRun(ITestManagementTeamProject project, 
              ITestPlan plan, 
              IList<ITestPoint> points) 
     { 
      ITestRun run = plan.CreateTestRun(false); 
      foreach (ITestPoint tp in points) 
      { 
       run.AddTestPoint(tp, null); 
      } 

      run.Save(); 
      return run; 
     } 
    } 
} 

Reference

+0

Eso es un comienzo, básicamente el mismo punto que he tenido en mi ejemplo. Lo que estoy buscando es registrar la aprobación/falla de cada acción dentro del caso de prueba, establecer comentarios y adjuntar archivos a cada acción. –

+0

Actualizaré mi respuesta. –

+0

Creo que al leer la API no puede hacer exactamente lo que quiere hacer. No hay asociaciones entre comentarios/archivos adjuntos y acciones dentro de la API. –

Cuestiones relacionadas