/// <summary>
        /// Starts a mutation test run
        /// </summary>
        /// <exception cref="StrykerInputException">For managed exceptions</exception>
        /// <param name="options">The user options</param>
        public StrykerRunResult RunMutationTest(StrykerOptions options)
        {
            // start stopwatch
            var stopwatch = new Stopwatch();

            stopwatch.Start();

            // Create output dir with gitignore
            FileSystem.Directory.CreateDirectory(options.OutputPath);
            FileSystem.File.Create(Path.Combine(options.OutputPath, ".gitignore")).Close();
            using (var file = FileSystem.File.CreateText(Path.Combine(options.OutputPath, ".gitignore")))
            {
                file.WriteLine("*");
            }

            // setup logging
            ApplicationLogging.ConfigureLogger(options.LogOptions);
            var logger = ApplicationLogging.LoggerFactory.CreateLogger <StrykerRunner>();

            logger.LogDebug("Stryker started with options: {0}",
                            JsonConvert.SerializeObject(options, new StringEnumConverter()));

            try
            {
                // initialize
                Reporter = ReporterFactory.Create(options);
                InitialisationProcess = InitialisationProcess ?? new InitialisationProcess();
                Input = InitialisationProcess.Initialize(options);

                MutationTestProcess = MutationTestProcess ?? new MutationTestProcess(
                    mutationTestInput: Input,
                    reporter: Reporter,
                    mutationTestExecutor: new MutationTestExecutor(Input.TestRunner));

                // initial test
                Input.TimeoutMs = InitialisationProcess.InitialTest(options);

                // mutate
                MutationTestProcess.Mutate(options);

                // coverage
                var coverage = InitialisationProcess.GetCoverage(options);

                MutationTestProcess.Optimize(coverage);

                // test mutations and return results
                return(MutationTestProcess.Test(options));
            }
            catch (Exception ex) when(!(ex is StrykerInputException))
            {
                logger.LogError(ex, "An error occurred during the mutation test run ");
                throw;
            }
            finally
            {
                // log duration
                stopwatch.Stop();
                logger.LogInformation("Time Elapsed {0}", stopwatch.Elapsed);
            }
        }
Exemple #2
0
        public void InitialisationProcess_ShouldCallNeededResolvers()
        {
            var testRunnerMock                = new Mock <ITestRunner>(MockBehavior.Strict);
            var inputFileResolverMock         = new Mock <IInputFileResolver>(MockBehavior.Strict);
            var initialBuildProcessMock       = new Mock <IInitialBuildProcess>(MockBehavior.Strict);
            var initialTestProcessMock        = new Mock <IInitialTestProcess>(MockBehavior.Strict);
            var assemblyReferenceResolverMock = new Mock <IAssemblyReferenceResolver>(MockBehavior.Strict);

            testRunnerMock.Setup(x => x.RunAll(It.IsAny <int>(), null, null))
            .Returns(new TestRunResult(true));     // testrun is successful
            testRunnerMock.Setup(x => x.DiscoverNumberOfTests()).Returns(999);
            testRunnerMock.Setup(x => x.Dispose());
            var projectContents = new CsharpFolderComposite();

            projectContents.Add(new CsharpFileLeaf
            {
                Name = "SomeFile.cs"
            });
            var folder = new CsharpFolderComposite
            {
                Name = "ProjectRoot"
            };

            folder.AddRange(new Collection <IProjectComponent>
            {
                new CsharpFileLeaf
                {
                    Name = "SomeFile.cs"
                }
            });
            inputFileResolverMock.Setup(x => x.ResolveInput(It.IsAny <IStrykerOptions>()))
            .Returns(new ProjectInfo
            {
                ProjectUnderTestAnalyzerResult = TestHelper.SetupProjectAnalyzerResult(
                    references: new string[0]).Object,
                TestProjectAnalyzerResults = new List <IAnalyzerResult> {
                    TestHelper.SetupProjectAnalyzerResult(
                        projectFilePath: "C://Example/Dir/ProjectFolder").Object
                },
                ProjectContents = folder
            });
            initialTestProcessMock.Setup(x => x.InitialTest(It.IsAny <ITestRunner>())).Returns(999);
            initialBuildProcessMock.Setup(x => x.InitialBuild(It.IsAny <bool>(), It.IsAny <string>(), It.IsAny <string>()));
            assemblyReferenceResolverMock.Setup(x => x.LoadProjectReferences(It.IsAny <string[]>()))
            .Returns(Enumerable.Empty <PortableExecutableReference>());

            var target = new InitialisationProcess(
                inputFileResolverMock.Object,
                initialBuildProcessMock.Object,
                initialTestProcessMock.Object,
                testRunnerMock.Object,
                assemblyReferenceResolverMock.Object);

            var options = new StrykerOptions();

            var result = target.Initialize(options);

            inputFileResolverMock.Verify(x => x.ResolveInput(It.IsAny <IStrykerOptions>()), Times.Once);
        }
        public void InitialisationProcess_ShouldThrowOnFailedInitialTestRun()
        {
            var testRunnerMock                = new Mock <ITestRunner>(MockBehavior.Strict);
            var inputFileResolverMock         = new Mock <IInputFileResolver>(MockBehavior.Strict);
            var initialBuildProcessMock       = new Mock <IInitialBuildProcess>(MockBehavior.Strict);
            var initialTestProcessMock        = new Mock <IInitialTestProcess>(MockBehavior.Strict);
            var assemblyReferenceResolverMock = new Mock <IAssemblyReferenceResolver>(MockBehavior.Strict);

            testRunnerMock.Setup(x => x.RunAll(It.IsAny <int>(), null, null));
            var folder = new FolderComposite
            {
                Name = "ProjectRoot"
            };

            folder.Add(new FileLeaf
            {
                Name = "SomeFile.cs"
            });

            inputFileResolverMock.Setup(x => x.ResolveInput(It.IsAny <StrykerOptions>())).Returns(
                new ProjectInfo
            {
                ProjectUnderTestAnalyzerResult = new ProjectAnalyzerResult(null, null)
                {
                    References = new string[0]
                },
                TestProjectAnalyzerResults = new List <ProjectAnalyzerResult> {
                    new ProjectAnalyzerResult(null, null)
                    {
                        ProjectFilePath = "C://Example/Dir/ProjectFolder"
                    }
                },
                ProjectContents = folder
            });

            initialBuildProcessMock.Setup(x => x.InitialBuild(It.IsAny <bool>(), It.IsAny <string>(), It.IsAny <string>()));
            testRunnerMock.Setup(x => x.DiscoverNumberOfTests()).Returns(999);
            testRunnerMock.Setup(x => x.Dispose());
            initialTestProcessMock.Setup(x => x.InitialTest(It.IsAny <ITestRunner>())).Throws(new StrykerInputException("")); // failing test
            assemblyReferenceResolverMock.Setup(x => x.LoadProjectReferences(It.IsAny <string[]>()))
            .Returns(Enumerable.Empty <PortableExecutableReference>())
            .Verifiable();

            var target = new InitialisationProcess(
                inputFileResolverMock.Object,
                initialBuildProcessMock.Object,
                initialTestProcessMock.Object,
                testRunnerMock.Object,
                assemblyReferenceResolverMock.Object);
            var options = new StrykerOptions();

            target.Initialize(options);
            Assert.Throws <StrykerInputException>(() => target.InitialTest(options, out var nbTests));

            inputFileResolverMock.Verify(x => x.ResolveInput(It.IsAny <StrykerOptions>()), Times.Once);
            assemblyReferenceResolverMock.Verify();
            initialTestProcessMock.Verify(x => x.InitialTest(testRunnerMock.Object), Times.Once);
        }
Exemple #4
0
        public void InitialisationProcess_ShouldCallNeededResolvers()
        {
            var testRunnerMock                = new Mock <ITestRunner>(MockBehavior.Strict);
            var inputFileResolverMock         = new Mock <IInputFileResolver>(MockBehavior.Strict);
            var reporterMock                  = new Mock <IReporter>(MockBehavior.Strict);
            var initialBuildProcessMock       = new Mock <IInitialBuildProcess>(MockBehavior.Strict);
            var initialTestProcessMock        = new Mock <IInitialTestProcess>(MockBehavior.Strict);
            var assemblyReferenceResolverMock = new Mock <IAssemblyReferenceResolver>(MockBehavior.Strict);

            testRunnerMock.Setup(x => x.RunAll(It.IsAny <int>(), It.IsAny <int>()))
            .Returns(new TestRunResult {
                Success = true
            });                                                 // testrun is successful
            reporterMock.Setup(x => x.OnInitialisationStarted()).Verifiable();
            reporterMock.Setup(x => x.OnInitialTestRunStarted()).Verifiable();
            reporterMock.Setup(x => x.OnInitialBuildStarted()).Verifiable();
            reporterMock.Setup(x => x.OnInitialisationDone()).Verifiable();
            inputFileResolverMock.Setup(x => x.ResolveInput(It.IsAny <string>(), It.IsAny <string>()))
            .Returns(new Core.Initialisation.ProjectInfo
            {
                TestProjectPath = "c:/test",
                ProjectContents = new FolderComposite
                {
                    Name     = "ProjectRoot",
                    Children = new Collection <ProjectComponent>
                    {
                        new FileLeaf
                        {
                            Name = "SomeFile.cs"
                        }
                    }
                },
                ProjectUnderTestAssemblyName = "ExampleProject.dll",
                ProjectUnderTestPath         = @"c:\ExampleProject\",
                TargetFramework = "netcoreapp2.0"
            });
            initialTestProcessMock.Setup(x => x.InitialTest(It.IsAny <ITestRunner>())).Returns(999);
            initialBuildProcessMock.Setup(x => x.InitialBuild(It.IsAny <string>(), It.IsAny <string>()));
            assemblyReferenceResolverMock.Setup(x => x.ResolveReferences(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>()))
            .Returns(Enumerable.Empty <PortableExecutableReference>());

            var target = new InitialisationProcess(reporterMock.Object,
                                                   inputFileResolverMock.Object,
                                                   initialBuildProcessMock.Object,
                                                   initialTestProcessMock.Object,
                                                   testRunnerMock.Object,
                                                   assemblyReferenceResolverMock.Object);

            var options = new StrykerOptions("c:/test", "Console", "", 2000, null, false, 1, 80, 60, 0);


            var result = target.Initialize(options);

            inputFileResolverMock.Verify(x => x.ResolveInput(It.IsAny <string>(), It.IsAny <string>()), Times.Once);
            reporterMock.VerifyAll();
        }
Exemple #5
0
        public void InitialisationProcess_ShouldCallNeededResolvers()
        {
            var testRunnerMock                = new Mock <ITestRunner>(MockBehavior.Strict);
            var inputFileResolverMock         = new Mock <IInputFileResolver>(MockBehavior.Strict);
            var initialBuildProcessMock       = new Mock <IInitialBuildProcess>(MockBehavior.Strict);
            var initialTestProcessMock        = new Mock <IInitialTestProcess>(MockBehavior.Strict);
            var assemblyReferenceResolverMock = new Mock <IAssemblyReferenceResolver>(MockBehavior.Strict);

            testRunnerMock.Setup(x => x.RunAll(It.IsAny <ITimeoutValueCalculator>(), null, null))
            .Returns(new TestRunResult(true));     // testrun is successful
            testRunnerMock.Setup(x => x.DiscoverTests()).Returns(new TestSet());
            testRunnerMock.Setup(x => x.Dispose());
            var projectContents = new CsharpFolderComposite();

            projectContents.Add(new CsharpFileLeaf());
            var folder = new CsharpFolderComposite();

            folder.AddRange(new Collection <IProjectComponent>
            {
                new CsharpFileLeaf()
            });
            inputFileResolverMock.Setup(x => x.ResolveInput(It.IsAny <StrykerOptions>()))
            .Returns(new ProjectInfo(new MockFileSystem())
            {
                ProjectUnderTestAnalyzerResult = TestHelper.SetupProjectAnalyzerResult(
                    references: new string[0]).Object,
                TestProjectAnalyzerResults = new List <IAnalyzerResult> {
                    TestHelper.SetupProjectAnalyzerResult(
                        projectFilePath: "C://Example/Dir/ProjectFolder",
                        targetFramework: "netcoreapp2.1").Object
                },
                ProjectContents = folder
            });
            initialTestProcessMock.Setup(x => x.InitialTest(It.IsAny <StrykerOptions>(), It.IsAny <ITestRunner>())).Returns(new InitialTestRun(new TestRunResult(true), new TimeoutValueCalculator(1)));
            initialBuildProcessMock.Setup(x => x.InitialBuild(It.IsAny <bool>(), It.IsAny <string>(), It.IsAny <string>(), null));
            assemblyReferenceResolverMock.Setup(x => x.LoadProjectReferences(It.IsAny <string[]>()))
            .Returns(Enumerable.Empty <PortableExecutableReference>());

            var target = new InitialisationProcess(
                inputFileResolverMock.Object,
                initialBuildProcessMock.Object,
                initialTestProcessMock.Object,
                testRunnerMock.Object,
                assemblyReferenceResolverMock.Object);

            var options = new StrykerOptions
            {
                ProjectName    = "TheProjectName",
                ProjectVersion = "TheProjectVersion"
            };

            var result = target.Initialize(options);

            inputFileResolverMock.Verify(x => x.ResolveInput(It.IsAny <StrykerOptions>()), Times.Once);
        }
Exemple #6
0
        public void InitialisationProcess_ShouldCallNeededResolvers()
        {
            var testRunnerMock                = new Mock <ITestRunner>(MockBehavior.Strict);
            var inputFileResolverMock         = new Mock <IInputFileResolver>(MockBehavior.Strict);
            var initialBuildProcessMock       = new Mock <IInitialBuildProcess>(MockBehavior.Strict);
            var initialTestProcessMock        = new Mock <IInitialTestProcess>(MockBehavior.Strict);
            var assemblyReferenceResolverMock = new Mock <IAssemblyReferenceResolver>(MockBehavior.Strict);

            testRunnerMock.Setup(x => x.RunAll(It.IsAny <int>(), It.IsAny <int>()))
            .Returns(new TestRunResult {
                Success = true
            });                                                 // testrun is successful
            inputFileResolverMock.Setup(x => x.ResolveInput(It.IsAny <StrykerOptions>()))
            .Returns(new ProjectInfo
            {
                ProjectUnderTestAnalyzerResult = new ProjectAnalyzerResult(null, null)
                {
                    References = new string[0]
                },
                TestProjectAnalyzerResult = new ProjectAnalyzerResult(null, null)
                {
                    ProjectFilePath = "C://Example/Dir/ProjectFolder"
                },
                ProjectContents = new FolderComposite
                {
                    Name     = "ProjectRoot",
                    Children = new Collection <ProjectComponent>
                    {
                        new FileLeaf
                        {
                            Name = "SomeFile.cs"
                        }
                    }
                }
            });
            initialTestProcessMock.Setup(x => x.InitialTest(It.IsAny <ITestRunner>())).Returns(999);
            initialBuildProcessMock.Setup(x => x.InitialBuild(It.IsAny <bool>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>()));
            assemblyReferenceResolverMock.Setup(x => x.LoadProjectReferences(It.IsAny <string[]>()))
            .Returns(Enumerable.Empty <PortableExecutableReference>());

            var target = new InitialisationProcess(
                inputFileResolverMock.Object,
                initialBuildProcessMock.Object,
                initialTestProcessMock.Object,
                testRunnerMock.Object,
                assemblyReferenceResolverMock.Object);

            var options = new StrykerOptions();

            var result = target.Initialize(options);

            inputFileResolverMock.Verify(x => x.ResolveInput(It.IsAny <StrykerOptions>()), Times.Once);
        }
        public void InitialisationProcess_ShouldThrowOnFailedInitialTestRun()
        {
            var testRunnerMock                = new Mock <ITestRunner>(MockBehavior.Strict);
            var inputFileResolverMock         = new Mock <IInputFileResolver>(MockBehavior.Strict);
            var reporterMock                  = new Mock <IReporter>(MockBehavior.Strict);
            var initialBuildProcessMock       = new Mock <IInitialBuildProcess>(MockBehavior.Strict);
            var initialTestProcessMock        = new Mock <IInitialTestProcess>(MockBehavior.Strict);
            var assemblyReferenceResolverMock = new Mock <IAssemblyReferenceResolver>(MockBehavior.Strict);

            testRunnerMock.Setup(x => x.RunAll(It.IsAny <int>()));
            reporterMock.Setup(x => x.OnInitialisationStarted()).Verifiable();
            reporterMock.Setup(x => x.OnInitialTestRunStarted()).Verifiable();
            reporterMock.Setup(x => x.OnInitialBuildStarted()).Verifiable();
            inputFileResolverMock.Setup(x => x.ResolveInput(It.IsAny <string>(), It.IsAny <string>())).Returns(
                new Core.Initialisation.ProjectInfo()
            {
                TestProjectPath = "c:/test",
                ProjectContents = new FolderComposite()
                {
                    Name     = "ProjectRoot",
                    Children = new Collection <ProjectComponent>()
                    {
                        new FileLeaf()
                        {
                            Name = "SomeFile.cs"
                        }
                    }
                },
                ProjectUnderTestAssemblyName = "ExampleProject.dll",
                ProjectUnderTestPath         = @"c:\ExampleProject\",
                TargetFramework = "netcoreapp2.0"
            });
            initialBuildProcessMock.Setup(x => x.InitialBuild(It.IsAny <string>(), It.IsAny <string>()));
            initialTestProcessMock.Setup(x => x.InitialTest(It.IsAny <ITestRunner>())).Throws(new InitialTestRunFailedException("")); // failing test
            assemblyReferenceResolverMock.Setup(x => x.ResolveReferences(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>()))
            .Returns(Enumerable.Empty <PortableExecutableReference>()).Verifiable();

            var target = new InitialisationProcess(reporterMock.Object,
                                                   inputFileResolverMock.Object,
                                                   initialBuildProcessMock.Object,
                                                   initialTestProcessMock.Object,
                                                   testRunnerMock.Object,
                                                   assemblyReferenceResolverMock.Object);
            var options = new StrykerOptions("c:/test", "Console", "", 2000, null, false);

            var exception = Assert.Throws <InitialTestRunFailedException>(() => target.Initialize(options));

            inputFileResolverMock.Verify(x => x.ResolveInput(It.IsAny <string>(), It.IsAny <string>()), Times.Once);
            reporterMock.Verify();
            assemblyReferenceResolverMock.Verify();
            initialTestProcessMock.Verify(x => x.InitialTest(testRunnerMock.Object), Times.Once);
        }
Exemple #8
0
        public void InitialisationProcess_ShouldThrowOnFailedInitialTestRun()
        {
            var testRunnerMock                = new Mock <ITestRunner>(MockBehavior.Strict);
            var inputFileResolverMock         = new Mock <IInputFileResolver>(MockBehavior.Strict);
            var initialBuildProcessMock       = new Mock <IInitialBuildProcess>(MockBehavior.Strict);
            var initialTestProcessMock        = new Mock <IInitialTestProcess>(MockBehavior.Strict);
            var assemblyReferenceResolverMock = new Mock <IAssemblyReferenceResolver>(MockBehavior.Strict);

            testRunnerMock.Setup(x => x.RunAll(It.IsAny <ITimeoutValueCalculator>(), null, null));
            var folder = new CsharpFolderComposite();

            folder.Add(new CsharpFileLeaf());

            inputFileResolverMock.Setup(x => x.ResolveInput(It.IsAny <StrykerOptions>())).Returns(
                new ProjectInfo(new MockFileSystem())
            {
                ProjectUnderTestAnalyzerResult = TestHelper.SetupProjectAnalyzerResult(
                    references: new string[0]).Object,
                TestProjectAnalyzerResults = new List <IAnalyzerResult> {
                    TestHelper.SetupProjectAnalyzerResult(
                        projectFilePath: "C://Example/Dir/ProjectFolder").Object
                },
                ProjectContents = folder
            });

            initialBuildProcessMock.Setup(x => x.InitialBuild(It.IsAny <bool>(), It.IsAny <string>(), It.IsAny <string>(), null));
            testRunnerMock.Setup(x => x.DiscoverTests()).Returns(new TestSet());
            testRunnerMock.Setup(x => x.Dispose());
            initialTestProcessMock.Setup(x => x.InitialTest(It.IsAny <StrykerOptions>(), It.IsAny <ITestRunner>())).Throws(new InputException("")); // failing test
            assemblyReferenceResolverMock.Setup(x => x.LoadProjectReferences(It.IsAny <string[]>()))
            .Returns(Enumerable.Empty <PortableExecutableReference>())
            .Verifiable();

            var target = new InitialisationProcess(
                inputFileResolverMock.Object,
                initialBuildProcessMock.Object,
                initialTestProcessMock.Object,
                testRunnerMock.Object,
                assemblyReferenceResolverMock.Object);
            var options = new StrykerOptions
            {
                ProjectName    = "TheProjectName",
                ProjectVersion = "TheProjectVersion"
            };

            target.Initialize(options);
            Assert.Throws <InputException>(() => target.InitialTest(options));

            inputFileResolverMock.Verify(x => x.ResolveInput(It.IsAny <StrykerOptions>()), Times.Once);
            assemblyReferenceResolverMock.Verify();
            initialTestProcessMock.Verify(x => x.InitialTest(It.IsAny <StrykerOptions>(), testRunnerMock.Object), Times.Once);
        }