Пример #1
0
        public BlockerResolverResult Resolve(List <Blocker> blockers)
        {
            var blockerIdsToResolve = blockers.Select(x => x.Id);

            var unresolvedBlockers = _extendedBlockers.Where(x => !blockerIdsToResolve.Contains(x.Id)).Select(x => new Blocker
            {
                Id   = x.Id,
                Name = x.Name,
                Cost = x.Cost
            });

            var resolvedTestcases = InitialDataset.Testcases.Select(x => new Testcase
            {
                Id                = x.Id,
                Name              = x.Name,
                TestType          = x.TestType,
                ApplicationModule = x.ApplicationModule,
                BlockerIds        = x.BlockerIds.Except(blockerIdsToResolve).ToList()
            });

            var localDataset = new TestcaseBlockerDataset
            {
                Blockers  = unresolvedBlockers.ToList(),
                Testcases = resolvedTestcases.ToList()
            };

            var result = new BlockerResolverResult(_initialDataset, localDataset);

            return(result);
        }
Пример #2
0
        public BlockerResolver(TestcaseBlockerDataset initialDataset)
        {
            _initialDataset = initialDataset;

            _extendedBlockers = InitialDataset.Blockers.Select(x => new ExtendedBlocker
            {
                Id        = x.Id,
                Name      = x.Name,
                Cost      = x.Cost,
                Testcases = InitialDataset.Testcases.Where(t => t.BlockerIds.Contains(x.Id)).ToList()
            }).ToList();
        }
Пример #3
0
        public void EnsureDeepClonedDatasetIsEqualToOriginal()
        {
            var numBlockers  = 10;
            var numTestcases = 50;

            TestcaseBlockerDataset originalDataset = DataGenerator.GenerateRandomData(numBlockers, numTestcases);

            var clonedDataset = (TestcaseBlockerDataset)CloneHelper.GetDeepClone(originalDataset);

            Assert.IsInstanceOf <TestcaseBlockerDataset>(clonedDataset);
            Assert.IsTrue(clonedDataset.Blockers.Count == numBlockers);
            Assert.IsTrue(clonedDataset.Testcases.Count == numTestcases);
        }
Пример #4
0
        public static TestcaseBlockerDataset GenerateRandomData(int numberOfBlockers, int numberOfTestcases)
        {
            var blockers  = new List <Blocker>();
            var testcases = new List <Testcase>();

            var rnd = new Random();

            // Generate Blockers
            for (int i = 1; i <= numberOfBlockers; i++)
            {
                blockers.Add(new Blocker
                {
                    Id   = Guid.NewGuid().ToString(),
                    Name = $"Blocker {i}"
                });
            }

            // Generate Testcases
            for (int i = 1; i <= numberOfTestcases; i++)
            {
                var testcase = new Testcase
                {
                    Id   = Guid.NewGuid().ToString(),
                    Name = $"Testcase {i}"
                };

                var numberOfBlockersForTestcase = rnd.Next(0, (int)Math.Ceiling(0.5 * numberOfBlockers));
                while (testcase.BlockerIds.Count < numberOfBlockersForTestcase)
                {
                    var blockerId = blockers[rnd.Next(0, numberOfBlockers)].Id;
                    if (!testcase.BlockerIds.Contains(blockerId))
                    {
                        testcase.BlockerIds.Add(blockerId);
                    }
                }

                testcases.Add(testcase);
            }

            TestcaseBlockerDataset configuration = new TestcaseBlockerDataset
            {
                Blockers  = blockers,
                Testcases = testcases
            };

            return(configuration);
        }
Пример #5
0
        public static async Task ExportDataset(TestcaseBlockerDataset dataset)
        {
            if (dataset is null)
            {
                Console.WriteLine("Cannot export an empty dataset. First generate or load a dataset.");
                return;
            }

            Console.Write("Enter filename without extension: ");
            string filename = Console.ReadLine();

            var path = Path.Combine(GetDataPath(), filename + ".xlsx");

            Console.WriteLine($"Exporting dataset to {path}");

            await dataset.ExportAsXlsxAsync(path);
        }
Пример #6
0
        public static async Task SaveDataset(TestcaseBlockerDataset dataset)
        {
            if (dataset is null)
            {
                Console.WriteLine("Cannot save an empty dataset. First generate or load a dataset.");
                return;
            }

            Console.Write("Enter filename without extension: ");
            string filename = Console.ReadLine();

            var path = Path.Combine(GetDataPath(), filename + ".json");

            Console.WriteLine($"Saving dataset to {path}");

            await IOOperations.SaveAsync <TestcaseBlockerDataset>(path, dataset);
        }
Пример #7
0
        public void EnsureCopiedDatasetIsSameInstanceAsOriginalDataset()
        {
            var numBlockers  = 10;
            var numTestcases = 50;

            TestcaseBlockerDataset originalDataset = DataGenerator.GenerateRandomData(numBlockers, numTestcases);
            var copiedDataset = originalDataset;

            var originalTestcase = originalDataset.Testcases.Where(x => x.BlockerIds.Count > 0).FirstOrDefault();
            var copiedTestcase   = copiedDataset.Testcases.Where(x => x.Id == originalTestcase.Id).FirstOrDefault();

            Assert.IsTrue(originalTestcase.Name == copiedTestcase.Name);
            Assert.IsTrue(originalTestcase.BlockerIds.Count == copiedTestcase.BlockerIds.Count);

            copiedTestcase.BlockerIds.Clear();
            Assert.IsTrue(originalTestcase.BlockerIds.Count == copiedTestcase.BlockerIds.Count);
        }
Пример #8
0
        public void EnsureDeepClonedDatasetIsDifferentInstanceThanOriginalDataset()
        {
            var numBlockers  = 10;
            var numTestcases = 50;

            TestcaseBlockerDataset originalDataset = DataGenerator.GenerateRandomData(numBlockers, numTestcases);
            var clonedDataset = (TestcaseBlockerDataset)CloneHelper.GetDeepClone(originalDataset);

            var originalTestcase = originalDataset.Testcases.Where(x => x.BlockerIds.Count > 0).FirstOrDefault();
            var clonedTestcase   = clonedDataset.Testcases.Where(x => x.Id == originalTestcase.Id).FirstOrDefault();

            Assert.IsTrue(originalTestcase.Name == clonedTestcase.Name);
            Assert.IsTrue(originalTestcase.BlockerIds.Count == clonedTestcase.BlockerIds.Count);

            clonedTestcase.BlockerIds.Clear();
            Assert.IsFalse(originalTestcase.BlockerIds.Count == clonedTestcase.BlockerIds.Count);
        }
Пример #9
0
        public static async Task RunOptimization(TestcaseBlockerDataset dataset)
        {
            if (dataset is null)
            {
                Console.WriteLine("Cannot run optimization for an empty dataset. First generate or load a dataset.");
                return;
            }

            var debugOutput = true;

            Console.Write("Suppress output information for each generation (y)? ");
            if (Console.ReadLine().ToLower() == "y")
            {
                debugOutput = false;
            }

            var watch = new Stopwatch();

            watch.Start();

            var optimizer = new Optimizer(dataset);

            if (debugOutput)
            {
                optimizer.ChromosomeEvaluated += Optimizer_ChromosomeEvaluated;
                optimizer.GenerationEvaluated += Optimizer_GenerationEvaluated;
            }
            else
            {
                optimizer.GenerationEvaluated += Optimizer_GenerationProgress;
            }
            var result = optimizer.Optimize();

            var duration = TimeSpan.FromMilliseconds(watch.ElapsedMilliseconds);

            watch.Stop();

            var resolvedBlockers = string.Join(",", result.ResolvedBlockers.Select(x => x.Name).ToList());

            if (resolvedBlockers.Length > 100)
            {
                resolvedBlockers = resolvedBlockers.Substring(0, 97) + "...";
            }

            var resolvedTestcases = string.Join(",", result.ResolvedTestcases.Select(x => x.Id).ToList());

            if (resolvedTestcases.Length > 100)
            {
                resolvedTestcases = resolvedTestcases.Substring(0, 97) + "...";
            }

            var resolvedTestcasesIncludingUnblocked = string.Join(",", result.ResolvedTestcasesIncludingUnblocked.Select(x => x.Id).ToList());

            if (resolvedTestcasesIncludingUnblocked.Length > 100)
            {
                resolvedTestcasesIncludingUnblocked = resolvedTestcasesIncludingUnblocked.Substring(0, 97) + "...";
            }

            Console.WriteLine();
            Console.WriteLine($"Duration                      : {duration.ToString()} (including output)");
            Console.WriteLine($"Best solution fitness         : {result.Fitness}");
            Console.WriteLine($"Resolved Blockers             : ({result.NumberOfResolvedBlockers}/{result.Cost}) [{resolvedBlockers}]");
            Console.WriteLine($"Resolved Testcases            : ({result.NumberOfResolvedTestcases}/{result.Value}) [{resolvedTestcases}]");
            Console.WriteLine($"Resolved Testcases w/unblocked: ({result.NumberOfResolvedTestcasesIncludingUnblocked}/{result.ValueIncludingUnblocked}) [{resolvedTestcasesIncludingUnblocked}]");
            Console.WriteLine();
            Console.Write("Save result (y|n)? ");

            var saveResult = Console.ReadLine().Trim().ToLower();

            if (saveResult == "y")
            {
                Console.Write("Enter filename without extension: ");
                string filename = Console.ReadLine();

                var path = Path.Combine(GetDataPath(), filename + ".json");

                Console.WriteLine($"Saving result to {path}");

                await IOOperations.SaveAsync <OptimizationResult>(path, result);
            }
        }
Пример #10
0
        static async Task Main(string[] args)
        {
            var runApp = true;
            TestcaseBlockerDataset dataset = null;

            while (runApp)
            {
                PrintMenu();

                var choice = Console.ReadLine();

                switch (choice.ToLower())
                {
                case "q":
                    runApp = false;
                    break;

                case "0":
                    dataset = ImportDataset();
                    Console.ReadKey();
                    break;

                case "1":
                    dataset = await GenerateDataset();

                    Console.ReadKey();
                    break;

                case "2":
                    ShowAvailableDatasets();
                    Console.ReadKey();
                    break;

                case "3":
                    dataset = await LoadDataset();

                    Console.ReadKey();
                    break;

                case "4":
                    await SaveDataset(dataset);

                    Console.ReadKey();
                    break;

                case "5":
                    await ExportDataset(dataset);

                    Console.ReadKey();
                    break;

                case "6":
                    await RunOptimization(dataset);

                    Console.ReadKey();
                    break;

                default:
                    break;
                }
            }
        }
Пример #11
0
 public BlockerResolverResult(TestcaseBlockerDataset initialDataset, TestcaseBlockerDataset resolvedDataset)
 {
     _initialDataset  = initialDataset;
     _resolvedDataset = resolvedDataset;
 }
Пример #12
0
        private DataView ConvertDatasetToTable(TestcaseBlockerDataset dataset)
        {
            if (dataset == null)
            {
                return(null);
            }

            var table = new DataTable();

            // Spalten
            table.Columns.Add(new DataColumn("#", typeof(int)));
            table.Columns.Add(new DataColumn("Testcase Id", typeof(string)));
            table.Columns.Add(new DataColumn("Testcase Name", typeof(string)));
            table.Columns.Add(new DataColumn("Test Type", typeof(string)));
            table.Columns.Add(new DataColumn("App. Module", typeof(string)));
            table.Columns.Add(new DataColumn("Value", typeof(string)));


            Dictionary <string, int> sumOfBlockedTestcases = new Dictionary <string, int>();

            foreach (var blocker in dataset.Blockers)
            {
                table.Columns.Add(new DataColumn(blocker.Name, typeof(string)));
                sumOfBlockedTestcases.Add(blocker.Id, 0);
            }

            table.Columns.Add(new DataColumn("Number of Blockers", typeof(int)));

            // Zeilen
            for (var testcaseIndex = 0; testcaseIndex < dataset.Testcases.Count; testcaseIndex++)
            {
                var testcase = dataset.Testcases[testcaseIndex];
                var newRow   = table.NewRow();
                newRow[0] = testcaseIndex + 1;
                newRow[1] = testcase.Id;
                newRow[2] = testcase.Name;
                newRow[3] = testcase.TestType;
                newRow[4] = testcase.ApplicationModule;
                newRow[5] = dataset.GetValueForTestcases(new List <Testcase> {
                    testcase
                });

                for (int i = 0; i < dataset.Blockers.Count; i++)
                {
                    var blockerId = dataset.Blockers[i].Id;
                    if (testcase.BlockerIds.Contains(blockerId))
                    {
                        newRow[i + 6] = "x";
                        sumOfBlockedTestcases[blockerId]++;
                    }
                }

                newRow[dataset.Blockers.Count + 6] = testcase.BlockerIds.Count;

                table.Rows.Add(newRow);
            }

            // Ergebniszeile
            var resultRow = table.NewRow();

            for (int i = 0; i < dataset.Blockers.Count; i++)
            {
                var blockerId = dataset.Blockers[i].Id;
                var blocked   = sumOfBlockedTestcases[blockerId];
                resultRow[i + 6] = blocked;
            }
            table.Rows.Add(resultRow);


            return(table.DefaultView);
        }
Пример #13
0
        public static TestcaseBlockerDataset ImportFromExcel(string filename, ExcelImportOptions options)
        {
            if (string.IsNullOrEmpty(options.WorksheetName))
            {
                throw new ArgumentException("WorksheetName is empty");
            }

            if (string.IsNullOrEmpty(options.BlockerSeparator))
            {
                throw new ArgumentException("BlockerSeparator is empty");
            }

            if (options.ColumnNumberTestcaseId <= 0)
            {
                throw new ArgumentException("ColumnNumberTestcaseId must be greater than zero.");
            }

            if (options.ColumnNumberTestcaseName <= 0)
            {
                throw new ArgumentException("ColumnNumberTestcaseName must be greater than zero.");
            }

            if (options.ColumnNumberBlockerNames <= 0)
            {
                throw new ArgumentException("ColumnNumberBlockerNames must be greater than zero.");
            }

            if (options.FirstDataRow <= 0)
            {
                throw new ArgumentException("FirstDataRow must be greater than zero.");
            }

            try
            {
                var blockers  = new List <Blocker>();
                var testcases = new List <Testcase>();

                FileInfo existingFile = new FileInfo(filename);
                using (var excel = new ExcelPackage(existingFile))
                {
                    var ws = excel.Workbook.Worksheets[options.WorksheetName];
                    if (!options.LastDataRow.HasValue)
                    {
                        options.LastDataRow = ws.Dimension.End.Row;
                    }

                    for (int row = options.FirstDataRow; row <= options.LastDataRow.Value; row++)
                    {
                        var testcaseId   = (Convert.ToString(ws.Cells[row, options.ColumnNumberTestcaseId].Value)).Trim();
                        var testcaseName = (Convert.ToString(ws.Cells[row, options.ColumnNumberTestcaseName].Value)).Trim();

                        var blockerNamesString = (Convert.ToString(ws.Cells[row, options.ColumnNumberBlockerNames].Value)).Trim();
                        var blockerNames       = new List <string>(blockerNamesString.Split(options.BlockerSeparator.ToCharArray()));

                        var testtype          = options.ColumnNumberTestType.HasValue ? (Convert.ToString(ws.Cells[row, options.ColumnNumberTestType.Value].Value)).Trim() : string.Empty;
                        var applicationModule = options.ColumnNumberApplicationModule.HasValue ? (Convert.ToString(ws.Cells[row, options.ColumnNumberApplicationModule.Value].Value)).Trim(): string.Empty;

                        var testcase = new Testcase
                        {
                            Id                = testcaseId,
                            Name              = testcaseName,
                            TestType          = testtype,
                            ApplicationModule = applicationModule
                        };

                        foreach (var blockerName in blockerNames)
                        {
                            var trimmedBlockerName = blockerName.Trim().ToLower();

                            if (!string.IsNullOrEmpty(trimmedBlockerName))
                            {
                                var existingBlocker = blockers.Where(x => x.Name == trimmedBlockerName).FirstOrDefault();

                                if (existingBlocker == null)
                                {
                                    existingBlocker = new Blocker
                                    {
                                        Id   = Guid.NewGuid().ToString().Replace("-", ""),
                                        Name = trimmedBlockerName,
                                        Cost = 1
                                    };

                                    blockers.Add(existingBlocker);
                                }

                                if (!testcase.BlockerIds.Contains(existingBlocker.Id))
                                {
                                    testcase.BlockerIds.Add(existingBlocker.Id);
                                }
                            }
                        }

                        testcases.Add(testcase);
                    }
                }

                var dataset = new TestcaseBlockerDataset
                {
                    Blockers  = blockers,
                    Testcases = testcases
                };

                return(dataset);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
                throw;
            }
        }
Пример #14
0
 public Optimizer(TestcaseBlockerDataset dataset)
 {
     _dataset  = dataset;
     _resolver = new BlockerResolver(_dataset);
 }