DemaConsulting.TestResults
1.7.0
Prefix Reserved
dotnet add package DemaConsulting.TestResults --version 1.7.0
NuGet\Install-Package DemaConsulting.TestResults -Version 1.7.0
<PackageReference Include="DemaConsulting.TestResults" Version="1.7.0" />
<PackageVersion Include="DemaConsulting.TestResults" Version="1.7.0" />
<PackageReference Include="DemaConsulting.TestResults" />
paket add DemaConsulting.TestResults --version 1.7.0
#r "nuget: DemaConsulting.TestResults, 1.7.0"
#:package DemaConsulting.TestResults@1.7.0
#addin nuget:?package=DemaConsulting.TestResults&version=1.7.0
#tool nuget:?package=DemaConsulting.TestResults&version=1.7.0
TestResults Library
A lightweight C# library for programmatically creating test result files in TRX and JUnit formats.
Features
- âĻ Simple API - Intuitive and easy-to-use object model
- ðŊ Type-Safe - Strongly-typed C# classes for test results
- ðŠķ Lightweight - Minimal external dependencies
- ð Multi-Target - Supports .NET 8, 9, and 10
- ðĶ NuGet Ready - Easy integration via NuGet package
- ð Multiple Formats - Supports both TRX and JUnit XML formats
- â Compatible - Works with Visual Studio, Azure DevOps, and CI/CD systems
- ð Continuous Compliance - Compliance evidence generated automatically on every CI run, following the Continuous Compliance methodology
Installation
Install via NuGet Package Manager:
dotnet add package DemaConsulting.TestResults
Or via Package Manager Console:
Install-Package DemaConsulting.TestResults
Quick Start
Creating Test Result Files
The following code-snippet shows how to create test result files in both TRX and JUnit XML formats:
using DemaConsulting.TestResults;
using DemaConsulting.TestResults.IO;
// Create a TestResults instance
var results = new TestResults { Name = "SomeTests" };
// Add some results
results.Results.Add(
new TestResult
{
Name = "Test1",
ClassName = "SomeTestClass",
CodeBase = "MyTestAssembly",
Outcome = TestOutcome.Passed,
Duration = TimeSpan.FromSeconds(1.5),
StartTime = DateTime.UtcNow
});
results.Results.Add(
new TestResult
{
Name = "Test2",
ClassName = "SomeTestClass",
CodeBase = "MyTestAssembly",
Outcome = TestOutcome.Failed,
ErrorMessage = "Expected value to be 42 but was 0",
ErrorStackTrace = "at SomeTestClass.Test2() in Test.cs:line 15"
});
// Save the results to a TRX file (Visual Studio format)
File.WriteAllText("results.trx", TrxSerializer.Serialize(results));
// Save the results to a JUnit XML file
File.WriteAllText("results.xml", JUnitSerializer.Serialize(results));
Automatic Format Detection
The library can automatically detect the format of test result files:
using DemaConsulting.TestResults.IO;
// Automatically detect and deserialize any supported format
var testResultsXml = File.ReadAllText("test-results.xml");
var results = Serializer.Deserialize(testResultsXml);
// Or identify the format without deserializing
var format = Serializer.Identify(testResultsXml);
if (format == TestResultFormat.Trx)
{
Console.WriteLine("This is a TRX file");
}
else if (format == TestResultFormat.JUnit)
{
Console.WriteLine("This is a JUnit XML file");
}
Converting Between Formats
The library supports reading and converting between TRX and JUnit formats:
using DemaConsulting.TestResults.IO;
// Automatic format detection and conversion
var testResultsXml = File.ReadAllText("test-results.xml");
var results = Serializer.Deserialize(testResultsXml); // Works with TRX or JUnit
var trxXml = TrxSerializer.Serialize(results);
File.WriteAllText("converted.trx", trxXml);
// Or use specific deserializers if format is known
var junitXml = File.ReadAllText("junit-results.xml");
var results2 = JUnitSerializer.Deserialize(junitXml);
var trxXml2 = TrxSerializer.Serialize(results2);
File.WriteAllText("converted-from-junit.trx", trxXml2);
Advanced Usage
Capturing Standard Output
var result = new TestResult
{
Name = "TestWithOutput",
ClassName = "MyTests",
CodeBase = "MyAssembly",
Outcome = TestOutcome.Passed,
SystemOutput = "Debug information\nTest completed successfully"
};
Handling Test Failures
var failedResult = new TestResult
{
Name = "FailingTest",
ClassName = "MyTests",
CodeBase = "MyAssembly",
Outcome = TestOutcome.Failed,
ErrorMessage = "Assertion failed: Expected 100, got 50",
ErrorStackTrace = "at MyTests.FailingTest() in Tests.cs:line 42",
SystemError = "Additional error details"
};
Test Outcomes
The library supports the following test outcomes:
Successful Outcomes:
Passed- Test passed successfullyPassedButRunAborted- Test passed but the run was abortedWarning- Test passed with warningsCompleted- Test completed successfully
Failure Outcomes:
Failed- Test failedError- Test encountered an errorTimeout- Test exceeded timeout limitAborted- Test was aborted
Skipped/Not Run Outcomes:
NotExecuted- Test was not executedNotRunnable- Test is not runnablePending- Test is pending execution
Other Outcomes:
Inconclusive- Test result was inconclusiveDisconnected- Test was disconnectedInProgress- Test is currently in progress
The TestOutcome enum also provides helper extension methods:
IsPassed()- Returns true for passed outcomes (Passed, PassedButRunAborted, Warning)IsFailed()- Returns true for failed outcomes (Failed, Error, Timeout, Aborted)IsExecuted()- Returns true if the test was executed
Use Cases
This library is useful when you need to:
- Generate TRX or JUnit XML files from custom test runners
- Convert test results between formats (TRX â JUnit)
- Create test reports programmatically
- Aggregate test results from multiple sources
- Build custom testing tools that integrate with Visual Studio, Azure DevOps, or CI/CD systems
Documentation
- Architecture - Learn about the library's architecture and design
- Contributing - Guidelines for contributing to the project
- Code of Conduct - Our code of conduct for contributors
Building from Source
# Clone the repository
git clone https://github.com/demaconsulting/TestResults.git
cd TestResults
# Restore tools
dotnet tool restore
# Restore dependencies
dotnet restore
# Build
dotnet build
# Run tests
dotnet test
Helper Scripts
For convenience, the repository includes helper scripts to streamline development:
Windows:
# Build and test the project
build.bat
# Run code formatting, spelling, and markdown checks
lint.bat
Linux/macOS:
# Build and test the project
./build.sh
# Run code formatting, spelling, and markdown checks
./lint.sh
Visual Studio Code:
If you're using VS Code, preconfigured tasks are available via Ctrl+Shift+B (Windows/Linux) or Cmd+Shift+B (macOS):
build- Build the solution (default build task)test- Run all tests (default test task)clean- Clean build artifactsrestore- Restore NuGet packageslint- Check code formattingformat- Auto-format code
Requirements
- .NET 8.0, 9.0, or 10.0
Contributing
We welcome contributions! Please see our Contributing Guide for details.
License
This project is licensed under the MIT License - see the LICENSE file for details.
By contributing to this project, you agree that your contributions will be licensed under the MIT License.
Support
- ð Report a Bug
- ðĄ Request a Feature
- ðŽ Ask a Question
Acknowledgments
Developed and maintained by DEMA Consulting.
| 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 is compatible. 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 is compatible. 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 is compatible. 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
- No dependencies.
-
net10.0
- No dependencies.
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.