CsabaDu.DynamicTestData
2.0.10-beta
See the version list below for details.
dotnet add package CsabaDu.DynamicTestData --version 2.0.10-beta
NuGet\Install-Package CsabaDu.DynamicTestData -Version 2.0.10-beta
<PackageReference Include="CsabaDu.DynamicTestData" Version="2.0.10-beta" />
<PackageVersion Include="CsabaDu.DynamicTestData" Version="2.0.10-beta" />
<PackageReference Include="CsabaDu.DynamicTestData" />
paket add CsabaDu.DynamicTestData --version 2.0.10-beta
#r "nuget: CsabaDu.DynamicTestData, 2.0.10-beta"
#:package CsabaDu.DynamicTestData@2.0.10-beta
#addin nuget:?package=CsabaDu.DynamicTestData&version=2.0.10-beta&prerelease
#tool nuget:?package=CsabaDu.DynamicTestData&version=2.0.10-beta&prerelease
CsabaDu.DynamicTestData
🎯 A robust, flexible, extensible, pure .NET framework to facilitate dynamic data-driven testing.
- ⚙️ Test data conversion, management and provisioning
- ⛑️ Type-safe and thread-safe support for MSTest, NUnit, xUnit, xUnit.v3
- 🧩 Modular design, abstractions and ready-to-use integrations
- 💼 Portable data sources
- 📋 Traceable descriptive display names
- 💵 Now seeking sponsors to complete v2.0 – comprehensive testing, documentation, examples, and new features!
📖 Documentation
This README contains the base info and the current version related notes.
Visit the Wiki for full documentation, including
📘 Table of Contents
- Version 2.0.0-beta Foreword
- Migration Guide (Under Construction)
- Changelog
- Contributing
- License
- Contact
- FAQ
- Troubleshooting
Version 2.0.0-beta Foreword
The CsabaDu.DynamicTestData framework has undergone a major transformation in version 2.0.0-beta, introducing a wide range of enhancements while preserving its original foundation.
The core components from the 1.x.x series — particularly the TestDataTypes.* namespaces and the DynamicDataSource class — remain central to the framework. However, even these familiar types have received small but breaking changes to align with the new architecture.
This release introduces powerful new capabilities:
- Test data conversion to any type of test data row
- Data row management for structured and reusable test inputs
- Flexible data provisioning to test methods across frameworks
These features make the framework easier to use, more adaptable to diverse testing needs, and better suited for integration with MSTest, NUnit, xUnit, and beyond. The newly introduced interfaces and abstract classes are designed for extensibility, allowing developers to support custom types and framework-specific features while staying aligned with the CsabaDu.DynamicTestData ecosystem.
The architecture is clean, the codebase is modular, and many features have been partially tested. The documentation provides detailed insights into the design, types, and usage patterns. However, this version is still considered beta due to:
- Incomplete test coverage
- Missing documentation sections (e.g., migration guide from v1.x.x)
Final Notes
This version is beta, meaning:
- Features are stable but may change
- Some features are only partially tested
- Documentation is detailed, but incomplete
- Feedback and support is highly appreciated
Migration Guide (Under Construction)
If you're upgrading from an earlier version of CsabaDu.DynamicTestData, please note:
⚠️ Compatibility is broken, even though the structure of your data source methods may remain similar to current requirements.
What May Stay the Same
- The structure of your data source methods (e.g. method body, return types) may still align with the new framework.
- However, due to namespace, naming, and parameter changes, existing implementations will not work without updates.
Required Changes
To ensure compatibility with the latest version (incomplete list):
- Namespace updates
ArgsCodemoved fromDynamicDataSources→Statics
- Renamed members
TestData.TestCase→TestData.TestCaseNameTestDataToArgs(...)→TestDataToParams(...)
- Signature changes
DynamicDataSourceconstructor now requires two parameters:ArgsCode argsCode, PropsCode propsCode- parameter where
bool? withExpectedwas used → replace withPropsCode propsCode
What to Do
- Update your test classes and data source references accordingly.
- Review the Changelog for a complete list of changes.
- Explore the Types section for detailed feature descriptions.
A full migration guide is on the way.
In the meantime, feel free to reach out or open an issue if you need help.
Changelog
Version 2.0.0-beta (2025-08-12)
This is a beta release introducing breaking changes, new features, and architectural enhancements to the
CsabaDu.DynamicTestDatalibrary. These updates improve usability, flexibility, and extensibility across supported test frameworks.
Changed
This section summarizes changes to existing types introduced in this release. For details of the updated members and their current definitions, see the Types section.
Statics
| Type | Modified Member | Change | Current Member |
|---|---|---|---|
Extensions |
static PropsCode Defined(this PropsCode, string) |
New | Extensions.Defined(...) |
static InvalidEnumArgumentException GetInvalidEnumArgumentException(this PropsCode, string) |
New | Extensions.GetInvalidEnumArgumentException(...) |
TestDataTypes.Interfaces
| Type | Modified Member | Change | Current Member |
|---|---|---|---|
ITestCaseName |
string TestCase { get; } |
Shifted to ITestData<TResult> and renamed |
ITestData<TResult>.TestCaseName |
string GetTestCaseName() |
New member | ITestCaseName.GetTestCaseName() |
|
ITestData |
string ExitMode { get; }, string Result { get; }, object?[] PropertiesToArgs(bool) |
Cancelled | - |
object?[] ToParams(ArgsCode, bool) |
Signature changed: bool → PropsCode |
ToParams(ArgsCode, PropsCode) |
TestDataTypes
| Type | Modified Member | Change | Current Member |
|---|---|---|---|
TestData |
string TestCase { get; } |
Renamed to TestCaseName |
TestData.TestCaseName |
ExitMode, Result, PropertiesToArgs(bool) |
Cancelled | - | |
ToParams(ArgsCode, bool) |
Signature changed: bool → PropsCode |
ToParams(ArgsCode, PropsCode) |
DynamicDataSources
| Type | Modified Member | Change | Current Member |
|---|---|---|---|
ArgsCode |
- | Shifted to namespace Statics |
Statics.ArgsCode |
DynamicDataSource |
ArgsCode, PropsCode |
Refactored and exposed via IDataStrategy |
IDataStrategy.ArgsCode, PropsCode |
DynamicDataSource(ArgsCode) (constructor) |
Signature changed (PropsCode added) |
DynamicDataSource(ArgsCode, PropsCode |
|
GetDisplayName(...), TestDataToParams(...) |
Shifted to TestDataFactory, signature changed |
TestDataFactory.GetDisplayName(...), TestDataToParams(...) |
|
OptionalToArgs(...), WithOptionalArgsCode(...) |
Cancelled / Refactored | - / WithOptionalArgsCode<T>(...) |
|
TestDataToArgs<T...>, TestDataReturnsToArgs<T...>, TestDataThrowsToArgs<T...> |
Renamed, made protected, non-static |
TestDataToParams<T...>, TestDataReturnsToParam<T...>, TestDataThrowsToParam<T...> |
Added
This section lists newly introduced namespaces and types. For full details, see the Types section.
New Types
Staticsenum PropsCode
TestDataTypesstatic TestDataFactory
DynamicDataSourcesBase classes
DynamicDataSource<TDataHolder>DynamicDataRowSource<TDataRowHolder, TRow>DynamicDataRowSource<TRow>
Specialized base classes
DynamicObjectArraySourceDynamicObjectArrayRowSourceDynamicExpectedObjectArrayRowSourceDynamicNamedDataRowSource<TRow>
- New namespaces -
DataStrategyTypes.InterfacesIDataStrategy
DataStrategyTypessealed record DataStrategy
TestDataRows.InterfacesITestDataRow,ITestDataRow<TRow>,ITestDataRow<TRow, TTestData>INamedTestDataRow<TRow>
TestDataRowsBase classes
TestDataRow<TRow>TestDataRow<TRow, TTestData>
Concrete implementation
ObjectArrayRow<TTestData>
DataRowHolders.InterfacesIDataRowHolder,IDataRowHolder<TRow>,IDataRowHolder<TRow, TTestData>ITestDataRowFactory<TRow, TTestData>IAddTestData<TTestData>ITestDataRowsIRows<TRow>,INamedRows<TRow>INamedDataRowHolder<TRow>
DataRowHoldersBase classes
DataRowHolder<TRow>DataRowHolder<TRow, TTestData>
Specialized base class
NamedDataRowHolder<TRow, TTestData>
Concrete implementation
ObjectArrayRowHolder<TTestData>
Version 2.0.6-beta (2025-08-26)
- Removed:
DataRowHolder<TRow>: Constructors removed:private protected DataRowHolder(ITestData, IDataStrategy)private protected DataRowHolder(IDataRowHolder, IDataStrategy)
- Changed:
DataRowHolder<TRow>: ConstructorDataRowHolder(IDataStrategy)made primary consructor.DataRowHolder<TRow, TTestData>: constructors inherit fromDataRowHolder<TRow>primary constructor.
- Note:
- This update may break backward-compatibility with previous versions (low probability).
Version 2.0.7-beta (2025-09-02)
- Removed:
DynamicDataSource<TDataHolder>: Methods removed (shifted toDynamicDataRowSource<TDataRowHolder>):protected void Add<T1, T2, ..., T9>(string, string expected, T1?, T2?, ..., T9?),protected void AddReturns<TStruct, T1, T2, ..., T9>(string, string expected, T1?, T2?, ..., T9?),protected void AddThrows<TException, T1, T2, ..., T9>(string, string expected, T1?, T2?, ..., T9?),protected abstract void Add<TTestData>(TTestData),protected abstract void InitDataHolder<TTestData>(TTestData).
- Added:
DynamicDataRowSource<TDataRowHolder>: Methods added (shifted fromDynamicDataSource<TDataHolder>):protected void Add<T1, T2, ..., T9>(string, string expected, T1?, T2?, ..., T9?),protected void AddReturns<TStruct, T1, T2, ..., T9>(string, string expected, T1?, T2?, ..., T9?),protected void AddThrows<TException, T1, T2, ..., T9>(string, string expected, T1?, T2?, ..., T9?),protected abstract void InitDataHolder<TTestData>(TTestData).
- Changed:
DynamicDataRowSource<TDataRowHolder>: :protected override void Add<TTestData>(TTestData)made virtual.
- Note:
- This update may break backward-compatibility with previous versions (low probability).
Version 2.0.8-beta (2025-09-04)
- Added:
DynamicDataSource<TDataHolder>:protected abstract void Add<TTestData>(TTestData)
- Changed:
DynamicDataRowSource<TDataRowHolder>:protected abstract void Add<TTestData>(TTestData)made virtual.
- Note:
- This update may break backward-compatibility with previous versions (low probability).
Version 2.0.9-beta (2025-09-18)
- Added:
DynamicDataSources.DynamicExpectedObjectArraySource(ArgsCode argsCode) : DynamicObjectArraySource(argsCode, PropsCode.Expected)abstract class added to simplify creating data sources without testcase name when usingArgsCode.Properies.
Version 2.0.10-beta (2025-09-20)
- Added:
TestDataRows.NamedTestDataRow<TRow, TTestData>abstract class added.
Version 1.6.0 (2025-05-22)
- Added:
ITestCase : IEquatable<ITestCase>added to segregate thestring TestCaseproperty of the inheritedITestDatainterface, and to make the equality of twoITestCaseinstances comparable, based on theirTestCaseproperty.static object?[] TestDataToParams([NotNull] ITestData testData, ArgsCode argsCode, bool withExpected, out string testCaseName)method added to theDynamicDataSourceclass to null-check theITestData testDataparameter and get the value of itsstring TestCaseproperty as out-parameter.
- Updated:
- README.md updated with the new features and other corrections.
- Note:
- This update is backward-compatible with previous versions.
Version 1.6.1 (2025-05-23)
- Changed:
- Static
TestData.PropertiesToArgs(TestData?, bool)refactored.
- Static
- Updated:
- README.md updates and corrections.
Version v1.6.2 (2025-05-30)
- Changed
- Former
ITestCaseinterface renamed toITestCaseNameto avoid interference with interfaces of other frameworks havingITestCasenamed interface.
- Former
- Updated
- README.md updated.
- Note
- If you used
ITestCaseinterface in your code yet, you should update these names for compatibility purposes.
- If you used
Version 1.5.0 (2025-05.17)
- Added:
object?[] ToParams(ArgsCode argsCode, bool withExpected)method added to theITestDatainterface to simpplify converting theTestDatainstance to a test framework defined test data type.- New
IExpectedinterface withobject GetExpected()method, which is inherited byITestDataReturnsandITestDataThrowsinterfaces to enhance extensibility with accessing theExpectedproperty value of the derived genericTestDataReturns<>orTestDataThrows<>instances from the non-generic marker interface type.
- Updated:
- README.md updated with the new features.
- Note:
- This update is backward-compatible with previous versions.
Version 1.5.1 (2025-05-17)
- Updated:
- README.md corrections.
Version 1.5.2 (2025-05-19)
- Added:
- Parameter checking of
DynamicDataSource.GetDisplayName(string testMethodName, object?[] args)extended to parameterargs.
- Parameter checking of
- Updated:
- README.md update and corrections.
Version 1.5.3 (2025-05-19)
- Updated:
DynamicDataSource.GetDisplayName(string testMethodName, object?[] args)method simplified.- README.md update and corrections.
Version 1.4.0 (2025-05.16)
- Added:
PropertiesToArgsmethod added to the ITestData interface to generate an object array with the test parameters only.
- Updated:
- README.md updated with the new feature.
- README.md corrected the meaning of the behavior of
structconstraint for theTStructtype parameter ofITestDataReturns<TStruct>instances.
- Note:
- This update is backward-compatible with previous versions.
Version 1.3.0 (2025-05-06)
- Added:
ITestDataReturnsandITestDataThrowsbase marker interfaces.
- Updated:
- README.md updated and Abstract
DynamicDataSourceClass section corrected.
- README.md updated and Abstract
- Note:
- This update is backward-compatible with previous versions.
Version 1.3.1 (2025-05-08)
- Changed:
TestDatarefactored.
- Updated:
- README.md corrections and visual refactorings.
Version 1.2.0 (2025-03-28)
- Added:
- protected static generic
WithOptionalArgsCode<>methods to theDynamicDataSourceclass to support the extension of using the optionalArgsCode?parameter in the derived data source classes.
- protected static generic
- Changed:
OptionalToArgsmethod to call aWithOptionalArgsCode<>method.protected DynamicDataSource.tempArgsCodeback toprivate DynamicDataSource._tempArgsCode.
- Updated:
- README.md and fixed navigation anchors with simplification.
- Note: This update is backward-compatible with previous versions.
Version 1.2.1 (2025-04-02)
- Added:
- Internal test helper const string.
- Updated:
- README.md descriptoon of
WithOptionalArgsCode<>methods in the How it Works section. - Small README.md corrections and visual refactorings.
- README.md descriptoon of
Version 1.2.2 (2025-04-10)
- Changed:
TestDatarefactored:ExitModeandResultproperties are initialized in the constructor signature.TestDataReturnsandTestDataThrowsfollow this change.
Version 1.2.3 (2025-04-10)
- Updated:
- README.md Abstract
DynamicDataSourceClass section corrected.
- README.md Abstract
Version 1.1.0 (2025-03-27)
- Added:
OptionalToArgsmethod added to theDynamicDataSourceclass.DisposableMementoprivate class added to theDynamicDataSourceclass.ArgsCodeproperty behavior of theDynamicDataSourceclass changed.
- Note: This update is backward-compatible with previous versions.
Version 1.1.1 (2025-03-27)
- Changed:
private DynamicDataSource._tempArgsCodetoprotected DynamicDataSource.tempArgsCode, to allow for easier extension of the DynamicDataSource class.
- Updated:
- README.md and fixed navigation anchors.
Version 1.0.0 (2025-02-09)
- Initial release of the
CsabaDu.DynamicTestDataframework. - Includes the
ITestDatageneric interface types,TestDatarecord types,DynamicDataSourcebase class, andArgsCodeenum. - Provides support for dynamic data-driven tests with multiple arguments, expected not null `ValueType' results, and exceptions.
License
This project is licensed under the MIT License. See the License file for details.
Contact
For any questions or inquiries, please contact CsabaDu.
FAQ
Can I install
IXunitSerializableorIXunitSerializer(xUnit.v3) interfaces to support usingTestDatatypes in xUnit tests? No, you cannot install these interfaces becauseTestDatatypes are open-generic ones, and don't have parameterless constructors. Although, you can generate object array of xUnit-serializable parameters to use them inTheoryDatatype data sources. Besides, if your tests don't have to comply with xUnit-serializability, you can useTestDatatypes in xUnit tests well.Can I use the earlier implemented data source and test classes with version 1.1.0 ? Yes, you can seamlessly use the already installed classes with the upgraded v1.1.0 of
CsabaDu.DynamicTestDatawithout the need of any change in your code. Besides, you can easily modify those to enjoy the benefits of the flexibility of this version.
Troubleshooting
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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 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. |
-
net9.0
- No dependencies.
NuGet packages (3)
Showing the top 3 NuGet packages that depend on CsabaDu.DynamicTestData:
| Package | Downloads |
|---|---|
|
CsabaDu.DynamicTestData.NUnit
An extension of CsabaDu.DynamicTestData framework to facilitate dynamic data-driven testing in NUnit. |
|
|
CsabaDu.DynamicTestData.xUnit
An extension of CsabaDu.DynamicTestData framework to facilitate dynamic data-driven testing in xUnit. |
|
|
CsabaDu.DynamicTestData.xUnit.v3
An extension of CsabaDu.DynamicTestData framework to facilitate dynamic data-driven testing in xUnit.v3. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated | |
|---|---|---|---|
| 2.1.0-beta | 176 | 10/29/2025 | |
| 2.0.10-beta | 194 | 9/20/2025 | |
| 2.0.9-beta | 294 | 9/18/2025 | |
| 2.0.8-beta | 193 | 9/4/2025 | |
| 2.0.7-beta | 170 | 9/2/2025 | |
| 2.0.6-beta | 262 | 8/26/2025 | |
| 2.0.5-beta | 301 | 8/25/2025 | |
| 2.0.4-beta | 165 | 8/20/2025 | |
| 2.0.3-beta | 164 | 8/18/2025 | |
| 2.0.2-beta | 159 | 8/15/2025 | |
| 2.0.1-beta | 173 | 8/13/2025 | |
| 2.0.0-beta | 171 | 8/12/2025 | |
| 1.6.2 | 538 | 5/30/2025 | |
| 1.6.1 | 183 | 5/23/2025 | |
| 1.6.0 | 228 | 5/22/2025 | |
| 1.5.3 | 215 | 5/19/2025 | |
| 1.5.2 | 205 | 5/19/2025 | |
| 1.5.1 | 144 | 5/17/2025 | |
| 1.5.0 | 177 | 5/17/2025 | |
| 1.4.0 | 250 | 5/16/2025 | |
| 1.3.1 | 207 | 5/8/2025 | |
| 1.3.0 | 198 | 5/6/2025 | |
| 1.2.3 | 319 | 4/10/2025 | |
| 1.2.2 | 201 | 4/10/2025 | |
| 1.2.1 | 201 | 4/2/2025 | |
| 1.2.0 | 245 | 3/28/2025 | |
| 1.1.1 | 199 | 3/27/2025 | |
| 1.1.0 | 168 | 3/27/2025 | |
| 1.0.17 | 245 | 3/19/2025 | |
| 1.0.16 | 293 | 3/19/2025 | |
| 1.0.15 | 202 | 3/15/2025 | |
| 1.0.14 | 242 | 3/13/2025 | |
| 1.0.13 | 295 | 3/8/2025 | |
| 1.0.12 | 349 | 3/5/2025 | |
| 1.0.11 | 224 | 2/27/2025 | |
| 1.0.10 | 798 | 2/22/2025 | |
| 1.0.9 | 138 | 2/21/2025 | |
| 1.0.8 | 149 | 2/21/2025 | |
| 1.0.7 | 151 | 2/21/2025 | |
| 1.0.6 | 177 | 2/19/2025 | |
| 1.0.5 | 148 | 2/18/2025 | |
| 1.0.4 | 161 | 2/18/2025 | |
| 1.0.3 | 143 | 2/17/2025 | |
| 1.0.2 | 150 | 2/17/2025 | |
| 1.0.1 | 211 | 2/15/2025 | |
| 1.0.0 | 157 | 2/14/2025 |
- `NamedTestDataRow` abstract class added.
- README.md updated.

