/// <summary> /// The method generates report by test plan structure. /// </summary> /// <param name="testSuite"><see cref="ITfsTestSuite"/> is the source of test cases to write out.</param> private void CreateReportByTestPlanHierarchy(ITfsTestSuite testSuite) { SyncServiceTrace.D("Creating report by test plan hierarchy..."); if (testSuite == null) { SyncServiceTrace.D("Test suite is null"); return; } // Get the necessary objects. var config = SyncServiceFactory.GetService <IConfigurationService>().GetConfiguration(Document); var testReport = SyncServiceFactory.CreateWord2007TestReportAdapter(Document, config); // Get the detailed test plan. var testPlanDetail = TestAdapter.GetTestPlanDetail(testSuite); if (testPlanDetail == null) { return; } // Create report helper var testReportHelper = new TestReportHelper(TestAdapter, testReport, config, CancellationPending); // Insert test plan template var templateName = config.ConfigurationTest.ConfigurationTestSpecification.TestPlanTemplate; testReportHelper.InsertTestPlanTemplate(templateName, testPlanDetail); // Common part if (IncludeTestConfigurations && SelectedConfigurationPositionType == Contracts.Enums.Model.ConfigurationPositionType.BeneathTestPlan) { CreateConfigurationPart(); } // Call recursion CreateReportByTestSuiteHierarchy(testSuite, 1, true); }
/// <summary> /// Process an Operation /// </summary> private void ProcessPreOperations() { //Process Pre Operations // Get the necessary objects. var config = SyncServiceFactory.GetService <IConfigurationService>().GetConfiguration(Document); testReportOperation = SyncServiceFactory.CreateWord2007TestReportAdapter(Document, config); // Create Report helper var operation = config.ConfigurationTest.GetPreOperationsForTestSpecification(); var testReportHelper = new TestReportHelper(TestAdapter, testReportOperation, config, CancellationPending); testReportOperation.PrepareDocumentForLongTermOperation(); testReportHelper.ProcessOperations(operation); }
/// <summary> /// Check attachment links for generated reporting documents /// </summary> private void WordApplicationOnDocumentOpen(Document document) { if (document != null) { var model = GetModel(document); if (model.TestReportGenerated) { var adapter = SyncServiceFactory.CreateWord2007TestReportAdapter(document, model.Configuration); adapter.CheckAttachmentConsistency(); } } if (DocumentOpen != null) { DocumentOpen(this, new DocumentOpenEventArgs(document)); } }
/// <summary> /// The method writes out the configuration information. /// </summary> private void CreateConfigurationPart() { // Get the necessary objects. var config = SyncServiceFactory.GetService <IConfigurationService>().GetConfiguration(Document); var testReport = SyncServiceFactory.CreateWord2007TestReportAdapter(Document, config); // Create report helper var testReportHelper = new TestReportHelper(TestAdapter, testReport, config, CancellationPending); // Insert header of test configurations var templateName = config.ConfigurationTest.ConfigurationTestSpecification.TestConfigurationElementTemplate; testReportHelper.InsertHeaderTemplate(config.ConfigurationTest.GetHeaderTemplate(templateName)); // Determine configurations var configList = new List <ITfsTestConfiguration>(); //if (SelectedTestConfiguration.Id == AllTestConfigurations.AllTestConfigurationsId) //{ foreach (var testConfiguration in TestConfigurations) { if (testConfiguration.Id == AllTestConfigurations.AllTestConfigurationsId) { continue; } configList.Add(testConfiguration); } //} //else // configList.Add(SelectedTestConfiguration); // Iterate through configurations foreach (var testConfiguration in configList) { testReportHelper.InsertTestConfiguration(templateName, TestAdapter.GetTestConfigurationDetail(testConfiguration)); } }
/// <summary> /// The method generates report by test suite structure - recursion method called from CreateReportByTestPlanHierarchy. /// </summary> /// <param name="testSuite"><see cref="ITfsTestSuite"/> is the source of test cases to write out.</param> /// <param name="headingLevel">Level of the heading. First level is 1.</param> /// <param name="firstSuite"></param> private void CreateReportByTestSuiteHierarchy(ITfsTestSuite testSuite, int headingLevel, bool firstSuite) { SyncServiceTrace.D("Creating report by test suite hierarchy..."); if (testSuite == null) { SyncServiceTrace.D("Test suite is null"); return; } // Get the necessary objects. var config = SyncServiceFactory.GetService <IConfigurationService>().GetConfiguration(Document); var testReport = SyncServiceFactory.CreateWord2007TestReportAdapter(Document, config); // Get the detailed test suite. var testSuiteDetail = TestAdapter.GetTestSuiteDetail(testSuite); if (testSuiteDetail == null) { return; } var expandSharedSteps = config.ConfigurationTest.ExpandSharedSteps; // Check if this test suite or any child test suite contains at least one test case. // If no, to nothing. var allTestCases = TestAdapter.GetAllTestCases(testSuite, expandSharedSteps); if (allTestCases == null || allTestCases.Count == 0) { SyncServiceTrace.D("Given test suite does not contain tast cases."); return; } SyncServiceTrace.D("Number of test cases:" + allTestCases.Count); // Create report helper var testReportHelper = new TestReportHelper(TestAdapter, testReport, config, CancellationPending); // Insert heading testReportHelper.InsertHeadingText(testSuiteDetail.TestSuite.Title, headingLevel); var templateName = config.ConfigurationTest.ConfigurationTestSpecification.TestSuiteTemplate; // Insert leaf test suite template for leaf suites if (testSuiteDetail.TestSuite.TestSuites == null || !testSuiteDetail.TestSuite.TestSuites.Any()) { templateName = config.ConfigurationTest.ConfigurationTestSpecification.LeafTestSuiteTemplate; } // Insert root test suite template: if null, root test suite template = test suite template if (firstSuite) { templateName = config.ConfigurationTest.ConfigurationTestSpecification.RootTestSuiteTemplate; } testReportHelper.InsertTestSuiteTemplate(templateName, testSuiteDetail); // Print the test configuration beneath the first testsuite if (!_testConfigurationInformationPrinted && IncludeTestConfigurations && SelectedConfigurationPositionType == Contracts.Enums.Model.ConfigurationPositionType.BeneathFirstTestSuite) { CreateConfigurationPart(); _testConfigurationInformationPrinted = true; } // Get test cases of the test suite - only test cases in this test suite var testCases = TestAdapter.GetTestCases(testSuiteDetail.TestSuite, expandSharedSteps); // TestCasesHelper need document structure, but the enumerations has not value 'None' // We will use the functionality without this structure capability var helper = new TestCaseHelper(testCases, SelectedDocumentStructureType); // Get sorted test cases var sortedTestCases = helper.GetTestCases(SelectedTestCaseSortType); // Test if test cases exists if (sortedTestCases != null && sortedTestCases.Count > 0) { // Write out the common part of test case block templateName = config.ConfigurationTest.ConfigurationTestSpecification.TestCaseElementTemplate; testReportHelper.InsertHeaderTemplate(config.ConfigurationTest.GetHeaderTemplate(templateName)); // Iterate all test cases foreach (var testCase in sortedTestCases) { if (CancellationPending()) { return; } // Write out the test case part testReportHelper.InsertTestCase(templateName, testCase); } } // Check child suites if (testSuiteDetail.TestSuite.TestSuites != null) { // Iterate through child test suites foreach (var childTestSuite in testSuiteDetail.TestSuite.TestSuites) { if (CancellationPending()) { return; } CreateReportByTestSuiteHierarchy(childTestSuite, headingLevel + 1, false); } } //Print the configuration information beneath all TestSuites if (IncludeTestConfigurations && SelectedConfigurationPositionType == Contracts.Enums.Model.ConfigurationPositionType.BeneathTestSuites) { CreateConfigurationPart(); } }
/// <summary> /// The method creates report structured by iteration path. /// </summary> /// <param name="testSuite"><see cref="ITfsTestSuite"/> is the source of test cases to write out.</param> private void CreateReportByIterationPath(ITfsTestSuite testSuite) { SyncServiceTrace.D("Creating report by iteration path..."); if (testSuite == null) { SyncServiceTrace.D("Test suite is null"); return; } // Get the necessary objects. var config = SyncServiceFactory.GetService <IConfigurationService>().GetConfiguration(Document); var testReport = SyncServiceFactory.CreateWord2007TestReportAdapter(Document, config); // Get the detailed test plan. var testPlanDetail = TestAdapter.GetTestPlanDetail(testSuite); if (testPlanDetail == null) { return; } // Get the detailed test suite. var testSuiteDetail = TestAdapter.GetTestSuiteDetail(testSuite); if (testSuiteDetail == null) { return; } // Create report helper var testReportHelper = new TestReportHelper(TestAdapter, testReport, config, CancellationPending); // Insert test plan template var templateName = config.ConfigurationTest.ConfigurationTestSpecification.TestPlanTemplate; testReportHelper.InsertTestPlanTemplate(templateName, testPlanDetail); // Insert test suite template templateName = config.ConfigurationTest.ConfigurationTestSpecification.RootTestSuiteTemplate; testReportHelper.InsertTestSuiteTemplate(templateName, testSuiteDetail); // TODO MIS THIS IS THE ONLY PLACE WHERE GetAllTestCases can be called in context of the configuration template... Check late if it is enough only extend GetAllTestCases for at this single place here with the additional parameter // Get test cases of the test suite - with test cases in sub test suites var expandSharedSteps = config.ConfigurationTest.ExpandSharedSteps; var testCases = TestAdapter.GetAllTestCases(testSuiteDetail.TestSuite, expandSharedSteps); SyncServiceTrace.D("Number of test cases:" + testCases.Count); // Create test case helper var helper = new TestCaseHelper(testCases, SelectedDocumentStructureType); // Get all path elements from all test cases var pathElements = helper.GetPathElements(SkipLevels); // Iterate through path elements foreach (var pathElement in pathElements) { // Insert heading testReportHelper.InsertHeadingText(pathElement.PathPart, pathElement.Level - SkipLevels); // Get sorted test cases var sortedTestCases = helper.GetTestCases(pathElement, SelectedTestCaseSortType); if (sortedTestCases != null && sortedTestCases.Count > 0) { // Write out the common part of test case block templateName = config.ConfigurationTest.ConfigurationTestSpecification.TestCaseElementTemplate; testReportHelper.InsertHeaderTemplate(config.ConfigurationTest.GetHeaderTemplate(templateName)); // Iterate all test cases foreach (var testCase in sortedTestCases) { if (CancellationPending()) { return; } // Write out the test case part testReportHelper.InsertTestCase(templateName, testCase); } } } // Remove the inserted bookmarks testReport.RemoveBookmarks(); // Common part if (IncludeTestConfigurations && SelectedConfigurationPositionType == Contracts.Enums.Model.ConfigurationPositionType.BeneathTestPlan) { CreateConfigurationPart(); } }
/// <summary> /// The method creates unstructured report - writes out all test cases in one block. /// </summary> /// <param name="testSuite"><see cref="ITfsTestSuite"/> is the source of test cases to write out.</param> private void CreateReportUnstructured(ITfsTestSuite testSuite) { if (testSuite == null) { return; } // Get the necessary objects. var config = SyncServiceFactory.GetService <IConfigurationService>().GetConfiguration(Document); var testReport = SyncServiceFactory.CreateWord2007TestReportAdapter(Document, config); // Get the detailed test plan. var testPlanDetail = TestAdapter.GetTestPlanDetail(testSuite); if (testPlanDetail == null) { return; } // Get the detailed test suite. var testSuiteDetail = TestAdapter.GetTestSuiteDetail(testSuite); if (testSuiteDetail == null) { return; } // Create report helper var testReportHelper = new TestReportHelper(TestAdapter, testReport, config, CancellationPending); // Insert test plan template var templateName = config.ConfigurationTest.ConfigurationTestSpecification.TestPlanTemplate; testReportHelper.InsertTestPlanTemplate(templateName, testPlanDetail); // Common part if (IncludeTestConfigurations && SelectedConfigurationPositionType == Contracts.Enums.Model.ConfigurationPositionType.BeneathTestPlan) { CreateConfigurationPart(); } // Insert test suite template templateName = config.ConfigurationTest.ConfigurationTestSpecification.RootTestSuiteTemplate; var expandSharedSteps = config.ConfigurationTest.ExpandSharedSteps; testReportHelper.InsertTestSuiteTemplate(templateName, testSuiteDetail); // Get test cases of the test suite - with test cases in sub test suites var testCases = TestAdapter.GetAllTestCases(testSuiteDetail.TestSuite, expandSharedSteps); // TestCasesHelper need document structure, but the enumerations has not value 'None' // We will use the functionality without this structure capability var helper = new TestCaseHelper(testCases, SelectedDocumentStructureType); // Get sorted test cases var sortedTestCases = helper.GetTestCases(SelectedTestCaseSortType); // Test if test cases exists if (sortedTestCases != null && sortedTestCases.Count > 0) { // Write out the common part of test case block templateName = config.ConfigurationTest.ConfigurationTestSpecification.TestCaseElementTemplate; testReportHelper.InsertHeaderTemplate(config.ConfigurationTest.GetHeaderTemplate(templateName)); // Iterate all test cases foreach (var testCase in sortedTestCases) { if (CancellationPending()) { return; } // Write out the test case part testReportHelper.InsertTestCase(templateName, testCase); } } }
/// <summary> /// The method creates report for selected test suite. /// </summary> public void CreateReport() { SyncServiceTrace.D("Creating report..."); SyncServiceDocumentModel.TestReportRunning = true; try { ProcessPreOperations(); // Common part if (IncludeTestConfigurations && SelectedConfigurationPositionType == Contracts.Enums.Model.ConfigurationPositionType.AboveTestPlan) { CreateConfigurationPart(); } if (CreateDocumentStructure) { switch (SelectedDocumentStructureType) { case DocumentStructureType.AreaPath: CreateReportByAreaPath(SelectedTestSuite); break; case DocumentStructureType.IterationPath: CreateReportByIterationPath(SelectedTestSuite); break; case DocumentStructureType.TestPlanHierarchy: CreateReportByTestPlanHierarchy(SelectedTestSuite); break; } } else { CreateReportUnstructured(SelectedTestSuite); } if (!CancellationPending()) { // Set the 'Report generated' only if the report was not canceled SyncServiceDocumentModel.TestReportGenerated = true; if (ViewDispatcher != null) { ViewDispatcher.Invoke(() => CreateReportCommand.CallEventCanExecuteChanged()); } StoreReportData(); } var config = SyncServiceFactory.GetService <IConfigurationService>().GetConfiguration(Document); var testReport = SyncServiceFactory.CreateWord2007TestReportAdapter(Document, config); var testReportHelper = new TestReportHelper(TestAdapter, testReport, config, CancellationPending); if (TestReportingProgressCancellationService.CheckIfContinue()) { testReportHelper.CreateSummaryPage(WordDocument, SelectedTestPlan); ProcessPostOperations(); } else { SyncServiceTrace.I("Skipped creation of summary page and processing post operations because of error or cancellation."); } } catch (Exception ex) { var infoStorageService = SyncServiceFactory.GetService <IInfoStorageService>(); if (infoStorageService == null) { throw; } IUserInformation info = new UserInformation { Text = Resources.TestSpecification_Error, Explanation = ex is OperationCanceledException ? ex.Message : ex.ToString(), Type = UserInformationType.Error }; infoStorageService.AddItem(info); } finally { SyncServiceDocumentModel.TestReportRunning = false; } }
/// <summary> /// Background method to import the work items from TFS. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">A <see cref="RunWorkerCompletedEventArgs"/> that contains the event data</param> private void DoImport(object sender, DoWorkEventArgs e) { SyncServiceTrace.I(Resources.ImportWorkItems); if (_workItemSyncService == null || _configService == null) { SyncServiceTrace.D(Resources.ServicesNotExists); throw new Exception(Resources.ServicesNotExists); } _documentModel.Save(); _destination.ProcessOperations(_configuration.PreOperations); var importWorkItems = (from wim in FoundWorkItems select wim.Item).ToList(); SyncServiceTrace.D(Resources.NumberOfFoundWorkItems + FoundWorkItems.Count); // display progress dialog var progressService = SyncServiceFactory.GetService <IProgressService>(); progressService.ShowProgress(); progressService.NewProgress(Resources.GetWorkItems_Title); // search for already existing work items in word and ask whether to overide them if (!(_source.Open(importWorkItems.Select(x => x.TfsItem.Id).ToArray()) && _destination.Open(null))) { return; } if (importWorkItems.Select(x => x.TfsItem.Id).Intersect(_destination.WorkItems.Select(x => x.Id)).Any()) { } if (!_testSpecByQuery) { _workItemSyncService.Refresh(_source, _destination, importWorkItems.Select(x => x.TfsItem), _configuration); } if (_testSpecByQuery) { var testAdapter = SyncServiceFactory.CreateTfsTestAdapter(_documentModel.TfsServer, _documentModel.TfsProject, _documentModel.Configuration); var model = new TestSpecificationReportByQueryModel(_tfsService, _documentModel, testAdapter, _workItems); var expandSharedsteps = _configuration.ConfigurationTest.ExpandSharedSteps; var testCases = model.GetTestCasesFromWorkItems(importWorkItems, expandSharedsteps); var sharedSteps = model.GetSharedStepsFromWorkItems(importWorkItems); // Get any pre and post operations for the reports var preOperations = _configuration.ConfigurationTest.GetPreOperationsForTestSpecification(); var postOperations = _configuration.ConfigurationTest.GetPostOperationsForTestSpecification(); var testReport = SyncServiceFactory.CreateWord2007TestReportAdapter(_wordDocument, _configuration); var testReportHelper = new TestReportHelper(testAdapter, testReport, _configuration, () => !IsImporting); testReportHelper.ProcessOperations(preOperations); if (sharedSteps.Count > 0) { _workItemSyncService.RefreshAndSubstituteSharedStepItems(_source, _destination, importWorkItems.Select(x => x.TfsItem), _configuration, testReportHelper, sharedSteps); } if (testCases.Count > 0) { _workItemSyncService.RefreshAndSubstituteTestItems(_source, _destination, importWorkItems.Select(x => x.TfsItem), _configuration, testReportHelper, testCases); } if (_testReportingProgressCancellationService.CheckIfContinue()) { testReportHelper.CreateSummaryPage(_wordDocument, null); testReportHelper.ProcessOperations(postOperations); } else { SyncServiceTrace.I(Resources.DoImportError); } _documentModel.TestReportGenerated = true; } _destination.ProcessOperations(_configuration.PostOperations); }
/// <summary> /// Background method to import the work items from TFS. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">A <see cref="DoWorkEventArgs"/> that contains the event data.</param> public void DoImport(object sender, DoWorkEventArgs e) { SyncServiceTrace.I(Resources.ImportWorkItems); var workItemSyncService = SyncServiceFactory.GetService <IWorkItemSyncService>(); var configService = SyncServiceFactory.GetService <IConfigurationService>(); // save query configuration to document DocumentModel.SaveQueryConfiguration(_queryConfiguration); DocumentModel.Save(); // set actual selected configuration var configuration = configService.GetConfiguration(WordDocument); _importTestReport = SyncServiceFactory.CreateWord2007TestReportAdapter(WordDocument, configuration); var ignoreFormatting = configuration.IgnoreFormatting; var conflictOverwrite = configuration.ConflictOverwrite; configuration.ActivateMapping(DocumentModel.MappingShowName); DocumentModel.Configuration.IgnoreFormatting = ignoreFormatting; configuration.ConflictOverwrite = conflictOverwrite; configuration.IgnoreFormatting = ignoreFormatting; var source = SyncServiceFactory.CreateTfs2008WorkItemSyncAdapter(DocumentModel.TfsServer, DocumentModel.TfsProject, null, configuration); var destination = SyncServiceFactory.CreateWord2007TableWorkItemSyncAdapter(WordDocument, configuration); var importWorkItems = (from wim in FoundWorkItems where wim.IsChecked select wim.Item).ToList(); if (!(source.Open(importWorkItems.Select(x => x.TfsItem.Id).ToArray()) && destination.Open(null))) { return; } // Check for test cases. var expandSharedsteps = configuration.ConfigurationTest.ExpandSharedSteps; var testCases = GetTestCasesFromWorkItems(importWorkItems, expandSharedsteps); // Check for shared steps var sharedSteps = GetSharedStepsFromWorkItems(importWorkItems); //Get any pre and post operations for the reports var preOperations = configuration.ConfigurationTest.GetPreOperationsForTestSpecification(); var postOperations = configuration.ConfigurationTest.GetPostOperationsForTestSpecification(); var testReportHelper = new TestReportHelper(_testAdapter, _importTestReport, configuration, () => !IsImporting); _importTestReport.PrepareDocumentForLongTermOperation(); testReportHelper.ProcessOperations(preOperations); if (testCases.Count > 0 && sharedSteps.Count > 0) { throw new ConfigurationException("Function can only be used for either shared steps or test cases. Select only work items of one Type."); } if (testCases.Count > 0) { workItemSyncService.RefreshAndSubstituteTestItems(source, destination, importWorkItems.Select(x => x.TfsItem), configuration, testReportHelper, testCases); } if (sharedSteps.Count > 0) { workItemSyncService.RefreshAndSubstituteSharedStepItems(source, destination, importWorkItems.Select(x => x.TfsItem), configuration, testReportHelper, sharedSteps); } // when cancelled by the user skip further steps var progressService = SyncServiceFactory.GetService <IProgressService>(); if (null != progressService && !progressService.ProgressCanceled) { testReportHelper.CreateSummaryPage(WordDocument, null); testReportHelper.ProcessOperations(postOperations); } else { SyncServiceTrace.I("Skipped"); } DocumentModel.TestReportGenerated = true; }