/// <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(); } }