代码之家  ›  专栏  ›  技术社区  ›  Kristofer Mar Einarsson

算法优化-C#

  •  0
  • Kristofer Mar Einarsson  · 技术社区  · 8 年前

    我有很多测试用例存储在“运行部分”中,还有一些测试用例存储在“套件部分”中。我想比较测试用例,以便在“套件”部分中查看哪些测试用例失败了。但是要获得所有失败的测试用例,我首先必须通过构建循环以获得测试运行,然后通过测试运行循环以获得测试用例,然后我将“运行部分测试用例”与第4个循环中的“套件部分测试用例”进行比较。

    算法如下所示。

    /// <summary>
    /// Check if the sortet masterList matches any other testcases. If it does then return them.
    /// </summary>
    /// <algorithm>
    /// The following soring algorithm is running O(n^4) which we have to optimize somehow. 
    /// </algorithm>
    /// <param name="builds"></param>
    /// <returns></returns>
    /// <summary>
    public IEnumerable<Entities.TestResult> RetrieveTestcasesFromSuite(string project, string buildNumber, int suiteId)
    {
        SuiteSorting aps = new SuiteSorting();
    
        IBuilds build = TSBuilds.GetBuildByBuildNumber(project, buildNumber);
    
        List<Entities.TestResult> failedTestcases = new List<Entities.TestResult>();
    
        //Gets us a list of the testcase names from the suite number
        List<string> dataen = new List<string>();
        var testcaseSortingID = aps.GetTestcasesFromSuite(suiteId);
        foreach (var element in testcaseSortingID)
        {
            dataen.Add(GetTitleFromTestcaseID(element));
        }
    
        //For the build we select, we want to see...
        for (int i = 0; i < build.Count; i++)
        {
            ITestRuns testRuns = TS.Runs.TSRuns.GetTestRunByBuildUri(project, build.Value[i].Uri);
            // Show only test runs that have completed
            IEnumerable<TestRun> sortTestRuns = testRuns.Value.Where(p => p.State == TestState.Completed.ToString());
    
            //Foreach testrun in the build we want to see..
            foreach (ITestRun testRun in sortTestRuns)
            {
                ITestResults testResults = TS.Results.TSResults.GetListOfTestResultsByID(project, testRun.Id);
                // Show only test results that have not passed 
                IEnumerable<TestResult> sortedTestResults = testResults.Value.Where(p => p.Outcome != TestOutcome.Passed.ToString());
    
                //Foreach test result in each testrun we would like to...
                foreach (ITestResult testResult in sortedTestResults)
                {
                    //Foreach testcase found within suites, compare it with all testcases looped from above..
                    foreach (var element in dataen)
                    {
                        //Foreach testcase in suite, compare with testcases from run.
                        if (element.Equals(testResult.TestCaseTitle))
                        {
                            failedTestcases.Add(new Entities.TestResult()
                            {
                                RunId = testResult.TestRun.Id,                      // The test Run ID
                                RunTitle = testResult.TestRun.Name,                 // The test run Title
                                TestResultId = testResult.Id,
                                Area = testResult.Project.Name,
                                ComputerName = testResult.ComputerName,
                                FailureType = testResult.FailureType,
                                ErrorMessage = testResult.ErrorMessage,
                                TestCaseId = testResult.TestCase.Id,
                                TestCaseTitle = testResult.TestCaseTitle,
                                TestRunId = testResult.TestRun.Id,
                                Reason = ReasonHandler.GiveReasonFromErrorMessage(testResult.ErrorMessage), //Reason
                                Match = ReasonHandler.CompareReasonWithErrorMessageOne(testResult.ErrorMessage),
                                ReasonCategorie = GiveCategorieFromReason(testResult.ErrorMessage, ReasonHandler.GiveReasonFromErrorMessage(testResult.ErrorMessage)), //Retrurns Categorie of reason                                                                                                                                                     // numberInRow = dataToReturn.Count, do we use it?
                                JiraIssueUrl = JiraCommunication.CreatejiraUrlFromReason(ReasonHandler.GiveReasonFromErrorMessage(testResult.ErrorMessage)),           //Creates the JiraIssueUrl
                                JiraKey = JiraCommunication.GetJiraKeyFromReason(ReasonHandler.GiveReasonFromErrorMessage(testResult.ErrorMessage)),
                                TestcaseTfsUrl = TfsHandler.GetTestcaseUrl(testResult.TestRun.Id.ToString(), testResult.Id.ToString()),
                                ResolutionStateId = testResult.ResolutionStateId
                            });
                        }
                    }
                }
            }
        }
        return failedTestcases;
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Mark Reimer    8 年前

    正如我们在private@kristofermareinarsson(我们是同事)中讨论的,您的性能冲击来自外部调用,而不是您的算法/cpu的性能问题。

    GetBuildByBuildNumber
    
    GetTestRunByBuildUri
    
    GetListOfTestResultsByID
    

    因为循环上的每个迭代都不依赖于前面的一个,所以循环中的所有逻辑都可以异步运行。从理论上讲,这会把执行时间降到 GetBuildByBuildNumber GetTestRunByBuildUri GetListOfTestResultsByID .

        2
  •  1
  •   sharmav1    8 年前

    var failedTestCases = sortedTestResults.Where(x => dataen.Contains(x.TestCaseTitle)).Select(testResult => new Entities.TestResult
    {
                    RunId = testResult.TestRun.Id,                      // The test Run ID
                    RunTitle = testResult.TestRun.Name,
                    TestResultId = testResult.Id,
                    Area = testResult.Project.Name,
                    // all other columns here ...
    }).ToList();