PageSourceSearch

https://stryker-mutator.io/assets/js/0fef9a81.fa905228.js

js stryker-mutator.io collected 2026-10-02 03:24:28 UTC 47,320 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkstryker_mutator_github_io=self.webpackChunkstryker_mutator_github_io||[]).push([["3612"],{87071:function(e,r,n){n.r(r),n.d(r,{metadata:function(){return s},default:function(){return h},frontMatter:function(){return o},contentTitle:function(){return d},toc:function(){return c},assets:function(){return l}});var s=JSON.parse('{"id":"stryker4s/configuration","title":"Configuration","description":"Stryker4s can be configured in multiple ways. You can use a configuration file, set it in your build tool settings, or pass it as command-line arguments. This page describes all configuration options and how to set them.","source":"@site/docs/stryker4s/configuration.md","sourceDirName":"stryker4s","slug":"/stryker4s/configuration","permalink":"/docs/stryker4s/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/stryker-mutator/stryker4s/edit/master/docs/configuration.md","tags":[],"version":"current","sidebarPosition":2,"frontMatter":{"title":"Configuration","custom_edit_url":"https://github.com/stryker-mutator/stryker4s/edit/master/docs/configuration.md","sidebar_position":2},"sidebar":"docs","previous":{"title":"Getting started","permalink":"/docs/stryker4s/getting-started"},"next":{"title":"Contributing","permalink":"/docs/stryker4s/contributing"}}'),t=n(94686),i=n(23191);let o={title:"Configuration",custom_edit_url:"https://github.com/stryker-mutator/stryker4s/edit/master/docs/configuration.md",sidebar_position:2},d,l={},c=[{value:"CLI args",id:"cli-args",level:3},{value:"Build tool settings (sbt)",id:"build-tool-settings-sbt",level:3},{value:"Build tool settings (Mill)",id:"build-tool-settings-mill",level:3},{value:"Config file",id:"config-file",level:3},{value:"General config",id:"general-config",level:2},{value:"<code>mutate</code> (<code>Seq[String]</code>)",id:"mutate-seqstring",level:3},{value:"<code>test-filter</code> (<code>Seq[String]</code>)",id:"test-filter-seqstring",level:3},{value:"<code>files</code> (<code>Seq[String]</code>)",id:"files-seqstring",level:3},{value:"<code>base-dir</code> (<code>String</code>)",id:"base-dir-string",level:3},{value:"<code>reporters</code> (<code>Seq[String]</code>)",id:"reporters-seqstring",level:3},{value:"<code>open-report</code> (<code>Boolean</code>)",id:"open-report-boolean",level:3},{value:"<code>excluded-mutations</code> (<code>Seq[String]</code>)",id:"excluded-mutations-seqstring",level:3},{value:"<code>thresholds</code> (<code>object</code>)",id:"thresholds-object",level:3},{value:"<code>dashboard.*</code> (<code>object</code>)",id:"dashboard-object",level:3},{value:"<code>scala-dialect</code> (<code>String</code>)",id:"scala-dialect-string",level:3},{value:"<code>static-tmp-dir</code> (<code>Boolean</code>)",id:"static-tmp-dir-boolean",level:3},{value:"<code>clean-tmp-dir</code> (<code>Boolean</code>)",id:"clean-tmp-dir-boolean",level:3},{value:"Test runner config",id:"test-runner-config",level:2},{value:"<code>timeout-factor</code> (<code>Double</code>)",id:"timeout-factor-double",level:3},{value:"<code>timeout</code> (<code>FiniteDuration</code>)",id:"timeout-finiteduration",level:3},{value:"<code>max-test-runner-reuse</code> (<code>Int</code>)",id:"max-test-runner-reuse-int",level:3},{value:"<code>legacy-test-runner</code> (<code>Boolean</code>)",id:"legacy-test-runner-boolean",level:3},{value:"<code>concurrency</code> (<code>Int</code>)",id:"concurrency-int",level:3},{value:"<code>debug</code> (<code>object</code>)",id:"debug-object",level:3},{value:"<code>debug-test-runner</code> (<code>Boolean</code>)",id:"debug-test-runner-boolean",level:4},{value:"<code>log-test-runner-stdout</code> (<code>Boolean</code>)",id:"log-test-runner-stdout-boolean",level:4},{value:"Process runner config",id:"process-runner-config",level:2},{value:"<code>test-runner</code> (<code>object</code>)",id:"test-runner-object",level:3},{value:"Other configuration options",id:"other-configuration-options",level:2},{value:"<code>log-level</code> (<code>String</code>)",id:"log-level-string",level:3},{value:"Excluding specific mutations",id:"excluding-specific-mutations",level:2}];function a(e){let r={a:"a",admonition:"admonition",blockquote:"blockquote",br:"br",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(r.p,{children:"Stryker4s can be configured in multiple ways. You can use a configuration file, set it in your build tool settings, or pass it as command-line arguments. This page describes all configuration options and how to set them."}),"\n",(0,t.jsx)(r.p,{children:"Configuration methods can be combined seamlessly. The priority is as follows:"}),"\n",(0,t.jsxs)(r.ol,{children:["\n",(0,t.jsx)(r.li,{children:"Command-line arguments"}),"\n",(0,t.jsx)(r.li,{children:"Configuration file"}),"\n",(0,t.jsx)(r.li,{children:"Build tool settings"}),"\n"]}),"\n",(0,t.jsxs)(r.table,{children:[(0,t.jsx)(r.thead,{children:(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.th,{children:"Source"}),(0,t.jsx)(r.th,{children:(0,t.jsx)(r.a,{href:"#cli-args",children:"CLI args"})}),(0,t.jsx)(r.th,{children:(0,t.jsx)(r.a,{href:"#build-tool-settings-sbt",children:"Build tool settings"})}),(0,t.jsx)(r.th,{children:(0,t.jsx)(r.a,{href:"#config-file",children:"Config file"})})]})}),(0,t.jsxs)(r.tbody,{children:[(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Sbt plugin"}),(0,t.jsx)(r.td,{children:"\u2705"}),(0,t.jsx)(r.td,{children:"\u2705"}),(0,t.jsx)(r.td,{children:"\u2705"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Mill plugin"}),(0,t.jsx)(r.td,{children:"\u2705"}),(0,t.jsx)(r.td,{children:"\u2705"}),(0,t.jsx)(r.td,{children:"\u2705"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Maven plugin"}),(0,t.jsx)(r.td,{children:"\u274C"}),(0,t.jsx)(r.td,{children:"\u274C"}),(0,t.jsx)(r.td,{children:"\u2705"})]}),(0,t.jsxs)(r.tr,{children:[(0,t.jsx)(r.td,{children:"Command runner"}),(0,t.jsx)(r.td,{children:"\u2705"}),(0,t.jsx)(r.td,{children:"N/A"}),(0,t.jsx)(r.td,{children:"\u2705"})]})]})]}),"\n",(0,t.jsxs)("small",{children:["Build tool and CLI configuration is available since Stryker4s v0.17.0. If you are looking to configure previous versions, see ",(0,t.jsx)(r.a,{href:"https://github.com/stryker-mutator/stryker4s/blob/v0.16.1/docs/configuration.md",children:"here"}),"."]}),"\n",(0,t.jsx)(r.h3,{id:"cli-args",children:"CLI args"}),"\n",(0,t.jsxs)(r.p,{children:["All configuration options can be set from the command line. The command line arguments are the same as the config keys, but in kebab-case. For example, ",(0,t.jsx)(r.code,{children:"base-dir"}
1)," becomes ",(0,t.jsx)(r.code,{children:"--base-dir"}),". The command line arguments are case-insensitive."]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-sh",children:'sbt stryker --base-dir submodule1 --mutate "**/main/scala/**/*.scala"\n'})}),"\n",(0,t.jsx)(r.admonition,{type:"tip",children:(0,t.jsxs)(r.p,{children:["Some options also have short versions. You can use the ",(0,t.jsx)(r.code,{children:"--help"})," flag to see all available options, their short and long forms, and their descriptions."]})}),"\n",(0,t.jsx)(r.h3,{id:"build-tool-settings-sbt",children:"Build tool settings (sbt)"}),"\n",(0,t.jsxs)(r.p,{children:["Some default values will be read by the sbt project configuration, but you can override sbt setting keys. Each key is named ",(0,t.jsx)(r.code,{children:"stryker"})," followed by the camelCase name of the config key:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-scala",children:'strykerBaseDir := "submodule1"\nstrykerMutate := Seq("src/main/scala/**/*.scala")\ncore / strykerDashboardModule := "core"\n'})}),"\n",(0,t.jsxs)(r.p,{children:["You can also see the value of a key by running e.g. ",(0,t.jsx)(r.code,{children:"sbt show strykerBaseDir"}),"."]}),"\n",(0,t.jsx)(r.admonition,{type:"tip",children:(0,t.jsxs)(r.p,{children:["In ",(0,t.jsx)(r.code,{children:"*.sbt"})," files the keys are imported automatically, in ",(0,t.jsx)(r.code,{children:"project/*.scala"})," files you can import them from ",(0,t.jsx)(r.code,{children:"import stryker4s.sbt.Stryker4sPlugin.autoImport._"}),". Your editor will autocomplete the keys for you."]})}),"\n",(0,t.jsx)(r.h3,{id:"build-tool-settings-mill",children:"Build tool settings (Mill)"}),"\n",(0,t.jsxs)(r.p,{children:["The Mill plugin reads some default values from the module, but you can override them by defining ",(0,t.jsx)(r.code,{children:"stryker"}),"-prefixed members on the module the ",(0,t.jsx)(r.code,{children:"Stryker4sModule"})," trait is mixed into. Each member is named ",(0,t.jsx)(r.code,{children:"stryker"})," followed by the camelCase name of the config key and returns a ",(0,t.jsx)(r.code,{children:"T[Option[_]]"}),":"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-scala",children:'import stryker4s.mill.Stryker4sModule\n\nobject core extends ScalaModule, Stryker4sModule {\n  override def strykerMutate = Some(Seq("src/main/scala/**/*.scala"))\n  override def strykerConcurrency = Some(4)\n  override def strykerDashboardModule = Some("core")\n}\n'})}),"\n",(0,t.jsx)(r.h3,{id:"config-file",children:"Config file"}),"\n",(0,t.jsxs)(r.p,{children:["The ",(0,t.jsx)(r.code,{children:"stryker4s.conf"}),' file is read from the root of the project. This file is read in the HOCON-format. All configuration should be in the "stryker4s" namespace and in kebab-case.']}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-conf",children:'stryker4s {\n  base-dir = "submodule1"\n  mutate = [ "**/main/scala/**/*.scala" ]\n  # Your configuration here\n}\n'})}),"\n",(0,t.jsx)(r.h2,{id:"general-config",children:"General config"}),"\n",(0,t.jsxs)(r.h3,{id:"mutate-seqstring",children:[(0,t.jsx)(r.code,{children:"mutate"})," (",(0,t.jsx)(r.code,{children:"Seq[String]"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:'mutate: [ "**/main/scala/**/*.scala" ]'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:'strykerMutate := Seq("**/main/scala/**/*.scala")'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:'override def strykerMutate = Some(Seq("**/main/scala/**/*.scala"))'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:'--mutate "**/main/scala/**/*.scala"'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:'[ "**/main/scala/**/*.scala" ]'})]}),"\n",(0,t.jsxs)(r.p,{children:["With ",(0,t.jsx)(r.code,{children:"mutate"})," you configure the subset of files to use for mutation testing.\nGenerally speaking, these should be your own source files.",(0,t.jsx)(r.br,{}),"\n","The default for this will find files in the common Scala project format."]}),"\n",(0,t.jsxs)(r.p,{children:["You can ",(0,t.jsx)(r.em,{children:"ignore"})," files by adding an exclamation mark (",(0,t.jsx)(r.code,{children:"!"}),") at the start of an expression."]}),"\n",(0,t.jsxs)(r.h3,{id:"test-filter-seqstring",children:[(0,t.jsx)(r.code,{children:"test-filter"})," (",(0,t.jsx)(r.code,{children:"Seq[String]"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:'test-filter: [ "com.mypackage.MyTest" ]'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:'strykerTestFilter := Seq("com.mypackage.MyTest")'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:'override def strykerTestFilter = Some(Seq("com.mypackage.MyTest"))'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--test-filter com.mypackage.MyTest"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:"[]"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Since:"})," ",(0,t.jsx)(r.code,{children:"v0.8.0"})]}),"\n",(0,t.jsxs)(r.p,{children:["With ",(0,t.jsx)(r.code,{children:"test-filter"})," you configure the subset of tests to use for mutation testing. By default, all tests are included.\nYou can use a wildcard pattern: ",(0,t.jsx)(r.code,{children:"com.mypackage.*"}),"."]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.a,{href:"https://www.scala-sbt.org/1.x/docs/Testing.html#Filter+classes",children:(0,t.jsx)(r.code,{children:"Tests.Filter"})})," is used. You can ",(0,t.jsx)(r.em,{children:"ignore"})," tests by adding an exclamation mark (",(0,t.jsx)(r.code,{children:"!"}),") at the start of an expression."]}),"\n",(0,t.jsx)(r.p,{children:"Note: Not supported in the command-runner plugin."}
1),"\n",(0,t.jsxs)(r.h3,{id:"files-seqstring",children:[(0,t.jsx)(r.code,{children:"files"})," (",(0,t.jsx)(r.code,{children:"Seq[String]"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:'files: [ "**/main/scala/**/*.scala" ]'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:'strykerFiles := Seq("**/main/scala/**/*.scala")'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:'override def strykerFiles = Some(Seq("**/main/scala/**/*.scala"))'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:'--files "**/main/scala/**/*.scala"'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:'[ "**", "!target/**", "!project/**", "!.metals/**", "!.bloop/**", "!.idea/**" ]'})]}),"\n",(0,t.jsxs)(r.p,{children:["With ",(0,t.jsx)(r.code,{children:"files"})," you can choose which files should be included in your mutation run sandbox.\nThis is normally not needed as it defaults to all files not ignored by git. If you do need to override ",(0,t.jsx)(r.code,{children:"files"})," (for example, when your project isn't in a git repository), you can override the ",(0,t.jsx)(r.code,{children:"files"})," config."]}),"\n",(0,t.jsxs)(r.p,{children:["You can ",(0,t.jsx)(r.em,{children:"ignore"})," files by adding an exclamation mark (",(0,t.jsx)(r.code,{children:"!"}),") at the start of an expression."]}),"\n",(0,t.jsxs)(r.h3,{id:"base-dir-string",children:[(0,t.jsx)(r.code,{children:"base-dir"})," (",(0,t.jsx)(r.code,{children:"String"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:"base-dir: '/usr/your/project/folder/here'"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:'strykerBaseDir := file("./submodule1")'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," N/A (derived from the module's ",(0,t.jsx)(r.code,{children:"moduleDir"}),")",(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--base-dir submodule1"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," The current working directory"]}),"\n",(0,t.jsxs)(r.p,{children:["With ",(0,t.jsx)(r.code,{children:"base-dir"})," you specify the directory from which stryker4s starts and searches for mutations. The default for this is the directory from which the project is being run, which should be fine in most cases. This value can also be relative to the current working directory, E.G.: ",(0,t.jsx)(r.code,{children:"base-dir: submodule1"})," to set the base-dir to a submodule of your project."]}),"\n",(0,t.jsxs)(r.h3,{id:"reporters-seqstring",children:[(0,t.jsx)(r.code,{children:"reporters"})," (",(0,t.jsx)(r.code,{children:"Seq[String]"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:'reporters: ["console", "html", "json", "dashboard"]'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:'strykerReporters := Seq("console", "html", "json", "dashboard")'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:'override def strykerReporters = Some(Seq("console", "html", "json", "dashboard"))'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--reporters html --reporters console"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," The ",(0,t.jsx)(r.code,{children:"console"})," and ",(0,t.jsx)(r.code,{children:"html"})," reporters"]}),"\n",(0,t.jsxs)(r.p,{children:["With ",(0,t.jsx)(r.code,{children:"reporters"})," you can specify reporters for stryker4s to use. The following reporters are supported:"]}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"console"})," will output progress and the final result to the console."]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"html"})," outputs a nice HTML report to ",(0,t.jsx)(r.code,{children:"target/stryker4s-report-$timestamp/index.html"}),". See the ",(0,t.jsx)(r.a,{href:"https://github.com/stryker-mutator/mutation-testing-elements/tree/master/packages/elements#readme",children:"mutation-testing-elements repo"})," for more information."]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"json"})," writes a json of the mutation result to the same folder as the HTML reporter. The JSON is in the ",(0,t.jsx)(r.a,{href:"https://github.com/stryker-mutator/mutation-testing-elements/tree/master/packages/report-schema#readme",children:"mutation-testing-report-schema"})," format."]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"dashboard"})," reporter sends a report to ",(0,t.jsx)(r.a,{href:"https://dashboard.stryker
1-mutator.io",children:"https://dashboard.stryker-mutator.io"}),", enabling you to add a fancy mutation score badge to your readme, as well as hosting your HTML report on the dashboard! It uses the ",(0,t.jsx)(r.a,{href:"#dashboard-object",children:"dashboard.*"})," configuration options. See the ",(0,t.jsx)(r.a,{href:"/docs/General/dashboard",children:"dashboard docs"})," for more info. The dashboard reporter only works on JDK 11 or higher."]}),"\n"]}),"\n",(0,t.jsxs)(r.h3,{id:"open-report-boolean",children:[(0,t.jsx)(r.code,{children:"open-report"})," (",(0,t.jsx)(r.code,{children:"Boolean"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:"open-report: true"}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:"strykerOpenReport := true"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:"override def strykerOpenReport = Some(true)"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--open-report"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:"false"})]}),"\n",(0,t.jsx)(r.p,{children:"Open the HTML report in the default browser after the mutation run is finished."}),"\n",(0,t.jsxs)(r.h3,{id:"excluded-mutations-seqstring",children:[(0,t.jsx)(r.code,{children:"excluded-mutations"})," (",(0,t.jsx)(r.code,{children:"Seq[String]"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:'excluded-mutations: ["BooleanLiteral"]'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:'strykerExcludedMutations := Seq("BooleanLiteral")'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:'override def strykerExcludedMutations = Some(Seq("BooleanLiteral"))'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--excluded-mutations BooleanLiteral"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:"[]"})]}),"\n",(0,t.jsxs)(r.p,{children:["With ",(0,t.jsx)(r.code,{children:"excluded-mutations"}),", you can turn off certain mutations in the project. Allowed values are the following:"]}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsx)(r.li,{children:(0,t.jsx)(r.code,{children:"EqualityOperator"})}),"\n",(0,t.jsx)(r.li,{children:(0,t.jsx)(r.code,{children:"BooleanLiteral"})}),"\n",(0,t.jsx)(r.li,{children:(0,t.jsx)(r.code,{children:"ConditionalExpression"})}),"\n",(0,t.jsx)(r.li,{children:(0,t.jsx)(r.code,{children:"LogicalOperator"})}),"\n",(0,t.jsx)(r.li,{children:(0,t.jsx)(r.code,{children:"StringLiteral"})}),"\n",(0,t.jsx)(r.li,{children:(0,t.jsx)(r.code,{children:"MethodExpression"})}),"\n"]}),"\n",(0,t.jsxs)(r.h3,{id:"thresholds-object",children:[(0,t.jsx)(r.code,{children:"thresholds"})," (",(0,t.jsx)(r.code,{children:"object"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:"thresholds{ high=80, low=60, break=0 }"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:"strykerThresholdsHigh := 80; strykerThresholdsLow := 60; strykerThresholdsBreak := 0"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:"override def strykerThresholdsHigh = Some(80)"})," (and ",(0,t.jsx)(r.code,{children:"strykerThresholdsLow"})," / ",(0,t.jsx)(r.code,{children:"strykerThresholdsBreak"}),")",(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--thresholds.high 80 --thresholds.low 60 --thresholds.break 0"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default values:"})," ",(0,t.jsx)(r.code,{children:"high=80"}),", ",(0,t.jsx)(r.code,{children:"low=60"}),", ",(0,t.jsx)(r.code,{children:"break=0"})]}),"\n",(0,t.jsx)(r.p,{children:"Specify the thresholds for mutation scores."}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"mutation score >= high"}),": Success! Mutation score will be logged at the INFO level."]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"high > mutation score >= low"}),": Warning! Mutation score will be logged at the WARN level."]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"mutation score < low"}),": Dangerously low! Mutation score will be logged at the ERROR level with an extra warning."]}),"\n",(0,t.jsxs)(r.li,{children:[(0,t.jsx)(r.code,{children:"mutation score < break"}),": Error! Stryker will exit with exit code 1, indicating a build failure."]}),"\n"]}),"\n",(0,t.jsxs)(r.p,{children:["Setting ",(0,t.jsx)(r.code,{children:"break=0"})," (default value) ensures that the build will never fail."]}),"\n",(0,t.jsxs)(r.h3,{id:"dashboard-object",children:[(0,t.jsx)(r.code,{children:"dashboard.*"})," (",(0,t.jsx)(r.code,{children:"object"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:'dashboard { module="core" }'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:'strykerDashboardProject := "myproject"; strykerDashboardModule := "core"'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:'override def strykerDashboardProject = Some("myproject")'})," (and ",(0,t.jsx)(r.code,{children:"strykerDashboardModule"})," / ",(0,t.jsx)(r.code,{children:"strykerDashboardBaseUrl"})," / ",(0,t.jsx)(r.code,{children:"strykerDashboardReportType"})," / ",(0,t.jsx)(r.code,{children:"strykerDashboardVersion"}),")",(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:'--dashboard.project "myproject" --dashboard.module core'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default values:"})," ",(0,t.jsx)(r.code,{children:'dashboard { base-url="https://dashboard.stryker
1-mutator.io", project="github.com/$USER/$PROJECT_NAME", report-type=full, version=$BRANCH }'})," if filled by CI environment"]}),"\n",(0,t.jsxs)(r.p,{children:["Settings for the dashboard ",(0,t.jsx)(r.a,{href:"#reporters-seqstring",children:"reporter"}),". See the ",(0,t.jsx)(r.a,{href:"/docs/General/dashboard",children:"dashboard docs"}),". Note that the values should be kebab-case, not camelCase. If nothing is configured, Stryker4s will try to retrieve the values from one of the supported CI environments:"]}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsx)(r.li,{children:"Travis"}),"\n",(0,t.jsx)(r.li,{children:"CircleCI"}),"\n",(0,t.jsx)(r.li,{children:"GitHub actions"}),"\n"]}),"\n",(0,t.jsxs)(r.h3,{id:"scala-dialect-string",children:[(0,t.jsx)(r.code,{children:"scala-dialect"})," (",(0,t.jsx)(r.code,{children:"String"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:'scala-dialect: "2.13"'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:"strykerScalaDialect := scala.meta.dialects.Scala3"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:"override def strykerScalaDialect = Some(scala.meta.dialects.Scala3)"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:'--scala-dialect "scala3"'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," the project's Scala version, derived from the build (falling back to ",(0,t.jsx)(r.code,{children:"scala213source3"}),")",(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Since:"})," ",(0,t.jsx)(r.code,{children:"v0.10.1"})]}),"\n",(0,t.jsxs)(r.p,{children:["Set the Scala dialect that should be used for parsing Scala files. The sbt, Mill and Maven plugins derive this from the project's Scala version (and ",(0,t.jsx)(r.code,{children:"-Xsource:3"})," flag) automatically, so you normally don't need to set it. When it can't be derived (for example in the command runner), it falls back to Scala 2.13 with ",(0,t.jsx)(r.code,{children:"-Xsource:3"}),", as this has the widest compatibility. If you are running into issues with parsing Scala syntax, you can override this value."]}),"\n",(0,t.jsxs)(r.p,{children:["Valid values are Scala-versions without a patch version (",(0,t.jsx)(r.code,{children:"scala2.12"}),", ",(0,t.jsx)(r.code,{children:"212"}),", ",(0,t.jsx)(r.code,{children:"2.12"}),", ",(0,t.jsx)(r.code,{children:"2"}),", ",(0,t.jsx)(r.code,{children:"3"}),", ",(0,t.jsx)(r.code,{children:"3.2"}),"). If you use ",(0,t.jsx)(r.code,{children:"-Xsource:3"})," you can use ",(0,t.jsx)(r.code,{children:"scala212source3"})," or ",(0,t.jsx)(r.code,{children:"scala213source3"}),". The full list can be found ",(0,t.jsx)(r.a,{href:"https://github.com/stryker-mutator/stryker4s/blob/master/modules/core/src/main/scala/stryker4s/config/codec/CirisConfigDecoders.scala#L109-L124",children:"here"}),"."]}),"\n",(0,t.jsxs)(r.h3,{id:"static-tmp-dir-boolean",children:[(0,t.jsx)(r.code,{children:"static-tmp-dir"})," (",(0,t.jsx)(r.code,{children:"Boolean"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:"static-tmp-dir: true"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:"strykerStaticTmpDir := true"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:"override def strykerStaticTmpDir = Some(true)"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--static-tmp-dir"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:"false"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Since:"})," ",(0,t.jsx)(r.code,{children:"v0.15.0"})]}),"\n",(0,t.jsxs)(r.p,{children:["This will force the temporary dir to be created at a static path (",(0,t.jsx)(r.code,{children:"target/stryker4s-tmpDir"}),")."]}),"\n",(0,t.jsx)(r.p,{children:"Recommended when using stryker4s with Bazel (Bazel uses the path to the workspace to determine where to store the\nlocal cache - hashes the path to create the sandbox's name) as it speeds up mutation testing greatly."}),"\n",(0,t.jsxs)(r.h3,{id:"clean-tmp-dir-boolean",children:[(0,t.jsx)(r.code,{children:"clean-tmp-dir"})," (",(0,t.jsx)(r.code,{children:"Boolean"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:"clean-tmp-dir: false"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:"strykerCleanTmpDir := false"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:"override def strykerCleanTmpDir = Some(false)"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--clean-tmp-dir=false"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:"true"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Since:"})," ",(0,t.jsx)(r.code,{children:"v0.15.0"})]}),"\n",(0,t.jsx)(r.p,{children:"Temporary dir will be autodeleted at exit if this option is set. Turning it off is useful for debugging purposes.\nIf cleaning the temporary dir is disabled, you need to clean the temporary dir manually before restarting stryker4s."}),"\n",(0,t.jsx)(r.p,{children:"On error the temporary dir is never deleted (even if this option is set)."}),"\n",(0,t.jsx)(r.h2,{id:"test-runner-config",children:"Test runner config"}),"\n",(0,t.jsxs)(r.p,{children:["These options configure the forked test runner that the sbt, Mill and Maven plugins all use. The sbt and Mill plugins additionally expose them as build-tool settings (shown below); for the Maven plugin, set them in ",(0,t.jsx)(r.code,{children:"stryker4s.conf"}),". The exception is ",(0,t.jsx)(r.a,{href:"#legacy-test-runner-boolean",children:(0,t.jsx)(r.code,{children:"legacy-test-runner"})}),", which only applies to the sbt plugin."]}),"\n",(0,t.jsxs)(r.h3,{id:"timeout-factor-double",children:[(0,t.jsx)(r.code,{children:"timeout-factor"})," (",(0,t.jsx)(r.code,{children:"Double"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:"timeout-factor: 1.5"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:"strykerTimeoutFactor := 1.5"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:"override def strykerTimeoutFactor = Some(1.5)"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--timeout-factor 1.5"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:"1.5"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Since:"})," ",(0,t.jsx)(r.code,{children:"v0.10.0"})]}),"\n",(0,t.jsxs)(r.p,{children:["See ",(0,t.jsx)(r.a,{href:"#timeout-finiteduration",children:"timeout"})]}),"\n",(0,t.jsxs)(r.h3,{id:"timeout-finiteduration",children:[(0,t.jsx)(r.code,{children:"timeout"})," (",(0,t.jsx)(r.code,{children:"FiniteDuration"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:"timeout: 5000"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:"strykerTimeout := 5.seconds"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:"override def strykerTimeout = Some(5.seconds)"})," (with ",(0,t.jsx)(r.code,{children:"import scala.concurrent.duration.*"}),")",(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--timeout 5s"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:"5 seconds"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Since:"})," ",(0,t.jsx)(r.code,{children:"v0.10.0"})]}),"\n",(0,t.jsxs)(r.p,{children:["When Stryker4s is mutating code, it cannot determine indefinitely whether a code mutation results in an infinite loop (see ",(0,t.jsx)(r.a,{href:"https://en.wikipedia.org/wiki/Halting_problem",children:"Halting problem"}),").\nIn order to battle infinite loops, a test run gets killed after a certain period of time. This period is configurable with two settings: ",(0,t.jsx)(r.code,{children:"timeout"})," and ",(0,t.jsx)(r.code,{children:"timeoutFactor"}),".\nTo calculate the actual timeout in milliseconds the following formula 
1is used:"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"timeoutForTestRun = netTime * timeoutFactor + timeout\n"})}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.code,{children:"netTime"})," is calculated during the initial test run. The result is logged on ",(0,t.jsx)(r.code,{children:"info"})," level. For example: ",(0,t.jsx)(r.code,{children:"Timeout set to 5600ms (net 400 milliseconds)"})]}),"\n",(0,t.jsxs)(r.p,{children:["With ",(0,t.jsx)(r.code,{children:"timeout-factor"})," you can configure the allowed deviation relative to the time of a normal test run. Tweak this if you notice that mutants are prone to creating slower code, but not infinite loops.\n",(0,t.jsx)(r.code,{children:"timeout"})," lets you configure an absolute deviation. Use it if you run Stryker on a busy machine and you need to wait longer to make sure that the code indeed entered an infinite loop. It can be configured using a number of milliseconds (",(0,t.jsx)(r.code,{children:"5000"}),") or a duration string (",(0,t.jsx)(r.code,{children:"5s"}),", ",(0,t.jsx)(r.code,{children:"5000ms"}),")"]}),"\n",(0,t.jsxs)(r.h3,{id:"max-test-runner-reuse-int",children:[(0,t.jsx)(r.code,{children:"max-test-runner-reuse"})," (",(0,t.jsx)(r.code,{children:"Int"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:"max-test-runner-reuse: 5"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:"strykerMaxTestRunnerReuse := 3"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:"override def strykerMaxTestRunnerReuse = Some(3)"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--max-test-runner-reuse 3"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," disabled",(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Since:"})," ",(0,t.jsx)(r.code,{children:"v0.10.0"})]}),"\n",(0,t.jsxs)(r.p,{children:["Restart the testrunner child process after every ",(0,t.jsx)(r.code,{children:"n"})," mutation runs. Not recommended unless you are experiencing memory leaks that you are unable to resolve."]}),"\n",(0,t.jsxs)(r.h3,{id:"legacy-test-runner-boolean",children:[(0,t.jsx)(r.code,{children:"legacy-test-runner"})," (",(0,t.jsx)(r.code,{children:"Boolean"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:"legacy-test-runner: true"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:"strykerLegacyTestRunner := true"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--legacy-test-runner"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:"false"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Since:"})," ",(0,t.jsx)(r.code,{children:"v0.10.0"})]}),"\n",(0,t.jsxs)(r.blockquote,{children:["\n",(0,t.jsxs)(r.p,{children:["This option only applies to the ",(0,t.jsx)(r.strong,{children:"sbt"})," plugin. The Mill and Maven plugins do not support the legacy test runner."]}),"\n"]}),"\n",(0,t.jsxs)(r.p,{children:["Use the sbt testrunner that was the default before ",(0,t.jsx)(r.code,{children:"v0.10.0"}),". This testrunner is a lot slower, so it is recommended to only enable this if you are running into issues with the new testrunner. You might want to take a look at ",(0,t.jsx)(r.a,{href:"#max-test-runner-reuse-int",children:(0,t.jsx)(r.code,{children:"max-test-runner-reuse"})})," first."]}),"\n",(0,t.jsx)(r.p,{children:"Cases where you might want to use this:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:["Your code has lots of 'static' mutants (e.g. ",(0,t.jsx)(r.code,{children:"val"})," in an ",(0,t.jsx)(r.code,{children:"object"}),") which the new testrunner can not test."]}),"\n",(0,t.jsx)(r.li,{children:"You are running into a bug with the new testrunner."}),"\n",(0,t.jsx)(r.li,{children:"Your testframework does not work with the testrunner."}),"\n"]}),"\n",(0,t.jsxs)(r.p,{children:["For the last two cases, please ",(0,t.jsx)(r.a,{href:"https://github.com/stryker-mutator/stryker4s/issues/new",children:"let us know by creating an issue"}),"!"]}),"\n",(0,t.jsxs)(r.h3,{id:"concurrency-int",children:[(0,t.jsx)(r.code,{children:"concurrency"})," (",(0,t.jsx)(r.code,{children:"Int"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:"concurrency: 4"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:"strykerConcurrency := 4"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:"override def strykerConcurrency = Some(4)"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--concurrency 4"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:"(cpuCoreCount / 4).rounded + 1"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Since:"})," ",(0,t.jsx)(r.code,{children:"v0.12.0"})]}),"\n",(0,t.jsxs)(r.p,{children:["Set the concurrency of testrunners. Stryker4s will create this many testrunners to run mutants in parallel. This defaults to ",(0,t.jsx)(r.code,{children:"(cpuCoreCount / 4).rounded + 1"}),". ",(0,t.jsx)(r.code,{children:"cpuCoreCount"})," includes virtual processors such as from hyperthreading. This is a sane default for most use cases as most test frameworks already have some form of concurrency built in. But as always with concurrency, test it yourself to be sure of the best performance."]}),"\n",(0,t.jsxs)(r.h3,{id:"debug-object",children:[(0,t.jsx)(r.code,{children:"debug"})," (",(0,t.jsx)(r.code,{children:"object"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:["Describes the ",(0,t.jsx)(r.code,{children:"debug"})," config field"]}),"\n",(0,t.jsxs)(r.h4,{id:"debug-test-runner-boolean",children:[(0,t.jsx)(r.code,{children:"debug-test-runner"})," (",(0,t.jsx)(r.code,{children:"Boolean"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:"debug { debug-test-runner: true }"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:"strykerDebugDebugTestRunner := true"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:"override def strykerDebugDebugTestRunner = Some(true)"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--debug-test-runner"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:"false"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Since:"})," ",(0,t.jsx)(r.code,{children:"v0.14.0"})]}),"\n",(0,t.jsx)(r.p,{children:"Passes additional JVM options to the created testrunner which debuggers can use to attach and debug. Debugging is opened on port 8000. Also limits concurrency to 1. How to debug is specific to your IDE. The used JVM debug argument is:"}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{children:"-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=127.0.0.1:8000\n"})}),"\n",(0,t.jsxs)(r.p,{children:["To debug in VS Code, you can use (and edit) this ",(0,t.jsx)(r.code,{children:"launch.json"}),":"]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-json",children:'{\n  "version": "0.2.0",\n  "configurations": [\n    {\n      "type": "scala",\n      "name": "Attach to sbt test-runner",\n      "request": "attach",\n      "hostName": "127.0.0.1",\n      "port": 8000,\n      "buildTarget": "testRunner"\n    }\n  ]\n}\n'})}),"\n",(0,t.jsxs)(r.h4,{id:"log-test-runner-stdout-boolean",children:[(0,t.jsx)(r.code,{children:"log-test-runner-stdout"})," (",(0,t.jsx)(r.code,{children:"Boolean"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:"debug { log-test-runner-stdout: true }"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," ",(0,t.jsx)(r.code,{children:"strykerDebugLogTestRunnerStdout := true"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mill:"})," ",(0,t.jsx)(r.code,{children:"override def strykerDebugLogTestRunnerStdout = Some(true)"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:"--log-test-runner-stdout"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:"false"}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Since:"})," ",(0,t.jsx)(r.code,{children:"v0.14.0"})]}),"\n",(0,t.jsx)(r.p,{children:"By default, stdout from testrunners is not logged. With this option, stdout is sent to debug logging. Enabling this can be useful when debugging the testrunners, but is disabled by default because the output can be too much for normal debug logging."}),"\n",(0,t.jsx)(r.h2,{id:"process-runner-config",children:"Process runner config"}),"\n",(0,t.jsxs)(r.h3,{id:"test-runner-object",children:[(0,t.jsx)(r.code,{children:"test-runner"})," (",(0,t.jsx)(r.code,{children:"object"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Config file:"})," ",(0,t.jsx)(r.code,{children:'test-runner: { command: "sbt", args: "test" }'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Sbt:"})," N/A",(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"CLI:"})," ",(0,t.jsx)(r.code,{children:'--test-runner-command "sbt" --test-runner-args "test"'}),(0,t.jsx)(r.br,{}),"\n",(0,t.jsx)(r.strong,{children:"Mandatory:"})," Yes"]}),"\n",(0,t.jsxs)(r.p,{children:["With ",(0,t.jsx)(r.code,{children:"test-runner"})," you specify how stryker4s can invoke the test runner.",(0,t.jsx)(r.br,{}),"\n","Examples would be ",(0,t.jsx)(r.code,{children:"sbt test"}),", ",(0,t.jsx)(r.code,{children:"mvn test"})," or any other command to run your tests, including any parameters your tests might need."]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"warning"})," The process runner should only be used when your specific test framework is not supported. Due to performance and predictability reasons."]}),"\n",(0,t.jsx)(r.h2,{id:"other-configuration-options",children:"Other 
1configuration options"}),"\n",(0,t.jsxs)(r.h3,{id:"log-level-string",children:[(0,t.jsx)(r.code,{children:"log-level"})," (",(0,t.jsx)(r.code,{children:"String"}),")"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Default value:"})," ",(0,t.jsx)(r.code,{children:"INFO"})]}),"\n",(0,t.jsx)(r.p,{children:"How to adjust the loglevel depends on how you run stryker4s:"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:["sbt plugin","\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:["Add ",(0,t.jsx)(r.code,{children:"stryker / logLevel := Level.Debug"})," to your build.sbt. Or use ",(0,t.jsx)(r.code,{children:"set stryker / logLevel := Level.Debug"})," if you are in a sbt session."]}),"\n",(0,t.jsxs)(r.li,{children:["Options: ",(0,t.jsx)(r.code,{children:"Debug"}),", ",(0,t.jsx)(r.code,{children:"Info"}),", ",(0,t.jsx)(r.code,{children:"Warn"}),", ",(0,t.jsx)(r.code,{children:"Error"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(r.li,{children:["Mill plugin","\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:["Pass Mill's ",(0,t.jsx)(r.code,{children:"--debug"})," flag, like so: ",(0,t.jsx)(r.code,{children:"./mill --debug foo.stryker"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(r.li,{children:["Commandrunner","\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:["Pass the loglevel as a parameter when running, like so: ",(0,t.jsx)(r.code,{children:"--debug"})]}),"\n",(0,t.jsxs)(r.li,{children:["Options: ",(0,t.jsx)(r.code,{children:"--debug"}),", ",(0,t.jsx)(r.code,{children:"--info"}),", ",(0,t.jsx)(r.code,{children:"--warn"}),", ",(0,t.jsx)(r.code,{children:"--error"})," (not case sensitive)"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(r.li,{children:["Maven plugin","\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:["As a command-line property, like so: ",(0,t.jsx)(r.code,{children:"mvn -Dorg.slf4j.simpleLogger.defaultLogLevel=warn stryker4s:run"}),"\n",(0,t.jsxs)(r.ul,{children:["\n",(0,t.jsxs)(r.li,{children:["Options: ",(0,t.jsx)(r.code,{children:"trace"}),", ",(0,t.jsx)(r.code,{children:"debug"}),", ",(0,t.jsx)(r.code,{children:"info"}),", ",(0,t.jsx)(r.code,{children:"warn"}),", or ",(0,t.jsx)(r.code,{children:"error"})]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(r.li,{children:["Debug logging with ",(0,t.jsx)(r.code,{children:"-X"})," or ",(0,t.jsx)(r.code,{children:"-debug"}),": ",(0,t.jsx)(r.code,{children:"mvn -debug stryker4s:run"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"warning"})," This option cannot be set from stryker4s.conf."]}),"\n",(0,t.jsx)(r.h2,{id:"excluding-specific-mutations",children:"Excluding specific mutations"}),"\n",(0,t.jsxs)(r.p,{children:[(0,t.jsx)(r.strong,{children:"Since:"})," ",(0,t.jsx)(r.code,{children:"v0.9.0"})]}),"\n",(0,t.jsxs)(r.p,{children:["Using the ",(0,t.jsx)(r.code,{children:"@SuppressWarnings"})," annotation, you can tell Stryker4s to ignore mutations in a code block. Annotate a code block with a ",(0,t.jsx)(r.code,{children:"@SuppressWarnings"})," annotation, passing an array of mutation names you would like to ignore."]}),"\n",(0,t.jsx)(r.pre,{children:(0,t.jsx)(r.code,{className:"language-scala",children:'/** No booleans will be mutated\n */\n@SuppressWarnings(Array("stryker4s.mutation.BooleanLiteral"))\nRequestLogger(logHeaders = false, logBody = false)(ResponseLogger(logHeaders = false, logBody = true)(httpClient))\n'})}),"\n",(0,t.jsxs)(r.p,{children:["All mutation names are the same as for ",(0,t.jsx)(r.a,{href:"#excluded-mutations-seqstring",children:"Excluded mutations"})," and should be prefixed with ",(0,t.jsx)(r.code,{children:'"stryker4s.mutation."'}),"."]})]})}function h(e={}){let{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,t.jsx)(r,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},23191:function(e,r,n){n.d(r,{R:function(){return o},x:function(){return d}});var s=n(92990);let t={},i=s.createContext(t);function o(e){let r=s.useContext(i);return s.useMemo(function(){return"function"==typeof e?e(r):{...r,...e}},[r,e])}function d(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(i.Provider,{value:r},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.