Skip to content

Commit 5ef4ef7

Browse files
committed
CI pipelines updates merge
2 parents 237b7de + 4710e9e commit 5ef4ef7

12 files changed

+59
-45
lines changed

.github/workflows/sonarqube-analysis.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@ jobs:
2020
sonarProjectName: qatoolkit_qatoolkit-engine-bombardier-net
2121
sonarOrganization: qatoolkit
2222
dotnetBuildArguments: ./src/QAToolKit.Engine.Bombardier/QAToolKit.Engine.Bombardier.csproj
23-
dotnetDisableTests: true
24-
# Optional extra command arguments the the SonarScanner 'begin' command
25-
sonarBeginArguments: /d:sonar.verbose="true" /d:sonar.language="cs"
23+
dotnetTestArguments: ./src/QAToolKit.Engine.Bombardier.Test/QAToolKit.Engine.Bombardier.Test.csproj /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
24+
sonarBeginArguments: /d:sonar.verbose="true" /d:sonar.language="cs" /d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml" /d:sonar.coverage.exclusions="**Tests.cs"
2625
sonarHostname: "https://sonarcloud.io"
2726
env:
2827
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<Project>
22
<PropertyGroup>
3-
<Version>0.2.0</Version>
3+
<Version>0.2.1</Version>
44
</PropertyGroup>
55
</Project>

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# QAToolKit.Engine.Bombardier
22
![.NET Core](https://github.com/qatoolkit/qatoolkit-engine-bombardier-net/workflows/.NET%20Core/badge.svg?branch=main)
3+
![CodeQL Analyze](https://github.com/qatoolkit/qatoolkit-engine-bombardier-net/workflows/CodeQL%20Analyze/badge.svg)
4+
![Sonarqube Analyze](https://github.com/qatoolkit/qatoolkit-engine-bombardier-net/workflows/Sonarqube%20Analyze/badge.svg)
5+
![](https://img.shields.io/nuget/v/QAToolKit.Engine.Bombardier?label=QAToolKit.Engine.Bombardier)
36

7+
## Description
48
`QAToolKit.Engine.Bombardier` is a .NET standard library, which takes `IEnumerable<HttpTestRequest>` object and runs load tests with tool called [Bombardier](https://github.com/codesenberg/bombardier).
59

610
Library is a thin wrapper, that generates requests and parses results to JSON. You can process or import that JSON in other tools. We plan to release an exporter to CSV, HTML and maybe other formats.
@@ -148,8 +152,9 @@ var requests = await urlSource.Load(new Uri[] {
148152

149153
in the sample code above. Check the [QAToolKit.Source.Swagger](https://github.com/qatoolkit/qatoolkit-source-swagger-net) library for more details.
150154

151-
## TO-DO
155+
## To-do
152156

157+
- **This library is an early alpha version**
153158
- Currently tested for GET, POST, PUT and DELETE HTTP methods. Need to extend support.
154159

155160
## License

src/QAToolKit.Engine.Bombardier.Test/BombardierTestsRunnerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public async Task BombardierPostTestWithBodyAndOptionsTest_Successfull()
147147

148148
Assert.NotNull(bombardierResults);
149149
Assert.Single(bombardierResults);
150-
Assert.Equal("-m POST https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1 -c 1 -H \"Content-Type: application/json\" -b \"{\\\"id\\\":66,\\\"name\\\":\\\"my bike\\\",\\\"brand\\\":\\\"cannondale\\\",\\\"BicycleType\\\":1}\" --http2 --timeout=30s --duration=1s", bombardierResults.FirstOrDefault().Command);
150+
Assert.Equal(@"-m POST https://qatoolkitapi.azurewebsites.net/api/bicycles?api-version=1 -c 1 -H ""Content-Type: application/json"" -b ""{""id"":66,""name"":""my bike"",""brand"":""cannondale"",""BicycleType"":1}"" --http2 --timeout=30s --duration=1s", bombardierResults.FirstOrDefault().Command);
151151
Assert.True(bombardierResults.FirstOrDefault().Counter1xx == 0);
152152
Assert.True(bombardierResults.FirstOrDefault().Counter2xx > 0);
153153
Assert.True(bombardierResults.FirstOrDefault().Counter3xx == 0);

src/QAToolKit.Engine.Bombardier.Test/QAToolKit.Engine.Bombardier.Test.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
</PropertyGroup>
88

99
<ItemGroup>
10+
<PackageReference Include="coverlet.msbuild" Version="2.9.0">
11+
<PrivateAssets>all</PrivateAssets>
12+
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
13+
</PackageReference>
1014
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.9" />
1115
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="3.1.9" />
1216
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />

src/QAToolKit.Engine.Bombardier/BombardierTestsGenerator.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ public BombardierTestsGenerator(Action<BombardierGeneratorOptions> options = nul
3333
/// Generate a Bombardier script from requests
3434
/// </summary>
3535
/// <returns></returns>
36-
/// <param name="restRequests"></param>
37-
public Task<IEnumerable<BombardierTest>> Generate(IEnumerable<HttpRequest> restRequests)
36+
/// <param name="httpRequests"></param>
37+
public Task<IEnumerable<BombardierTest>> Generate(IEnumerable<HttpRequest> httpRequests)
3838
{
39-
if (restRequests == null)
40-
throw new ArgumentNullException(nameof(restRequests));
39+
if (httpRequests == null)
40+
throw new ArgumentNullException(nameof(httpRequests));
4141

4242
var bombardierTests = new List<BombardierTest>();
4343
var scriptBuilder = new StringBuilder();
@@ -53,7 +53,7 @@ public Task<IEnumerable<BombardierTest>> Generate(IEnumerable<HttpRequest> restR
5353
bombardierFullPath = Path.Combine("./bombardier", "linux", "bombardier");
5454
}
5555

56-
foreach (var request in restRequests)
56+
foreach (var request in httpRequests)
5757
{
5858
scriptBuilder.AppendLine($"{bombardierFullPath} " +
5959
$"-m {request.Method.ToString().ToUpper()} {HttpUrlHelper.GenerateUrlParameters(request, _bombardierGeneratorOptions)}" +

src/QAToolKit.Engine.Bombardier/BombardierTestsRunner.cs

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -95,43 +95,36 @@ private async Task<BombardierResult> Run(string testCommand)
9595

9696
private BombardierResult ParseOutput(StringBuilder sb, string command, DateTime testStart, DateTime testStop)
9797
{
98-
try
98+
var results = new BombardierResult
9999
{
100-
var results = new BombardierResult
101-
{
102-
TestStart = testStart,
103-
TestStop = testStop,
104-
Duration = testStop.Subtract(testStart).TotalSeconds
105-
};
100+
TestStart = testStart,
101+
TestStop = testStop,
102+
Duration = testStop.Subtract(testStart).TotalSeconds
103+
};
106104

107-
var str = sb.ToString();
105+
var str = sb.ToString();
108106

109-
results.Command = ObfuscateAuthenticationHeader(command);
110-
results.Counter1xx = Convert.ToInt32(StringHelper.RemoveAllNonNumericChars(StringHelper.Between(str, "1xx - ", ",")));
111-
results.Counter2xx = Convert.ToInt32(StringHelper.RemoveAllNonNumericChars(StringHelper.Between(str, "2xx - ", ",")));
112-
results.Counter3xx = Convert.ToInt32(StringHelper.RemoveAllNonNumericChars(StringHelper.Between(str, "3xx - ", ",")));
113-
results.Counter4xx = Convert.ToInt32(StringHelper.RemoveAllNonNumericChars(StringHelper.Between(str, "4xx - ", ",")));
114-
results.Counter5xx = Convert.ToInt32(StringHelper.RemoveAllNonNumericChars(StringHelper.Between(str, "5xx - ", " ")));
107+
results.Command = ObfuscateAuthenticationHeader(command.Replace(@"\""", @""""));
108+
results.Counter1xx = Convert.ToInt32(StringHelper.RemoveAllNonNumericChars(StringHelper.Between(str, "1xx - ", ",")));
109+
results.Counter2xx = Convert.ToInt32(StringHelper.RemoveAllNonNumericChars(StringHelper.Between(str, "2xx - ", ",")));
110+
results.Counter3xx = Convert.ToInt32(StringHelper.RemoveAllNonNumericChars(StringHelper.Between(str, "3xx - ", ",")));
111+
results.Counter4xx = Convert.ToInt32(StringHelper.RemoveAllNonNumericChars(StringHelper.Between(str, "4xx - ", ",")));
112+
results.Counter5xx = Convert.ToInt32(StringHelper.RemoveAllNonNumericChars(StringHelper.Between(str, "5xx - ", " ")));
115113

116-
var reqsPerSec = StringHelper.ReplaceMultipleSpacesWithOne(StringHelper.Between(str, "Reqs/sec", Environment.NewLine).TrimStart().TrimEnd()).Split(' ');
114+
var reqsPerSec = StringHelper.ReplaceMultipleSpacesWithOne(StringHelper.Between(str, "Reqs/sec", Environment.NewLine).TrimStart().TrimEnd()).Split(' ');
117115

118-
CultureInfo cultures = new CultureInfo("en-US");
119-
results.AverageRequestsPerSecond = Convert.ToDecimal(reqsPerSec[0], cultures);
120-
results.StdevRequestsPerSecond = Convert.ToDecimal(reqsPerSec[1], cultures);
121-
results.MaxRequestsPerSecond = Convert.ToDecimal(reqsPerSec[2], cultures);
116+
CultureInfo cultures = new CultureInfo("en-US");
117+
results.AverageRequestsPerSecond = Convert.ToDecimal(reqsPerSec[0], cultures);
118+
results.StdevRequestsPerSecond = Convert.ToDecimal(reqsPerSec[1], cultures);
119+
results.MaxRequestsPerSecond = Convert.ToDecimal(reqsPerSec[2], cultures);
122120

123-
var latencies = StringHelper.ReplaceMultipleSpacesWithOne(StringHelper.Between(str, "Latency ", Environment.NewLine).TrimStart().TrimEnd()).Split(' ');
121+
var latencies = StringHelper.ReplaceMultipleSpacesWithOne(StringHelper.Between(str, "Latency ", Environment.NewLine).TrimStart().TrimEnd()).Split(' ');
124122

125-
results.AverageLatency = GetLatencyMiliseconds(latencies[0]);
126-
results.StdevLatency = GetLatencyMiliseconds(latencies[1]);
127-
results.MaxLatency = GetLatencyMiliseconds(latencies[2]);
123+
results.AverageLatency = GetLatencyMiliseconds(latencies[0]);
124+
results.StdevLatency = GetLatencyMiliseconds(latencies[1]);
125+
results.MaxLatency = GetLatencyMiliseconds(latencies[2]);
128126

129-
return results;
130-
}
131-
catch
132-
{
133-
throw;
134-
}
127+
return results;
135128
}
136129

137130
private decimal GetLatencyMiliseconds(string latency)

src/QAToolKit.Engine.Bombardier/Exceptions/QAToolKitBombardierException.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,29 @@
33

44
namespace QAToolKit.Engine.Bombardier.Exceptions
55
{
6-
internal class QAToolKitBombardierException : Exception
6+
/// <summary>
7+
/// QA Toolkit bombardier exception
8+
/// </summary>
9+
[Serializable]
10+
public class QAToolKitBombardierException : Exception
711
{
12+
/// <summary>
13+
/// QA Toolkit bombardier exception
14+
/// </summary>
815
public QAToolKitBombardierException(string message) : base(message)
916
{
1017
}
1118

19+
/// <summary>
20+
/// QA Toolkit bombardier exception
21+
/// </summary>
1222
public QAToolKitBombardierException(string message, Exception innerException) : base(message, innerException)
1323
{
1424
}
1525

26+
/// <summary>
27+
/// QA Toolkit bombardier exception
28+
/// </summary>
1629
protected QAToolKitBombardierException(SerializationInfo info, StreamingContext context) : base(info, context)
1730
{
1831
}

src/QAToolKit.Engine.Bombardier/Helpers/AuthorizationHeaderHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace QAToolKit.Engine.Bombardier.Helpers
1010
/// <summary>
1111
/// Authorization Header Helper
1212
/// </summary>
13-
public static class AuthorizationHeaderHelper
13+
internal static class AuthorizationHeaderHelper
1414
{
1515

1616
/// <summary>

src/QAToolKit.Engine.Bombardier/Helpers/ContentTypeHeaderHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace QAToolKit.Engine.Bombardier.Helpers
88
/// <summary>
99
/// Content type header helper
1010
/// </summary>
11-
public class ContentTypeHeaderHelper
11+
internal static class ContentTypeHeaderHelper
1212
{
1313
/// <summary>
1414
/// Generate content type header

0 commit comments

Comments
 (0)