コード例 #1
0
        private static async Task AttachReportToBuildTestRunAsync(string collectionUri, string teamProjectName, string releaseUri, string releaseEnvironmentUri, string reportFile, string personalAccessToken)
        {
            var connection = GetConnection(collectionUri, personalAccessToken);

            var testManagementClient = connection.GetClient <TestManagementHttpClient>();
            var projectClient        = connection.GetClient <ProjectHttpClient>();

            Console.WriteLine("Attaching Report");

            var queryModel    = new QueryModel(query: "SELECT * FROM TestRun WHERE ReleaseUri = '" + releaseUri + "' and ReleaseEnvironmentUri in ('" + releaseEnvironmentUri + "')");
            var testRunResult = await testManagementClient.GetTestRunsByQueryAsync(queryModel, teamProjectName);

            TestRun testRun;

            if (testRunResult == null || testRunResult.Count == 0)
            {
                var runCreateModel = new RunCreateModel("OWASP ZAP Security Tests", isAutomated: true, releaseUri: releaseUri, releaseEnvironmentUri: releaseEnvironmentUri);

                var project = await projectClient.GetProject(teamProjectName);

                string projectId = project.Id.ToString();

                testRun = await testManagementClient.CreateTestRunAsync(projectId, runCreateModel);
            }
            else
            {
                testRun = testRunResult.FirstOrDefault();
            }

            string stream = File.ReadAllText(reportFile);

            var attachmentModel      = new TestAttachmentRequestModel(stream: Base64Encode(stream), fileName: "OwaspZapTestResultsReport.html");
            var testAttachmentResult = await testManagementClient.CreateTestRunAttachmentAsync(attachmentModel, teamProjectName, testRun.Id);
        }
コード例 #2
0
ファイル: Program.cs プロジェクト: sergesh78/TFRestApi
        /// <summary>
        /// Create failed test results
        /// </summary>
        /// <param name="TeamProjectName"></param>
        private static void CreateTestResultFailed(string TeamProjectName)
        {
            RunCreateModel runCreate = new RunCreateModel(
                name: "Test run from console - failed",
                startedDate: DateTime.Now.ToString("o"),
                isAutomated: true
                );

            TestRun testRun = TestManagementClient.CreateTestRunAsync(runCreate, TeamProjectName).Result;

            TestCaseResult testCaseResult = new TestCaseResult();

            testCaseResult.AutomatedTestName = "MyTestSuite.TestName";
            testCaseResult.TestCaseTitle     = "Check my function";
            testCaseResult.StackTrace        = "Add StackTrace here";
            testCaseResult.ErrorMessage      = "Test 'MyTestSuite.TestName' failed";
            testCaseResult.Outcome           = Enum.GetName(typeof(TestOutcome), TestOutcome.Failed);
            testCaseResult.CompletedDate     = DateTime.Now;
            testCaseResult.State             = Enum.GetName(typeof(TestRunState), TestRunState.Completed);

            TestManagementClient.AddTestResultsToTestRunAsync(new TestCaseResult[] { testCaseResult }, TeamProjectName, testRun.Id).Wait();

            RunUpdateModel runUpdateModel = new RunUpdateModel(
                completedDate: DateTime.Now.ToString("o"),
                state: Enum.GetName(typeof(TestRunState), TestRunState.NeedsInvestigation)
                );

            testRun = TestManagementClient.UpdateTestRunAsync(runUpdateModel, TeamProjectName, testRun.Id).Result;

            PrintBasicRunInfo(testRun);
        }
コード例 #3
0
 public async Task <TestRun> CreateTestRunAsync(
     string projectName,
     RunCreateModel testRunData,
     CancellationToken cancellationToken = default(CancellationToken))
 {
     return(await TestHttpClient.CreateTestRunAsync(testRunData, projectName, cancellationToken));
 }
コード例 #4
0
        /// <summary>
        /// Create successed test run
        /// </summary>
        /// <param name="TeamProjectName"></param>
        /// <param name="TestPlanId"></param>
        /// <param name="StaticSuitePath"></param>
        /// <param name="TestCaseIds"></param>
        private static void CreateTestResultCompleted(string TeamProjectName, int TestPlanId, string StaticSuitePath, int[] TestCaseIds)
        {
            TestPlan testPlan = TestManagementClient.GetPlanByIdAsync(TeamProjectName, TestPlanId).Result;

            var testPlanRef = new Microsoft.TeamFoundation.TestManagement.WebApi.ShallowReference(testPlan.Id.ToString(), testPlan.Name, testPlan.Url);

            RunCreateModel runCreate = new RunCreateModel(
                name: "Test run from console - completed",
                plan: testPlanRef,
                startedDate: DateTime.Now.ToString("o"),
                isAutomated: true
                );

            TestRun testRun = TestManagementClient.CreateTestRunAsync(runCreate, TeamProjectName).Result;

            List <TestCaseResult> testResults = new List <TestCaseResult>();

            foreach (int testCaseId in TestCaseIds)
            {
                testResults.Add(PassedTest(TeamProjectName, TestPlanId, StaticSuitePath, testCaseId));
            }

            testResults = TestManagementClient.AddTestResultsToTestRunAsync(testResults.ToArray(), TeamProjectName, testRun.Id).Result;

            RunUpdateModel runUpdateModel = new RunUpdateModel(
                completedDate: DateTime.Now.ToString("o"),
                state: Enum.GetName(typeof(TestRunState), TestRunState.Completed)
                );

            testRun = TestManagementClient.UpdateTestRunAsync(runUpdateModel, TeamProjectName, testRun.Id).Result;

            PrintBasicRunInfo(testRun);
        }
コード例 #5
0
        static void Main(string[] args)
        {
            try
            {
                //System.Diagnostics.Debugger.Launch();
                string collectionUrl = args[0]; // $(System.TeamFoundationCollectionUri)
                var    connection    = new VssConnection(new Uri(collectionUrl), new Microsoft.VisualStudio.Services.OAuth.VssOAuthAccessTokenCredential(args[4]));

                var testClient = new TestManagementHttpClient(new Uri(collectionUrl), new Microsoft.VisualStudio.Services.OAuth.VssOAuthAccessTokenCredential(args[4]));

                string buildurl    = args[1];            // $(BUILD.BUILDURI)
                string projectName = args[2];            // $(SYSTEM.TEAMPROJECT)
                string folder      = args[3];
                int    buildId     = int.Parse(args[5]); //$(Build.BuildId)
                bool   useNewStore = false;
                string projectId   = string.Empty;

                try
                {
                    bool.TryParse(args[6], out useNewStore);
                    projectId = args[7]; //$(System.TeamProjectId)
                }
                catch (Exception e)
                {
                }

                // Create test run
                RunCreateModel runCreationModel = new RunCreateModel("somename", buildId: buildId,
                                                                     startedDate: DateTime.UtcNow.ToString(), completedDate: DateTime.UtcNow.ToString(),
                                                                     state: TestRunState.InProgress.ToString(), isAutomated: true);
                var testRun = testClient.CreateTestRunAsync(runCreationModel, projectName).Result;

                TestCaseResult result = new TestCaseResult
                {
                    AutomatedTestName    = "TestOne",
                    AutomatedTestStorage = "foo.dll",
                    Build = new ShallowReference {
                        Url = buildurl
                    },
                    TestCaseTitle = "TestOne"
                };
                testClient.AddTestResultsToTestRunAsync(new TestCaseResult[] { result }, projectName, testRun.Id).Wait();
                testClient.UpdateTestRunAsync(new RunUpdateModel("somename", state: TestRunState.Completed.ToString()), projectName, testRun.Id).Wait();

                if (useNewStore)
                {
                    UploadCodeCoverageAttachmentsToNewStore(folder, connection, buildId, projectId);
                }
                else
                {
                    UploadCodeCoverageAttachmentsToOldStore(testClient, buildurl, projectName, folder);
                }
            }
            catch (AggregateException e)
            {
                Console.WriteLine(e.InnerException);
                Console.WriteLine(e);
            }
        }
コード例 #6
0
        private bool ValidatePipelineReference(RunCreateModel run)
        {
            bool pipelineId     = run.PipelineReference.PipelineId.Equals(1);
            bool stageReference = run.PipelineReference.StageReference.Attempt.Equals(1) && run.PipelineReference.StageReference.StageName.Equals("Stage1");
            bool phaseReference = run.PipelineReference.PhaseReference.Attempt.Equals(1) && run.PipelineReference.PhaseReference.PhaseName.Equals("Phase1");
            bool jobReference   = run.PipelineReference.JobReference.Attempt.Equals(1) && run.PipelineReference.JobReference.JobName.Equals("Job1");

            return(pipelineId && stageReference && phaseReference && jobReference);
        }
コード例 #7
0
        public async Task <List <string> > LogResults(List <VstsTestCaseResult> results)
        {
            var orgUri = new Uri(OrganizationUrl);

            VssCredentials credentials = new VssCredentials(new Microsoft.VisualStudio.Services.Common.VssBasicCredential(string.Empty, Personalaccesstoken));
            var            connection  = new VssConnection(orgUri, credentials);

            using (var testClient = connection.GetClient <TestManagementHttpClient>())
            {
                var resultPointIds = results.Where(p => _testCaseToPointMap.Keys.Contains(p.Id)).Select(p => GetPointIdByCaseId(p.Id)).ToArray();

                List <TestCaseResult> testcaseResults = new List <TestCaseResult>();
                foreach (var pointId in resultPointIds)
                {
                    TestCaseResult temp = new TestCaseResult()
                    {
                        State = "Completed"
                    };
                    temp.Id        = GenerateTestResultID();
                    temp.TestPoint = new ShallowReference(pointId.ToString());
                    var current = results.Where(p => p.Id == GetCaseIdByPointId(pointId)).First();
                    temp.Outcome = current.Outcome;
                    if (current.AssociatedBugs != null)
                    {
                        var tempDefects = new List <ShallowReference>();
                        foreach (var defect in current.AssociatedBugs)
                        {
                            tempDefects.Add(new ShallowReference(defect));
                        }
                        temp.AssociatedBugs = tempDefects;
                    }
                    temp.Comment = current.Comment;
                    testcaseResults.Add(temp);
                }

                RunCreateModel run     = new RunCreateModel(name: "Mvt", plan: new ShallowReference(PlanId.ToString()), pointIds: resultPointIds);
                TestRun        testrun = await testClient.CreateTestRunAsync(run, ProjectName);

                var testResults = await testClient.UpdateTestResultsAsync(testcaseResults.ToArray(), ProjectName, testrun.Id);

                RunUpdateModel runmodel      = new RunUpdateModel(state: "Completed", deleteUnexecutedResults: true);  //, deleteUnexecutedResults: true);
                TestRun        testRunResult = await testClient.UpdateTestRunAsync(runmodel, ProjectName, testrun.Id); //, runmodel);

                var loggedCases = await testClient.GetTestResultsAsync(ProjectName, testRunResult.Id);

                return(loggedCases.Select(p => p.TestCase.Id).ToList());
                //TestRunState.Completed;
                //TestRunOutcome.Passed.ToString();
            }
        }
コード例 #8
0
ファイル: Program.cs プロジェクト: sergesh78/TFRestApi
        /// <summary>
        /// Create failed test results for all tests in test suite
        /// </summary>
        /// <param name="TeamProjectName"></param>
        /// <param name="TestPlanId"></param>
        /// <param name="StaticSuitePath"></param>
        private static void CreateTestResultFailed(string TeamProjectName, int TestPlanId, string StaticSuitePath)
        {
            TestPlan testPlan    = TestManagementClient.GetPlanByIdAsync(TeamProjectName, TestPlanId).Result;
            int      testSuiteId = GetSuiteId(TeamProjectName, TestPlanId, StaticSuitePath);

            var testPlanRef = new Microsoft.TeamFoundation.TestManagement.WebApi.ShallowReference(testPlan.Id.ToString(), testPlan.Name, testPlan.Url);

            RunCreateModel runCreate = new RunCreateModel(
                name: "Test run from console - failed",
                plan: testPlanRef,
                startedDate: DateTime.Now.ToString("o"),
                isAutomated: true
                );

            TestRun testRun = TestManagementClient.CreateTestRunAsync(runCreate, TeamProjectName).Result;

            List <TestCaseResult> testResults = new List <TestCaseResult>();

            List <SuiteTestCase> testCases = TestManagementClient.GetTestCasesAsync(TeamProjectName, TestPlanId, testSuiteId).Result; //Get all test cases from suite

            foreach (var testCase in testCases)
            {
                testResults.Add(FailedTest(TeamProjectName, TestPlanId, testSuiteId, testCase.Workitem.Id, testRun.Id));
            }

            testResults = TestManagementClient.AddTestResultsToTestRunAsync(testResults.ToArray(), TeamProjectName, testRun.Id).Result;

            var definedTestResults = TestManagementClient.GetTestResultsAsync(TeamProjectName, testRun.Id).Result; // Get test result

            TestManagementClient.CreateTestResultAttachmentAsync(GetAttachmentModel(@"img\iconfinder_Insect-robot_131435.png"), TeamProjectName, testRun.Id, definedTestResults.ElementAt(0).Id).Wait();


            RunUpdateModel runUpdateModel = new RunUpdateModel(
                errorMessage: "Test failed",
                completedDate: DateTime.Now.ToString("o"),
                state: Enum.GetName(typeof(TestRunState), TestRunState.NeedsInvestigation)
                );

            testRun = TestManagementClient.UpdateTestRunAsync(runUpdateModel, TeamProjectName, testRun.Id).Result;

            TestManagementClient.CreateTestRunAttachmentAsync(GetAttachmentModel(@"img\Screen_Shot_2018-01-16.jpg"), TeamProjectName, testRun.Id).Wait();

            PrintBasicRunInfo(testRun);
        }
コード例 #9
0
        // Adds Target Branch Name info to run create model
        private void AddTargetBranchInfoToRunCreateModel(RunCreateModel runCreateModel, string pullRequestTargetBranchName)
        {
            if (string.IsNullOrEmpty(pullRequestTargetBranchName) ||
                !string.IsNullOrEmpty(runCreateModel.BuildReference?.TargetBranchName))
            {
                return;
            }

            if (runCreateModel.BuildReference == null)
            {
                runCreateModel.BuildReference = new BuildConfiguration()
                {
                    TargetBranchName = pullRequestTargetBranchName
                };
            }
            else
            {
                runCreateModel.BuildReference.TargetBranchName = pullRequestTargetBranchName;
            }
        }
コード例 #10
0
        private static void updateTestResultsInAzure(string testPlanId, List <Tuple <int, string> > resultList)
        {
            try{
                VssConnection connection = new VssConnection(new Uri(TFUrl), new VssBasicCredential(string.Empty, UserPAT));

                DateTime utcDate    = DateTime.UtcNow; //getting time for the run report name
                var      culture    = new CultureInfo("en-US");
                string   reportName = "Katalon Automated Tests: " + utcDate.ToString(culture) + " " + utcDate.Kind;

                int[]            excPointIds  = new int[resultList.Count];
                TestCaseResult[] excTestCases = new TestCaseResult[resultList.Count];
                for (int i = 0; i < resultList.Count; i++)
                {
                    excPointIds[i] = resultList[i].Item1;
                    string         extrapolatedOutcome = resultList[i].Item2 == "PASSED" ? "Passed" : "Failed"; //we only care if the test passed or not
                    TestCaseResult caseResult          = new TestCaseResult()
                    {
                        State = "Completed", Outcome = extrapolatedOutcome, Id = 100000 + i
                    };
                    excTestCases[i] = caseResult;
                }

                TestManagementClient = connection.GetClient <TestManagementHttpClient>();
                RunCreateModel run = new RunCreateModel(
                    name: reportName,
                    plan:  new Microsoft.TeamFoundation.TestManagement.WebApi.ShallowReference(testPlanId),
                    pointIds: excPointIds
                    );

                TestRun        testrun       = TestManagementClient.CreateTestRunAsync(run, teamProjectName).Result;
                var            testResults   = TestManagementClient.UpdateTestResultsAsync(excTestCases, teamProjectName, testrun.Id).Result;
                RunUpdateModel runmodel      = new RunUpdateModel(state: "Completed");
                TestRun        testRunResult = TestManagementClient.UpdateTestRunAsync(runmodel, teamProjectName, testrun.Id, runmodel).Result;
            }
            catch (Exception e) { //catch exception with writing test case results, don't make this kill the whole process
                Console.WriteLine(e.Message.ToString());
                Console.WriteLine(e.StackTrace.ToString());
            }
        }
コード例 #11
0
        private static async Task CreateBugFromPenTestAsync(string collectionUri, string teamProjectName, string team, string releaseUri, string releaseEnvironmentUri, string filePath, bool failOnHigh, string personalAccessToken)
        {
            var connection = GetConnection(collectionUri, personalAccessToken);

            var testManagementClient = connection.GetClient <TestManagementHttpClient>();
            var projectClient        = connection.GetClient <ProjectHttpClient>();
            var witClient            = connection.GetClient <WorkItemTrackingHttpClient>();
            var workClient           = connection.GetClient <WorkHttpClient>();

            var queryModel    = new QueryModel(query: "SELECT * FROM TestRun WHERE ReleaseUri = '" + releaseUri + "' and ReleaseEnvironmentUri in ('" + releaseEnvironmentUri + "')");
            var testRunResult = await testManagementClient.GetTestRunsByQueryAsync(queryModel, teamProjectName);

            var project = await projectClient.GetProject(teamProjectName);

            string projectId = project.Id.ToString();

            var teamContext  = new TeamContext(teamProjectName, team);
            var teamSettings = await workClient.GetTeamSettingsAsync(teamContext);

            var teamFieldValues = await workClient.GetTeamFieldValuesAsync(teamContext);

            var teamIteration = await workClient.GetTeamIterationAsync(teamContext, teamSettings.BacklogIteration.Id);

            var teamIterations = await workClient.GetTeamIterationsAsync(teamContext, "current");

            string areaPath      = teamFieldValues.DefaultValue;
            string iterationPath = "";

            if (teamIterations.Count > 0)
            {
                iterationPath = teamIterations[0].Path;
            }
            else
            {
                iterationPath = teamIteration.Path;
            }

            TestRun testRun;

            if (testRunResult == null || testRunResult.Count == 0)
            {
                var runCreateModel = new RunCreateModel("OWASP ZAP Security Tests", isAutomated: true, releaseUri: releaseUri, releaseEnvironmentUri: releaseEnvironmentUri);
                testRun = await testManagementClient.CreateTestRunAsync(projectId, runCreateModel);
            }
            else
            {
                testRun = testRunResult.FirstOrDefault();
            }

            var    targetUrl = System.Environment.GetEnvironmentVariable("targeturl");
            var    report    = GetReport(filePath, targetUrl);
            string title     = String.Empty;

            bool testsPassed = true;
            bool highFailure = false;
            var  results     = new List <TestResultCreateModel>();

            if (report != null && report.Issues != null && report.Issues.Count() > 0)
            {
                foreach (Issue issue in report.Issues)
                {
                    if (issue.RiskDescription.Contains("Information"))
                    {
                        continue;
                    }
                    testsPassed = false;
                    //create bug
                    if (issue.RiskDescription.Contains("High"))
                    {
                        highFailure = true;
                    }
                    title = issue.IssueDescription;

                    await CreateBugAsync(collectionUri, teamProjectName, team, title, areaPath, iterationPath, personalAccessToken);

                    results.Add(new TestResultCreateModel
                    {
                        AutomatedTestName = title,
                        Outcome           = testsPassed ? "Passed" : "Failed",
                        TestCaseTitle     = title,
                        State             = "Completed"
                    });
                }
                var testResults = await testManagementClient.AddTestResultsToTestRunAsync(results.ToArray(), teamProjectName, testRun.Id);
            }

            // TODO CloseFixedBugs()

            var updateProperties = new RunUpdateModel(state: "Completed", completedDate: DateTime.Today.ToShortDateString());
            var updateResults    = await testManagementClient.UpdateTestRunAsync(projectId, testRun.Id, updateProperties);

            if (highFailure && failOnHigh)
            {
                Console.WriteLine("High Issue Found. Deployment Failed.");
                throw new Exception("High Issue Found.  Deployment Failed.");
            }
        }
コード例 #12
0
        /// <inheritdoc />
        public async Task <TestRun> PublishAsync(TestRun testRun)
        {
            using (var timer = new SimpleTimer("PublishTestRun", _logger,
                                               new TelemetryDataWrapper(_telemetry, TelemetryConstants.PipelineTestRunPublisherEventArea, TelemetryConstants.PublishTestRun),
                                               TimeSpan.FromMilliseconds(int.MaxValue)))
            {
                var runCreateModel = new RunCreateModel(name: testRun.TestRunName, buildId: _pipelineConfig.BuildId,
                                                        state: TestRunState.InProgress.ToString(), isAutomated: true, type: RunType.NoConfigRun.ToString());

                runCreateModel.PipelineReference = new PipelineReference()
                {
                    PipelineId     = _pipelineConfig.BuildId,
                    StageReference = new StageReference()
                    {
                        StageName = _pipelineConfig.StageName, Attempt = _pipelineConfig.StageAttempt
                    },
                    PhaseReference = new PhaseReference()
                    {
                        PhaseName = _pipelineConfig.PhaseName, Attempt = _pipelineConfig.PhaseAttempt
                    },
                    JobReference = new JobReference()
                    {
                        JobName = _pipelineConfig.JobName, Attempt = _pipelineConfig.JobAttempt
                    }
                };

                // Create the test run on the server
                var run = await _httpClient.CreateTestRunAsync(runCreateModel, _pipelineConfig.Project);

                _logger.Info($"PipelineTestRunPublisher : PublishAsync : Created test run with id {run.Id}.");
                _telemetry.AddAndAggregate(TelemetryConstants.TestRunIds, new List <int> {
                    run.Id
                },
                                           TelemetryConstants.PipelineTestRunPublisherEventArea);
                _telemetry.AddAndAggregate($"{testRun.ParserUri.Split('/')[0]}RunsCount", 1,
                                           TelemetryConstants.PipelineTestRunPublisherEventArea);

                // Populate test reulsts
                var testResults = new List <TestCaseResult>();

                foreach (var passedTest in testRun.PassedTests)
                {
                    testResults.Add(new TestCaseResult
                    {
                        TestCaseTitle     = passedTest.Name,
                        AutomatedTestName = passedTest.Name,
                        DurationInMs      = passedTest.ExecutionTime.TotalMilliseconds,
                        State             = "Completed",
                        AutomatedTestType = "NoConfig",
                        Outcome           = TestOutcome.Passed.ToString()
                    });
                }

                foreach (var failedTest in testRun.FailedTests)
                {
                    testResults.Add(new TestCaseResult
                    {
                        TestCaseTitle     = failedTest.Name,
                        AutomatedTestName = failedTest.Name,
                        DurationInMs      = failedTest.ExecutionTime.TotalMilliseconds,
                        State             = "Completed",
                        AutomatedTestType = "NoConfig",
                        Outcome           = TestOutcome.Failed.ToString(),
                        StackTrace        = failedTest.StackTrace
                    });
                }

                foreach (var skippedTest in testRun.SkippedTests)
                {
                    testResults.Add(new TestCaseResult
                    {
                        TestCaseTitle     = skippedTest.Name,
                        AutomatedTestName = skippedTest.Name,
                        DurationInMs      = skippedTest.ExecutionTime.TotalMilliseconds,
                        State             = "Completed",
                        AutomatedTestType = "NoConfig",
                        Outcome           = TestOutcome.NotExecuted.ToString()
                    });
                }

                var batchedResults = testResults.Batch(BatchSize);

                foreach (var batch in batchedResults)
                {
                    // Update the run with test results
                    await _httpClient.AddTestResultsToTestRunAsync(batch.ToArray(), _pipelineConfig.Project, run.Id);
                }

                var runUpdateModel = new RunUpdateModel(state: TestRunState.Completed.ToString())
                {
                    RunSummary = new List <RunSummaryModel>()
                };

                runUpdateModel.RunSummary.Add(new RunSummaryModel(resultCount: testRun.TestRunSummary.TotalFailed, testOutcome: TestOutcome.Failed));
                runUpdateModel.RunSummary.Add(new RunSummaryModel(resultCount: testRun.TestRunSummary.TotalPassed, testOutcome: TestOutcome.Passed));
                runUpdateModel.RunSummary.Add(new RunSummaryModel(resultCount: testRun.TestRunSummary.TotalSkipped, testOutcome: TestOutcome.NotExecuted));

                // Complete the run
                await _httpClient.UpdateTestRunAsync(runUpdateModel, _pipelineConfig.Project, run.Id);

                return(new PipelineTestRun(testRun.ParserUri, testRun.RunNamePrefix, testRun.TestRunId, run.Id));
            }
        }
コード例 #13
0
        static void Main(string[] args)
        {
            string collectionUri;

            //set to Uri of the TFS collection
            //if this scipt is running in Build/Release workflow, we will fetch collection Uri from environment variable
            //See https://www.visualstudio.com/en-us/docs/build/define/variables for full list of agent environment variables
            if (Environment.GetEnvironmentVariable("TF_BUILD") == "True")
            {
                collectionUri = Environment.GetEnvironmentVariable("SYSTEM_TEAMFOUNDATIONCOLLECTIONURI");
                Console.WriteLine("Fetched Collection (or VSTS account) from environment variable SYSTEM_TEAMFOUNDATIONCOLLECTIONURI: {0}", collectionUri);
            }
            else   // set it to TFS instance of your choice
            {
                //collectionUri = "http://buildmachine1:8080/tfs/TestDefault";
                collectionUri = "https://manojbableshwar.visualstudio.com";
                Console.WriteLine("Using Collection (or VSTS account): {0}", collectionUri);
            }

            //authentication..
            VssConnection connection = new VssConnection(new Uri(collectionUri), new VssCredentials());

            //set the team project name in which the test results must be published...
            // get team project name from the agent environment variables if the script is running in Build workflow..
            string teamProject;

            if (Environment.GetEnvironmentVariable("TF_BUILD") == "True")
            {
                teamProject = Environment.GetEnvironmentVariable("SYSTEM_TEAMPROJECT");
                Console.WriteLine("Fetched team project from environment variable SYSTEM_TEAMPROJECT: {0}", teamProject);
            }
            else //else set it the team project of your choice...
            {
                teamProject = "PartsUnlimited";
                Console.WriteLine("Using team project: {0}", teamProject);
            }



            //Client to use test run and test result APIs...
            TestManagementHttpClient client = connection.GetClient <TestManagementHttpClient>();

            //Test run model to initialize test run parameters..
            //For automated test runs, isAutomated must be set.. Else manual test run will be created..

            //<<Q: do we want to mark run in progress here?>>
            RunCreateModel TestRunModel = new RunCreateModel(name: "Sample test run from CSV file", isAutomated: true,
                                                             startedDate: DateTime.Now.ToString(), comment: "create run comment");

            //Since we are doing a Asycn call, .Result will wait for the call to complete...
            TestRun testRun = client.CreateTestRunAsync(teamProject, TestRunModel).Result;

            Console.WriteLine("Step 1: test run created -> {0}: {1}; Run url: {2} ", testRun.Id, testRun.Name, testRun.WebAccessUrl);

            string resultsFilePath;

            if (args.Length == 0)
            {
                resultsFilePath = "Results.csv";
            }
            else
            {
                resultsFilePath = args[0];
            }

            //List to hold results from parsed from CSV file...
            List <TestResultCreateModel> testResultsFromCsv = new List <TestResultCreateModel>();

            var reader = new StreamReader(File.OpenRead(resultsFilePath));

            while (!reader.EndOfStream)
            {
                var line   = reader.ReadLine();
                var values = line.Split(',');
                Console.WriteLine("Publishing test {0}", values[0]);

                //Assign values from each line in CSV to result model...
                TestResultCreateModel testResultModel = new TestResultCreateModel();
                testResultModel.TestCaseTitle = testResultModel.AutomatedTestName = values[0];
                testResultModel.Outcome       = values[1];
                //Setting state to completed since we are only publishing results.
                //In advanced scenarios, you can choose to create a test result,
                // move it into in progress state while test test acutally runs and finally update the outcome with state as completed
                testResultModel.State         = "Completed";
                testResultModel.ErrorMessage  = values[2];
                testResultModel.StackTrace    = values[3];
                testResultModel.StartedDate   = values[4];
                testResultModel.CompletedDate = values[5];

                //Add the result ot the results list...
                testResultsFromCsv.Add(testResultModel);
            }

            //Publish the results...
            List <TestCaseResult> resultObj = client.AddTestResultsToTestRunAsync(testResultsFromCsv.ToArray(), teamProject, testRun.Id).Result;

            Console.WriteLine("Step 2: test results published...");

            //Mark the run complete...
            RunUpdateModel testRunUpdate   = new RunUpdateModel(completedDate: DateTime.Now.ToString(), state: "Completed");
            TestRun        RunUpdateResult = client.UpdateTestRunAsync(teamProject, testRun.Id, testRunUpdate).Result;

            Console.WriteLine("Step 3: Test run completed: {0} ", RunUpdateResult.WebAccessUrl);
        }
コード例 #14
0
        /// <inheritdoc />
        public async Task PublishAsync(TestRun testRun)
        {
            var runUri = testRun.ParserUri.Split("/");
            var r      = new RunCreateModel(name: $"{runUri[0]} test run {testRun.TestRunId} - automatically inferred results", buildId: _pipelineConfig.BuildId,
                                            state: TestRunState.InProgress.ToString(), isAutomated: true, type: RunType.NoConfigRun.ToString());
            var run = await _httpClient.CreateTestRunAsync(r, _pipelineConfig.Project);

            var testResults = new List <TestCaseResult>();

            foreach (var passedTest in testRun.PassedTests)
            {
                testResults.Add(new TestCaseResult
                {
                    TestCaseTitle     = passedTest.Name,
                    AutomatedTestName = passedTest.Name,
                    DurationInMs      = passedTest.ExecutionTime.TotalMilliseconds,
                    State             = "Completed",
                    AutomatedTestType = "NoConfig",
                    Outcome           = TestOutcome.Passed.ToString()
                });
            }

            foreach (var failedTest in testRun.FailedTests)
            {
                testResults.Add(new TestCaseResult
                {
                    TestCaseTitle     = failedTest.Name,
                    AutomatedTestName = failedTest.Name,
                    DurationInMs      = failedTest.ExecutionTime.TotalMilliseconds,
                    State             = "Completed",
                    AutomatedTestType = "NoConfig",
                    Outcome           = TestOutcome.Failed.ToString(),
                    StackTrace        = failedTest.StackTrace
                });
            }

            foreach (var skippedTest in testRun.SkippedTests)
            {
                testResults.Add(new TestCaseResult
                {
                    TestCaseTitle     = skippedTest.Name,
                    AutomatedTestName = skippedTest.Name,
                    DurationInMs      = skippedTest.ExecutionTime.TotalMilliseconds,
                    State             = "Completed",
                    AutomatedTestType = "NoConfig",
                    Outcome           = TestOutcome.NotExecuted.ToString()
                });
            }

            await _httpClient.AddTestResultsToTestRunAsync(testResults.ToArray(), _pipelineConfig.Project, run.Id);

            //  var runUpdateModel = new RunUpdateModel(state: TestRunState.Completed.ToString());

            var runUpdateModel = new RunUpdateModel(state: TestRunState.Completed.ToString())
            {
                RunSummary = new List <RunSummaryModel>()
            };

            runUpdateModel.RunSummary.Add(new RunSummaryModel(resultCount: testRun.TestRunSummary.TotalFailed, testOutcome: TestOutcome.Failed));
            runUpdateModel.RunSummary.Add(new RunSummaryModel(resultCount: testRun.TestRunSummary.TotalPassed, testOutcome: TestOutcome.Passed));
            runUpdateModel.RunSummary.Add(new RunSummaryModel(resultCount: testRun.TestRunSummary.TotalSkipped, testOutcome: TestOutcome.NotExecuted));


            await _httpClient.UpdateTestRunAsync(runUpdateModel, _pipelineConfig.Project, run.Id);
        }
        static void Main(string[] args)
        {
            string collectionUri;

            //set to Uri of the TFS collection
            //if this code is running in Build/Release workflow, we will fetch collection Uri from environment variable
            //See https://www.visualstudio.com/en-us/docs/build/define/variables for full list of agent environment variables
            if (Environment.GetEnvironmentVariable("TF_BUILD") == "True")
            {
                collectionUri = Environment.GetEnvironmentVariable("SYSTEM_TEAMFOUNDATIONCOLLECTIONURI");
                Console.WriteLine("Fetched Collection (or VSTS account) from environment variable SYSTEM_TEAMFOUNDATIONCOLLECTIONURI: {0}", collectionUri);
            }
            else   // set it to TFS instance of your choice
            {
                collectionUri = "http://buildmachine1:8080/tfs/TestDefault";
                Console.WriteLine("Using Collection (or VSTS account): {0}", collectionUri);
            }

            //authentication..
            VssConnection connection = new VssConnection(new Uri(collectionUri), new VssCredentials());

            //set the team project name in which the test results must be published...
            // get team project name from the agent environment variables if the script is running in Build workflow..
            string teamProject;

            if (Environment.GetEnvironmentVariable("TF_BUILD") == "True")
            {
                teamProject = Environment.GetEnvironmentVariable("SYSTEM_TEAMPROJECT");
                Console.WriteLine("Fetched team project from environment variable SYSTEM_TEAMPROJECT: {0}", teamProject);
            }
            else //else set it the team project of your choice...
            {
                teamProject = "DefaultAgileGitProject";
                Console.WriteLine("Using team project: {0}", teamProject);
            }

            // get the build number to publish results against...

            string buildNumber, buildUri; int buildId;

            // if this code is running in build workflow, BUILD_BUILDNUMBER and BUILD_BUILDID environment variables have the build info...
            if (Environment.GetEnvironmentVariable("TF_BUILD") == "True")
            {
                //build number is human readable format of the build name, you can confiure it's format in build options..
                buildNumber = Environment.GetEnvironmentVariable("BUILD_BUILDNUMBER");
                Console.WriteLine("Fetched build number from environment variable BUILD_BUILDNUMBER: {0}", buildNumber);

                //build id is the id associated with the build number, which we will use to associate the test run with...
                buildId = Convert.ToInt32(Environment.GetEnvironmentVariable("BUILD_BUILDID"));
                Console.WriteLine("Fetched build id from environment variable BUILD_BUILDID: {0}", buildId);

                //build uri is a more elaborate form of build id, in the vstfs:///Build/Build/<id> format...
                //We will use this for querying test runs against this build...
                buildUri = Environment.GetEnvironmentVariable("BUILD_BUILDURI");
                Console.WriteLine("Fetched build uri from environment variable BUILD_BUILDURI: {0}", buildUri);
            }
            else //if the code is running in standalone mode, you'll have to use Build APIs to fetch the build number...
            //see https://www.visualstudio.com/en-us/docs/integrate/api/build/overview for build APIs...
            {
                buildNumber = "20161124.2";
                buildId     = 40;
                buildUri    = "vstfs:///Build/Build/40";
                Console.WriteLine("Using build number: {0}; build id: {1}; build uri: {2}", buildNumber, buildId, buildUri);
            }

            //Client to use test run and test result APIs...
            TestManagementHttpClient client = connection.GetClient <TestManagementHttpClient>();

            //Test run model to initialize test run parameters..
            //For automated test runs, isAutomated must be set.. Else manual test run will be created..

            //<<Q: do we want to mark run in progress here?>>
            RunCreateModel TestRunModel = new RunCreateModel(name: "Sample test run from CSV file against buildNumber: " + buildNumber, isAutomated: true,
                                                             startedDate: DateTime.Now.ToString(), buildId: buildId);

            //Since we are doing a Asycn call, .Result will wait for the call to complete...
            TestRun testRun = client.CreateTestRunAsync(teamProject, TestRunModel).Result;

            Console.WriteLine("Step 1: test run created -> {0}: {1}; Run url: {2} ", testRun.Id, testRun.Name, testRun.WebAccessUrl);

            string resultsFilePath;

            if (args.Length == 0)
            {
                resultsFilePath = "Results.csv";
            }
            else
            {
                resultsFilePath = args[0];
            }

            //List to hold results from parsed from CSV file...
            List <TestResultCreateModel> testResultsFromCsv = new List <TestResultCreateModel>();

            var reader = new StreamReader(File.OpenRead(resultsFilePath));

            while (!reader.EndOfStream)
            {
                var line   = reader.ReadLine();
                var values = line.Split(',');
                Console.WriteLine("Publishing test {0}", values[0]);

                //Assign values from each line in CSV to result model...
                TestResultCreateModel testResultModel = new TestResultCreateModel();
                testResultModel.TestCaseTitle = testResultModel.AutomatedTestName = values[0];
                testResultModel.Outcome       = values[1];
                //Setting state to completed since we are only publishing results.
                //In advanced scenarios, you can choose to create a test result,
                // move it into in progress state while test test acutally runs and finally update the outcome with state as completed
                testResultModel.State         = "Completed";
                testResultModel.ErrorMessage  = values[2];
                testResultModel.StackTrace    = values[3];
                testResultModel.StartedDate   = values[4];
                testResultModel.CompletedDate = values[5];

                //Add the result ot the results list...
                testResultsFromCsv.Add(testResultModel);
            }

            //Publish the results...
            List <TestCaseResult> publishedResults = client.AddTestResultsToTestRunAsync(testResultsFromCsv.ToArray(), teamProject, testRun.Id).Result;

            Console.WriteLine("Step 2: test results published...");

            //Mark the run complete...
            RunUpdateModel testRunUpdate   = new RunUpdateModel(completedDate: DateTime.Now.ToString(), state: "Completed");
            TestRun        RunUpdateResult = client.UpdateTestRunAsync(teamProject, testRun.Id, testRunUpdate).Result;

            Console.WriteLine("Step 3: Test run completed: {0}", RunUpdateResult.WebAccessUrl);
        }
コード例 #16
0
        static void Main(string[] args)
        {
            string collectionUri;

            //set to Uri of the TFS collection
            //if this code is running in Build/Release workflow, we will fetch collection Uri from environment variable
            //See https://www.visualstudio.com/en-us/docs/build/define/variables for full list of agent environment variables
            if (Environment.GetEnvironmentVariable("TF_BUILD") == "True")
            {
                collectionUri = Environment.GetEnvironmentVariable("SYSTEM_TEAMFOUNDATIONCOLLECTIONURI");
                Console.WriteLine("Fetched Collection (or VSTS account) from environment variable SYSTEM_TEAMFOUNDATIONCOLLECTIONURI: {0}", collectionUri);
            }
            else // set it to TFS instance of your choice
            {
                collectionUri = "http://buildmachine1:8080/tfs/DefaultCollection";
                Console.WriteLine("Using Collection (or VSTS account): {0}", collectionUri);
            }

            //authentication..
            VssConnection connection = new VssConnection(new Uri(collectionUri), new VssCredentials());

            //set the team project name in which the test results must be published...
            // get team project name from the agent environment variables if the script is running in Build/Release workflow..
            string teamProject;

            if (Environment.GetEnvironmentVariable("TF_BUILD") == "True")
            {
                teamProject = Environment.GetEnvironmentVariable("SYSTEM_TEAMPROJECT");
                Console.WriteLine("Fetched team project from environment variable SYSTEM_TEAMPROJECT: {0}", teamProject);
            }
            else //else set it the team project of your choice...
            {
                teamProject = "FabrikamFiber";
                Console.WriteLine("Using team project: {0}", teamProject);
            }

            // get the build number to publish results against...

            string buildNumber = null, buildUri = null, releaseUri = null, releaseEnvironmentUri = null; int buildId;

            // if this code is running in build/release workflow, we will use agent environment variables for fetch build/release Uris to associate information
            if (Environment.GetEnvironmentVariable("TF_BUILD") == "True")
            {
                //If RELEASE_RELEASEURI variable is set, then this code is running in the Release workflow, so we fetch release details
                if (Environment.GetEnvironmentVariable("RELEASE_RELEASEURI") != "")
                {
                    releaseUri = Environment.GetEnvironmentVariable("RELEASE_RELEASEURI");
                    Console.WriteLine("Fetched release uri from environment variable RELEASE_RELEASEURI: {0}", releaseUri);

                    releaseEnvironmentUri = Environment.GetEnvironmentVariable("RELEASE_ENVIRONMENTURI");
                    Console.WriteLine("Fetched release environemnt uri from environment variable RELEASE_ENVIRONMENTURI: {0}", releaseEnvironmentUri);
                }
                //note that the build used to deploy and test a Release is an Aritfact.
                //If you have multiple builds or are using external artifacts like Jenkins, make sure you use Aritfact variables to find the build information
                //See https://www.visualstudio.com/en-us/docs/release/author-release-definition/understanding-tasks#predefvariables for pre-defined variables available in release
                //See https://www.visualstudio.com/en-us/docs/release/author-release-definition/understanding-artifacts#variables for artifact variables documentation
                //For example, you'll have to use RELEASE_ARTIFACTS_<aftifactname>_BUILDID to find the build number.
                //Here we are assuming a simple setup, where we are working with Team Build and using Build variables instead...

                //build number is human readable format of the build name, you can confiure it's format in build options..
                buildNumber = Environment.GetEnvironmentVariable("BUILD_BUILDNUMBER");
                Console.WriteLine("Fetched build number from environment variable BUILD_BUILDNUMBER: {0}", buildNumber);

                //build id is the id associated with the build number, which we will use to associate the test run with...
                buildId = Convert.ToInt32(Environment.GetEnvironmentVariable("BUILD_BUILDID"));
                Console.WriteLine("Fetched build id from environment variable BUILD_BUILDID: {0}", buildId);

                //build uri is a more elaborate form of build id, in the vstfs:///Build/Build/<id> format...
                //We will use this for querying test runs against this build...
                buildUri = Environment.GetEnvironmentVariable("BUILD_BUILDURI");
                Console.WriteLine("Fetched build uri from environment variable BUILD_BUILDURI: {0}", buildUri);
            }
            else //if the code is running in standalone mode, you'll have to use Build and Release APIs to fetch the build and release information...
            //see https://www.visualstudio.com/en-us/docs/integrate/api/build/overview for build APIs...
            //and https://www.visualstudio.com/en-us/docs/release/overview for release APIs...
            {
                buildNumber           = "20161124.2";
                buildId               = 3;
                buildUri              = "vstfs:///Build/Build/40";
                releaseUri            = "vstfs:///ReleaseManagement/Release/2";
                releaseEnvironmentUri = "vstfs:///ReleaseManagement/Environment/2";
                Console.WriteLine("Using build number: {0}; build id: {1}; build uri: {2}; release uri: {3}; release environment uri: {4}", buildNumber, buildId, buildUri, releaseUri, releaseEnvironmentUri);
            }

            //Client to use test run and test result APIs...
            TestManagementHttpClient client = connection.GetClient <TestManagementHttpClient>();

            //Test run model to initialize test run parameters..
            //For automated test runs, isAutomated must be set.. Else manual test run will be created..

            //<<Q: do we want to mark run in progress here?>>
            RunCreateModel TestRunModel     = new RunCreateModel(name: "Sample test run from CSV file against buildNumber: " + buildNumber, isAutomated: true,
                                                                 startedDate: DateTime.Now.ToString(), buildId: buildId, releaseUri: releaseUri, releaseEnvironmentUri: releaseEnvironmentUri);

            //Since we are doing a Asycn call, .Result will wait for the call to complete...
            TestRun testRun = client.CreateTestRunAsync(teamProject, TestRunModel).Result;

            Console.WriteLine("Step 1: test run created -> {0}: {1}; Run url: {2} ", testRun.Id, testRun.Name, testRun.WebAccessUrl);


            string resultsFilePath;

            if (args.Length == 0)
            {
                resultsFilePath = "Results.csv";
            }
            else
            {
                resultsFilePath = args[0];
            }


            TestAttachmentRequestModel fileAttachment = GetAttachmentRequestModel(resultsFilePath);
            TestAttachmentReference    testAttachment = client.CreateTestRunAttachmentAsync(fileAttachment, teamProject, testRun.Id).Result;

            Console.WriteLine("Created test run attachment -> Id: {0}, Url: {2}", testAttachment.Id, testAttachment.Url);

            //List to hold results from parsed from CSV file...
            List <TestResultCreateModel> testResultsFromCsv = new List <TestResultCreateModel>();

            //TestMethodName, Outcome, ErrorMessage, StackTrace, StartedDate, CompletedDate
            string        traceFilePath;
            List <string> resultLogFiles = new List <string>();

            var reader = new StreamReader(File.OpenRead(resultsFilePath));

            while (!reader.EndOfStream)
            {
                var line   = reader.ReadLine();
                var values = line.Split(',');
                Console.WriteLine("Publishing test {0}", values[0]);

                //Assign values from each line in CSV to result model...
                TestResultCreateModel testResultModel = new TestResultCreateModel();
                testResultModel.TestCaseTitle = testResultModel.AutomatedTestName = values[0];
                testResultModel.Outcome       = values[1];
                //Setting state to completed since we are only publishing results.
                //In advanced scenarios, you can choose to create a test result,
                // move it into in progress state while test test acutally runs and finally update the outcome with state as completed
                testResultModel.State         = "Completed";
                testResultModel.ErrorMessage  = values[2];
                testResultModel.StackTrace    = values[3];
                testResultModel.StartedDate   = values[4];
                testResultModel.CompletedDate = values[5];

                //store the path of the attachment in a list. We will publish attachments to results after we publish results and obtain result ids.
                traceFilePath = values[6]; resultLogFiles.Add(traceFilePath);

                //Add the result ot the results list...
                testResultsFromCsv.Add(testResultModel);
            }

            //Publish the results...
            List <TestCaseResult> publishedResults = client.AddTestResultsToTestRunAsync(testResultsFromCsv.ToArray(), teamProject, testRun.Id).Result;

            Console.WriteLine("Step 2: test results published...");

            //results are published in the order they were submitted. H
            //We will now loop through the results file and publish the attachments for each test result.
            //Path of the attachment for each result (sample trace log) is in last column of the result csv file...
            int i = 0;

            foreach (TestCaseResult r in publishedResults)
            {
                Console.WriteLine("Adding attachment for Test Result -> Id: {0}", r.Id);
                fileAttachment = GetAttachmentRequestModel(resultLogFiles.ElementAt(i++));
                testAttachment = client.CreateTestResultAttachmentAsync(fileAttachment, teamProject, testRun.Id, r.Id).Result;
                Console.WriteLine("Created test result attachment -> Id: {0}, Url: {1}", testAttachment.Id, testAttachment.Url);
            }

            //Mark the run complete...
            RunUpdateModel testRunUpdate   = new RunUpdateModel(completedDate: DateTime.Now.ToString(), state: "Completed");
            TestRun        RunUpdateResult = client.UpdateTestRunAsync(teamProject, testRun.Id, testRunUpdate).Result;

            Console.WriteLine("Step 3: Test run completed: {0}", RunUpdateResult.WebAccessUrl);
        }