Skip to content

Commit c5dde49

Browse files
committed
added NBomberRunner.withTargetScenarios and --target CLI args
1 parent 77911da commit c5dde49

File tree

8 files changed

+90
-14
lines changed

8 files changed

+90
-14
lines changed

src/NBomber/Api/CSharp.fs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@ type NBomberRunner =
217217
static member RegisterScenarios([<ParamArray>]scenarios: Scenario[]) =
218218
scenarios |> Seq.toList |> FSharp.NBomberRunner.registerScenarios
219219

220+
/// Sets target scenarios among all registered that will execute
221+
static member WithTargetScenarios(context: NBomberContext, [<ParamArray>]scenarioNames: string[]) =
222+
let names = scenarioNames |> Seq.toList
223+
context |> FSharp.NBomberRunner.withTargetScenarios(names)
224+
220225
/// Sets test suite name
221226
/// Default value is: nbomber_default_test_suite_name.
222227
[<Extension>]

src/NBomber/Api/FSharp.fs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,10 @@ module NBomberRunner =
227227
let registerScenarios (scenarios: Contracts.Scenario list) =
228228
{ NBomberContext.empty with RegisteredScenarios = scenarios }
229229

230+
/// Sets target scenarios among all registered that will execute
231+
let withTargetScenarios (scenarioNames: string list) (context: NBomberContext) =
232+
context |> NBomberContext.setTargetScenarios scenarioNames
233+
230234
/// Sets test suite name
231235
/// Default value is: nbomber_default_test_suite_name.
232236
let withTestSuite (testSuite: string) (context: NBomberContext) =
@@ -320,27 +324,33 @@ module NBomberRunner =
320324
{ context with UseHintsAnalyzer = false }
321325

322326
let internal executeCliArgs (args) (context: NBomberContext) =
323-
let invokeConfigLoader (configName) (configLoader) (config) (context) =
324-
if config = String.Empty then $"{configName} is empty" |> failwith
325-
elif String.IsNullOrEmpty config then context
326-
else configLoader config context
327+
let loadConfigFn (loadConfig) (configName) (configPath) (context) =
328+
if configPath = String.Empty then failwith $"{configName} is empty"
329+
elif isNull configPath then context
330+
else loadConfig configPath context
331+
332+
let setTargetScenarios (targetScenarios: string seq) (context: NBomberContext) =
333+
if Seq.isEmpty targetScenarios then context
334+
else NBomberContext.setTargetScenarios (List.ofSeq targetScenarios) context
327335

328336
match CommandLine.Parser.Default.ParseArguments<CommandLineArgs>(args) with
329337
| :? Parsed<CommandLineArgs> as parsed ->
330-
let values = parsed.Value
331-
let execLoadConfigCmd = invokeConfigLoader "config" loadConfig values.Config
332-
let execLoadInfraConfigCmd = invokeConfigLoader "infra config" loadInfraConfig values.InfraConfig
333-
let execCmd = execLoadConfigCmd >> execLoadInfraConfigCmd
338+
let cliArgs = parsed.Value
339+
let loadCnf = loadConfigFn loadConfig "config" cliArgs.Config
340+
let loadInfra = loadConfigFn loadInfraConfig "infra config" cliArgs.InfraConfig
341+
let run = loadCnf >> loadInfra >> setTargetScenarios(cliArgs.TargetScenarios)
334342

335-
context |> execCmd
343+
run context
336344

337345
| _ -> context
338346

339347
let internal runWithResult (args) (context: NBomberContext) =
340348
GCSettings.LatencyMode <- GCLatencyMode.SustainedLowLatency
341-
context
342-
|> executeCliArgs args
343-
|> NBomberRunner.run
349+
350+
if Seq.isEmpty args then
351+
NBomberRunner.run context
352+
else
353+
context |> executeCliArgs args |> NBomberRunner.run
344354

345355
let run (context: NBomberContext) =
346356
context

src/NBomber/Contracts.fs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ type NBomberContext = {
2727
Reporting: ReportingContext
2828
WorkerPlugins: IWorkerPlugin list
2929
UseHintsAnalyzer: bool
30+
TargetScenarios: string list option
3031
} with
3132

3233
[<CompiledName("Empty")>]
@@ -46,6 +47,7 @@ type NBomberContext = {
4647
}
4748
WorkerPlugins = List.empty
4849
UseHintsAnalyzer = true
50+
TargetScenarios = None
4951
}
5052

5153
namespace NBomber.Contracts.Internal
@@ -56,6 +58,7 @@ open NBomber.Contracts
5658
type CommandLineArgs = {
5759
[<Option('c', "config", HelpText = "NBomber configuration")>] Config: string
5860
[<Option('i', "infra", HelpText = "NBomber infra configuration")>] InfraConfig: string
61+
[<Option('t', "target", HelpText = "Target Scenarios")>] TargetScenarios: string seq
5962
}
6063

6164
type StepResponse = {

src/NBomber/DomainServices/NBomberContext.fs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,12 +204,17 @@ let getScenariosSettings (scenarios: DomainTypes.Scenario list) (context: NBombe
204204

205205
let getTargetScenarios (context: NBomberContext) =
206206
let targetScn =
207-
context.NBomberConfig
208-
|> Option.bind(fun x -> x.TargetScenarios)
207+
context.TargetScenarios
208+
|> Option.orElseWith(fun () ->
209+
context.NBomberConfig |> Option.bind(fun x -> x.TargetScenarios)
210+
)
209211

210212
let allScns = context.RegisteredScenarios |> List.map(fun x -> x.ScenarioName)
211213
defaultArg targetScn allScns
212214

215+
let setTargetScenarios (scenarios: string list) (context: NBomberContext) =
216+
{ context with TargetScenarios = Some scenarios }
217+
213218
let getReportFileName (context: NBomberContext) =
214219
let tryGetFromConfig (ctx) = option {
215220
let! config = ctx.NBomberConfig

tests/NBomber.IntegrationTests/CliArgsTests.fs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ let okStep = Step.create("ok step", fun _ -> task {
1515
})
1616

1717
let scenario = Scenario.create "scenario" [okStep] |> Scenario.withoutWarmUp
18+
let scenario2 = Scenario.create "scenario2" [okStep] |> Scenario.withoutWarmUp
1819

1920
[<Theory>]
2021
[<InlineData("-c")>]
@@ -103,3 +104,14 @@ let ``CLI commands should throw ex if infra config file is empty`` (command) =
103104
fun _ -> NBomberRunner.registerScenarios [scenario]
104105
|> NBomberRunner.executeCliArgs [command; ""]
105106
|> ignore)
107+
108+
[<Theory>]
109+
[<InlineData("-t")>]
110+
[<InlineData("--target")>]
111+
let ``TargetScenarios should update NBomberContext`` (command) =
112+
let context =
113+
NBomberRunner.registerScenarios [scenario; scenario2]
114+
|> NBomberRunner.executeCliArgs [command; "scenario2"]
115+
116+
test <@ context.TargetScenarios.Value.Length = 1 @>
117+
test <@ context.TargetScenarios.Value.Head = "scenario2" @>

tests/NBomber.IntegrationTests/NBomber.IntegrationTests.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
5252
</None>
5353
<Compile Include="HintsAnalyzerTests.fs" />
54+
<Compile Include="NBomberRunnerTests.fs" />
5455
</ItemGroup>
5556
<ItemGroup>
5657
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />

tests/NBomber.IntegrationTests/NBomberContextTests.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ let context = {
6262
}
6363
WorkerPlugins = List.empty
6464
UseHintsAnalyzer = false
65+
TargetScenarios = None
6566
}
6667

6768
[<Fact>]
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
module Tests.NBomberRunner
2+
3+
open System.Threading.Tasks
4+
open Xunit
5+
open Swensen.Unquote
6+
7+
open NBomber
8+
open NBomber.Contracts
9+
open NBomber.FSharp
10+
open NBomber.Domain
11+
12+
[<Fact>]
13+
let ``withTargetScenarios should run only specified scenarios`` () =
14+
15+
let mutable scn1Started = false
16+
let mutable scn2Started = false
17+
18+
let okStep = Step.create("ok step", fun ctx -> task {
19+
do! Task.Delay(milliseconds 100)
20+
return Response.ok()
21+
})
22+
23+
let scn1 =
24+
Scenario.create "scn_1" [okStep]
25+
|> Scenario.withInit(fun _ -> task { scn1Started <- true })
26+
|> Scenario.withLoadSimulations [KeepConstant(1, seconds 1)]
27+
28+
let scn2 =
29+
Scenario.create "scn_2" [okStep]
30+
|> Scenario.withInit(fun _ -> task { scn2Started <- true })
31+
|> Scenario.withLoadSimulations [KeepConstant(1, seconds 1)]
32+
33+
NBomberRunner.registerScenarios [scn1; scn2]
34+
|> NBomberRunner.withTargetScenarios ["scn_2"]
35+
|> NBomberRunner.run
36+
|> ignore
37+
38+
test <@ scn1Started = false @>
39+
test <@ scn2Started @>

0 commit comments

Comments
 (0)