Ejemplo n.º 1
0
        public void Forecast_8_issues()
        {
            const int N_RESOURCES = 3;
            var       issues      = IssueRepository.Import().ToArray();

            IEnumerable <Issue> Filter_issues(params string[] tags) => issues.Where(i => tags.All(t => i.Tags.Contains(t)));

            int[] Get_cycle_times_in_days(IEnumerable <Issue> issues) => issues.Select(x => x.CycleTime.Days).ToArray();

            var frontend_feature_cts = Get_cycle_times_in_days(Filter_issues("frontend", "feature"));
            var backend_bug_cts      = Get_cycle_times_in_days(Filter_issues("backend", "bug"));
            var backend_feature_cts  = Get_cycle_times_in_days(Filter_issues("backend", "feature"));

            _testOutputHelper.WriteLine($"Events found: {frontend_feature_cts.Length}, {backend_bug_cts.Length}, {backend_feature_cts.Length}");

            var sut = new SoftwareDeliverySimulation();
            var simulationresult = sut.SimulateIssueDeliveryByResources(N_RESOURCES,
                                                                        frontend_feature_cts,
                                                                        frontend_feature_cts,
                                                                        frontend_feature_cts,
                                                                        backend_bug_cts,
                                                                        backend_feature_cts,
                                                                        backend_feature_cts,
                                                                        backend_feature_cts,
                                                                        backend_feature_cts
                                                                        );
            var distribution = Statistics.Distribution(simulationresult);

            var deDE = new CultureInfo("de-DE");

            foreach (var x in distribution.OrderBy(o => o.value))
            {
                _testOutputHelper.WriteLine($"{x.value}\t{x.frequency}\t{x.probability.ToString("0.000", deDE)}\t{x.percentile.ToString("0.0", deDE)}");
            }
        }
Ejemplo n.º 2
0
        public void Story_delivery()
        {
            /*
             * Stories:
             *     1: 1 issue
             *     2: 2
             *     3: 3
             *     4: 4
             *  dark: 1
             *
             *  TP:
             *     30.9.    0
             *     1.10.    1
             *     2.10.    2
             *     3.10.    3
             *     (4.10.
             *     5.10.)
             *     6.10.
             *     7.10.    4
             *     => [0,1,2,3,4]
             */
            var historicalData = new[] {
                new Issue(new DateTime(2019, 10, 1), new DateTime(2019, 10, 3), null, "1", false),
                new Issue(new DateTime(2019, 9, 30), new DateTime(2019, 10, 7), null, "2", false),
                new Issue(new DateTime(2019, 10, 2), new DateTime(2019, 10, 3), null, "3", false),
                new Issue(new DateTime(2019, 9, 30), new DateTime(2019, 10, 1), null, "", false),
                new Issue(new DateTime(2019, 10, 2), new DateTime(2019, 10, 4), null, "2", false),
                new Issue(new DateTime(2019, 10, 1), new DateTime(2019, 10, 2), null, "3", false),
                new Issue(new DateTime(2019, 10, 3), new DateTime(2019, 10, 7), null, "4", false),
                new Issue(new DateTime(2019, 10, 2), new DateTime(2019, 10, 3), null, "3", false),
                new Issue(new DateTime(2019, 10, 2), new DateTime(2019, 10, 7), null, "4", false),
                new Issue(new DateTime(2019, 10, 3), new DateTime(2019, 10, 7), null, "4", false),
                new Issue(new DateTime(2019, 9, 30), new DateTime(2019, 10, 2), null, "4", false),
            };
            var randomNumbers = new Queue <int>(new[]
            {
                // Simulate issues derived from stories
                0, 1,
                2, 3,
                // => [1+2=3, 3+4=7]

                // Simulate issue delivery
                // 3 issues to deliver
                0, 1, 2, // 3 days - 1
                2, 3,    // 2 days - 1

                // 7 issues to deliver
                1, 2, 3, 1,         // 4 days - 1
                1, 1, 1, 1, 1, 1, 1 // 9 days due to weekend - 1
            });
            var sut = new SoftwareDeliverySimulation(2, maxNumber => randomNumbers.Dequeue());

            var result = sut.SimulateStoryDeliveryBasedOnThroughput(new DateTime(2019, 10, 1), 2, historicalData);

            Assert.Empty(randomNumbers);
            Assert.Equal(new[] { 2, 1, 3, 8 }, result);
        }
Ejemplo n.º 3
0
        public void Single_issue_single_resource()
        {
            var historicalCTs = new[] { 1, 2, 3 };
            var randomNumbers = new Queue <int>(new[] { 2, 1, 0 });
            var sut           = new SoftwareDeliverySimulation(3, maxNumber => randomNumbers.Dequeue());

            var result = sut.SimulateIssueDeliveryByResources(historicalCTs);

            Assert.Empty(randomNumbers);
            Assert.Equal(new[] { 3, 2, 1 }, result);
        }
Ejemplo n.º 4
0
        public void Single_throughput_history()
        {
            var historicalTPs = new[] { 1, 2, 3 };
            var randomNumbers = new Queue <int>(new[] { 2, 2, 2, 2, 0, 1, 2, 0, 1, 2 });
            var sut           = new SoftwareDeliverySimulation(2, maxNumber => randomNumbers.Dequeue());

            var result = sut.SimulateIssueDeliveryBasedOnThroughput(new DateTime(2019, 10, 3), 10, historicalTPs);

            Assert.Empty(randomNumbers);
            Assert.Equal(new[] { 5, 7 }, result);
        }
Ejemplo n.º 5
0
        public void Story_refinement()
        {
            var historicalStoryRefinementsA = new[] { 1, 2, 3 };
            var historicalStoryRefinementsB = new[] { 10, 20, 30 };
            var randomNumbers = new Queue <int>(new[] { 2, 1, 0, 2, 1, 0 });

            var sut = new SoftwareDeliverySimulation(3, maxNumber => randomNumbers.Dequeue());

            var result = sut.SimulateIssuesDerivedFromStories(historicalStoryRefinementsA, historicalStoryRefinementsB);

            Assert.Equal(new[] { 23, 31, 12 }, result);
        }
Ejemplo n.º 6
0
        public void Two_issues_two_resources()
        {
            var historicalCTsA = new[] { 1, 2, 3 };
            var historicalCTsB = new[] { 10, 20, 30 };
            var randomNumbers  = new Queue <int>(new[] { 2, 1, 0, 2, 1, 0 });
            var sut            = new SoftwareDeliverySimulation(3, maxNumber => randomNumbers.Dequeue());

            var result = sut.SimulateIssueDeliveryByResources(2, historicalCTsA, historicalCTsB);

            Assert.Empty(randomNumbers);
            Assert.Equal(new[] { 20, 30, 10 }, result);
        }
Ejemplo n.º 7
0
        public void Forecast_10_stories_for_all_issue_forecasts()
        {
            DateTime  START_DATE        = new DateTime(2019, 11, 18);
            const int NUMBER_OF_STORIES = 10;

            var issues = IssueRepository.Import().ToArray();

            var sut = new SoftwareDeliverySimulation();
            var simulationresult = sut.SimulateStoryDeliveryBasedOnThroughput(START_DATE, NUMBER_OF_STORIES, issues);
            var distribution     = Statistics.Distribution(simulationresult);

            var deDE = new CultureInfo("de-DE");

            foreach (var x in distribution.OrderBy(o => o.value))
            {
                _testOutputHelper.WriteLine($"{x.value}\t{x.frequency}\t{x.probability.ToString("0.000", deDE)}\t{x.percentile.ToString("0.0", deDE)}");
            }
        }
        public void Forecast_8_issues()
        {
            DateTime  START_DATE       = new DateTime(2019, 11, 18);
            const int NUMBER_OF_ISSUES = 8;

            var issues = IssueRepository.Import().ToArray();
            var tp     = issues.BusinessDayThroughputs();

            _testOutputHelper.WriteLine($"TP sum: {tp.Sum()}");

            var sut = new SoftwareDeliverySimulation();
            var simulationresult = sut.SimulateIssueDeliveryBasedOnThroughput(START_DATE, NUMBER_OF_ISSUES, tp);
            var distribution     = Statistics.Distribution(simulationresult);

            var deDE = new CultureInfo("de-DE");

            foreach (var x in distribution.OrderBy(o => o.value))
            {
                _testOutputHelper.WriteLine($"{x.value}\t{x.frequency}\t{x.probability.ToString("0.000", deDE)}\t{x.percentile.ToString("0.0", deDE)}");
            }
        }
Ejemplo n.º 9
0
        public void Forecast_10_stories_with_single_issue_forecast()
        {
            DateTime  START_DATE        = new DateTime(2019, 11, 18);
            const int NUMBER_OF_STORIES = 10;

            var issues         = IssueRepository.Import().ToArray();
            var issuesPerStory = issues.IssuesPerStory();

            var sut = new SoftwareDeliverySimulation();
            var issueSimulationresult = sut.SimulateIssuesDerivedFromStories(
                Enumerable.Range(1, NUMBER_OF_STORIES).Select(_ => issuesPerStory).ToArray()
                );
            var issueDistribution = Statistics.Distribution(issueSimulationresult);

            _testOutputHelper.WriteLine("issues from stories forecast");
            var deDE = new CultureInfo("de-DE");

            foreach (var x in issueDistribution.OrderBy(o => o.value))
            {
                _testOutputHelper.WriteLine($"{x.value}\t{x.frequency}\t{x.probability.ToString("0.000", deDE)}\t{x.percentile.ToString("0.0", deDE)}");
            }



            _testOutputHelper.WriteLine("delivery forecast");

            var number_of_issues = issueDistribution.First(x => x.percentile > 80.0).value;

            _testOutputHelper.WriteLine($"Number of issues selected: {number_of_issues}");

            var tp = issues.BusinessDayThroughputs();
            var deliverySimulationresult = sut.SimulateIssueDeliveryBasedOnThroughput(START_DATE, number_of_issues, tp);
            var distribution             = Statistics.Distribution(deliverySimulationresult);

            foreach (var x in distribution.OrderBy(o => o.value))
            {
                _testOutputHelper.WriteLine($"{x.value}\t{x.frequency}\t{x.probability.ToString("0.000", deDE)}\t{x.percentile.ToString("0.0", deDE)}");
            }
        }
Ejemplo n.º 10
0
        public void Multiple_throughput_histories()
        {
            var historicalTPsA = new[] { 1, 2, 3 };
            var historicalTPsB = new[] { 0, 1, 2 };
            var randomNumbers  = new Queue <int>(new[] {
                1, 2, // 2+2=4
                2, 0, // 3+0=3/7
                0, 2, // 1+2=3/10

                0, 1, // 1+1=2
                1, 0, // 2+0=2/4
                2, 0, // 3+0=3/7
                0, 0, // 1+0=1/8
                0, 0, // 1+0=1/9
                1, 2  // 2+2=4/13
            });       //2,2,3,1,1,
            var sut = new SoftwareDeliverySimulation(2, maxNumber => randomNumbers.Dequeue());

            var result = sut.SimulateIssueDeliveryBasedOnThroughput(new DateTime(2019, 10, 3), 10, historicalTPsA, historicalTPsB);

            Assert.Empty(randomNumbers);
            Assert.Equal(new[] { 4, 7 }, result);
        }