Qase.Csharp.Commons
1.1.27
dotnet add package Qase.Csharp.Commons --version 1.1.27
NuGet\Install-Package Qase.Csharp.Commons -Version 1.1.27
<PackageReference Include="Qase.Csharp.Commons" Version="1.1.27" />
<PackageVersion Include="Qase.Csharp.Commons" Version="1.1.27" />
<PackageReference Include="Qase.Csharp.Commons" />
paket add Qase.Csharp.Commons --version 1.1.27
#r "nuget: Qase.Csharp.Commons, 1.1.27"
#:package Qase.Csharp.Commons@1.1.27
#addin nuget:?package=Qase.Csharp.Commons&version=1.1.27
#tool nuget:?package=Qase.Csharp.Commons&version=1.1.27
Qase C# Commons
This module is an SDK for developing test reporters for Qase TestOps. It uses Qase.ApiClient.V1 and Qase.ApiClient.V2 as API clients.
Used By
To report results from tests using a popular framework, use one of these reporters instead:
- Qase.xUnit.Reporter - xUnit test framework integration
- Qase.NUnit.Reporter - NUnit test framework integration
- Qase.MSTest.Reporter - MSTest test framework integration
You should only use this package directly if you're developing a custom reporter for a specialized test framework.
Configuration
Qase C# Reporters can be configured in multiple ways:
- using a config file
qase.config.json - using environment variables
All configuration options are listed in the table below:
| Description | Config file | Environment variable | CLI option | Default value | Required | Possible values |
|---|---|---|---|---|---|---|
| Common | ||||||
| Mode of reporter | mode |
QASE_MODE |
QASE_MODE |
off |
No | testops, report, off |
| Fallback mode of reporter | fallback |
QASE_FALLBACK |
QASE_FALLBACK |
off |
No | testops, report, off |
| Environment | environment |
QASE_ENVIRONMENT |
QASE_ENVIRONMENT |
undefined | No | Any string |
| Root suite | rootSuite |
QASE_ROOT_SUITE |
QASE_ROOT_SUITE |
undefined | No | Any string |
| Enable debug logs | debug |
QASE_DEBUG |
QASE_DEBUG |
False |
No | True, False |
| Logging configuration | ||||||
| Enable console output | logging.console |
QASE_LOGGING_CONSOLE |
QASE_LOGGING_CONSOLE |
True |
No | True, False |
| Enable file output | logging.file |
QASE_LOGGING_FILE |
QASE_LOGGING_FILE |
False (True when debug=true) |
No | True, False |
| Qase Report configuration | ||||||
| Driver used for report mode | report.driver |
QASE_REPORT_DRIVER |
QASE_REPORT_DRIVER |
local |
No | local |
| Path to save the report | report.connection.path |
QASE_REPORT_CONNECTION_PATH |
QASE_REPORT_CONNECTION_PATH |
./build/qase-report |
||
| Local report format | report.connection.format |
QASE_REPORT_CONNECTION_FORMAT |
QASE_REPORT_CONNECTION_FORMAT |
json |
json, jsonp |
|
| Qase TestOps configuration | ||||||
| Token for API access | testops.api.token |
QASE_TESTOPS_API_TOKEN |
QASE_TESTOPS_API_TOKEN |
undefined | Yes | Any string |
Qase API host. For enterprise users, specify address: example.qase.io |
testops.api.host |
QASE_TESTOPS_API_HOST |
QASE_TESTOPS_API_HOST |
qase.io |
No | Any string |
| Qase enterprise environment | testops.api.enterprise |
QASE_TESTOPS_API_ENTERPRISE |
QASE_TESTOPS_API_ENTERPRISE |
False |
No | True, False |
| Timeout of a single API request, in seconds | testops.api.timeout |
QASE_TESTOPS_API_TIMEOUT |
QASE_TESTOPS_API_TIMEOUT |
30 |
No | Any positive integer |
| Number of retries for a failed results upload | testops.api.retries |
QASE_TESTOPS_API_RETRIES |
QASE_TESTOPS_API_RETRIES |
3 |
No | 0 or any positive integer |
| Base delay of the exponential retry backoff, in seconds | testops.api.retryBackoff |
QASE_TESTOPS_API_RETRY_BACKOFF |
QASE_TESTOPS_API_RETRY_BACKOFF |
1 |
No | Any positive number |
Code of your project, which you can take from the URL: https://app.qase.io/project/DEMOTR - DEMOTR is the project code |
testops.project |
QASE_TESTOPS_PROJECT |
QASE_TESTOPS_PROJECT |
undefined | Yes | Any string |
| Qase test run ID | testops.run.id |
QASE_TESTOPS_RUN_ID |
QASE_TESTOPS_RUN_ID |
undefined | No | Any integer |
| Qase test run title | testops.run.title |
QASE_TESTOPS_RUN_TITLE |
QASE_TESTOPS_RUN_TITLE |
Automated run <Current date and time> |
No | Any string |
| Qase test run description | testops.run.description |
QASE_TESTOPS_RUN_DESCRIPTION |
QASE_TESTOPS_RUN_DESCRIPTION |
<Framework name> automated run |
No | Any string |
| Qase test run complete | testops.run.complete |
QASE_TESTOPS_RUN_COMPLETE |
QASE_TESTOPS_RUN_COMPLETE |
True |
True, False |
|
| Qase test run tags | testops.run.tags |
QASE_TESTOPS_RUN_TAGS |
QASE_TESTOPS_RUN_TAGS |
[] |
No | Array of strings |
| External link type for test run | testops.run.externalLink.type |
QASE_TESTOPS_RUN_EXTERNAL_LINK_TYPE |
QASE_TESTOPS_RUN_EXTERNAL_LINK_TYPE |
None, don't add external link | No | jiraCloud, jiraServer |
| External link URL for test run | testops.run.externalLink.link |
QASE_TESTOPS_RUN_EXTERNAL_LINK_URL |
QASE_TESTOPS_RUN_EXTERNAL_LINK_URL |
None, don't add external link | No | Any string (e.g., "PROJ-1234") |
| Qase test plan ID | testops.plan.id |
QASE_TESTOPS_PLAN_ID |
QASE_TESTOPS_PLAN_ID |
undefined | No | Any integer |
| Size of batch for sending test results | testops.batch.size |
QASE_TESTOPS_BATCH_SIZE |
QASE_TESTOPS_BATCH_SIZE |
200 |
No | 1–200 |
| Enable defects for failed test cases | testops.defect |
QASE_TESTOPS_DEFECT |
QASE_TESTOPS_DEFECT |
False |
No | True, False |
| Configuration values for test run | testops.configurations.values |
QASE_TESTOPS_CONFIGURATIONS_VALUES |
QASE_TESTOPS_CONFIGURATIONS_VALUES |
[] |
No | Comma-separated key=value pairs |
| Whether to create configuration groups and values if they don't exist | testops.configurations.createIfNotExists |
QASE_TESTOPS_CONFIGURATIONS_CREATE_IF_NOT_EXISTS |
QASE_TESTOPS_CONFIGURATIONS_CREATE_IF_NOT_EXISTS |
False |
No | True, False |
| Filter results by status | testops.statusFilter |
QASE_TESTOPS_STATUS_FILTER |
QASE_TESTOPS_STATUS_FILTER |
None, don't filter any results | No | Comma-separated list of statuses |
| Whether to show public report link after test run completion | testops.showPublicReportLink |
QASE_TESTOPS_SHOW_PUBLIC_REPORT_LINK |
QASE_TESTOPS_SHOW_PUBLIC_REPORT_LINK |
False |
No | True, False |
| Status mapping for test results | statusMapping |
QASE_STATUS_MAPPING |
QASE_STATUS_MAPPING |
None, don't map any statuses | No | JSON object or comma-separated key=value pairs |
Running from a test plan
Setting testops.plan.id creates the test run from an existing test plan, so the
run is scoped to that plan's cases instead of being a standalone run. The plan is
resolved by Qase when the run is created — the reporter still submits results for
whichever tests the framework actually executes.
The option is ignored when testops.run.id is set: an existing run is reused as
is, and no new run is created for the plan to apply to.
Retries and timeouts
Uploading test results is the one call worth retrying, and it is safe to retry because every result carries an id that Qase uses to deduplicate a batch it has already accepted.
A results upload is retried on a transport failure and on HTTP 408, 429 and 5xx,
with an exponential backoff of retryBackoff × 2^(attempt-1). It is not retried
on 400, 401, 403, 404, 413, 422 or 507 — those fail identically on a second
attempt. When a 429 carries a Retry-After header, that value is used instead of
the computed backoff; Qase sends roughly 60 seconds, which a short backoff ladder
would not survive. timeout applies to each attempt, not to the chain as a whole.
Creating and completing a test run is not retried: those calls carry no
idempotency key, so a replay could create a second run. They still honour
timeout.
If a batch cannot be uploaded even after the retries, the reporter logs an error naming how many results were lost and leaves the test run open. A completed run over partial data looks trustworthy and is not.
Example qase.config.json config
{
"mode": "testops",
"fallback": "report",
"debug": false,
"environment": "local",
"logging": {
"console": true,
"file": false
},
"report": {
"driver": "local",
"connection": {
"local": {
"path": "./build/qase-report",
"format": "json"
}
}
},
"testops": {
"api": {
"token": "<token>",
"host": "qase.io",
"timeout": 30,
"retries": 3,
"retryBackoff": 1
},
"run": {
"title": "Regress run",
"description": "Regress run description",
"complete": true,
"tags": ["tag1", "tag2"],
"externalLink": {
"type": "JiraCloud",
"link": "PROJ-1234"
}
},
"plan": {
"id": 123
},
"defect": false,
"showPublicReportLink": false,
"project": "<project_code>",
"batch": {
"size": 100
},
"configurations": {
"values": [
{
"name": "Browser",
"value": "Chrome"
},
{
"name": "Environment",
"value": "Production"
}
],
"createIfNotExists": true
},
"statusFilter": ["passed", "failed"]
},
"statusMapping": {
"invalid": "failed",
"skipped": "passed"
}
}
Logging Configuration
Control logging output with the logging option:
Disable console output (only log to file):
{
"debug": true,
"logging": {
"console": false
}
}
Disable all logging:
{
"logging": {
"console": false,
"file": false
}
}
Environment variables:
QASE_LOGGING_CONSOLE- enable/disable console output (default: true)QASE_LOGGING_FILE- enable/disable file output (default: false, true when debug=true)
Note: Log level is controlled by the debug parameter:
debug: true- Debug level (detailed logs)debug: false- Information level (standard logs)
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- AspectInjector (>= 2.8.2)
- Microsoft.Extensions.Http.Polly (>= 5.0.1)
- Qase.ApiClient.V1 (>= 1.1.27)
- Qase.ApiClient.V2 (>= 1.1.27)
- Serilog (>= 4.3.0)
- Serilog.Extensions.Logging (>= 9.0.2)
- Serilog.Sinks.Console (>= 6.1.1)
- Serilog.Sinks.File (>= 7.0.0)
NuGet packages (5)
Showing the top 5 NuGet packages that depend on Qase.Csharp.Commons:
| Package | Downloads |
|---|---|
|
Qase.XUnit.Reporter
xUnit Integration with Qase TMS |
|
|
Qase.NUnit.Reporter
NUnit Integration with Qase TMS |
|
|
Qase.XUnit.V3.Reporter
xUnit v3 Integration with Qase TMS |
|
|
Qase.MSTest.Reporter
MSTest Integration with Qase TMS |
|
|
Qase.Reqnroll.Reporter
Reqnroll Integration with Qase TMS |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.1.27 | 153 | 9/2/2026 |
| 1.1.26 | 213 | 8/27/2026 |
| 1.1.25 | 226 | 8/25/2026 |
| 1.1.24 | 262 | 8/17/2026 |
| 1.1.23 | 250 | 8/11/2026 |
| 1.1.22 | 484 | 7/7/2026 |
| 1.1.21 | 435 | 6/29/2026 |
| 1.1.20 | 448 | 6/25/2026 |
| 1.1.19 | 585 | 6/10/2026 |
| 1.1.18 | 3,459 | 4/23/2026 |
| 1.1.17 | 304 | 4/21/2026 |
| 1.1.16 | 533 | 4/14/2026 |
| 1.1.15 | 290 | 4/7/2026 |
| 1.1.14 | 288 | 4/7/2026 |
| 1.1.13 | 286 | 4/2/2026 |
| 1.1.12 | 238 | 3/26/2026 |
| 1.1.11 | 436 | 3/25/2026 |
| 1.1.10 | 243 | 3/25/2026 |
| 1.1.9 | 330 | 3/18/2026 |
| 1.1.8 | 1,556 | 3/11/2026 |