Add comprehensive README for test project
Co-authored-by: omegaleo <5655201+omegaleo@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
# OmegaLeo.HelperLib.Tests
|
||||
|
||||
Comprehensive test suite for the OmegaLeo.HelperLib library.
|
||||
|
||||
## Overview
|
||||
|
||||
This project contains xUnit tests that validate the functionality of the HelperLib library. The tests run automatically in CI/CD pipelines to catch errors before they reach production.
|
||||
|
||||
## Test Coverage
|
||||
|
||||
### Extension Methods
|
||||
|
||||
#### MathExtensions (8 tests)
|
||||
- `AverageWithNullValidation` for int, double, and float types
|
||||
- Empty list handling
|
||||
- Single value handling
|
||||
- Negative value handling
|
||||
|
||||
#### IListExtensions (14 tests)
|
||||
- `Swap` - by indices and by items
|
||||
- `Replace` - existing and non-existing items
|
||||
- `Random` - single element and multiple elements
|
||||
- `Shuffle` - list randomization
|
||||
- Edge cases (empty lists, invalid parameters)
|
||||
|
||||
### Helper Utilities
|
||||
|
||||
#### BenchmarkUtility (8 tests)
|
||||
- `Record` - execution time measurement
|
||||
- `RecordAndSaveToResults` - saved benchmarks
|
||||
- `Start` / `Stop` - manual timing
|
||||
- `ClearResults` - cleanup functionality
|
||||
- `GetResults` / `GetAllResults` - result retrieval
|
||||
|
||||
### Models
|
||||
|
||||
#### NeoDictionary (12 tests)
|
||||
- `Add` and `TryGetValue` operations
|
||||
- `TryGetValueFromIndex` - indexed access
|
||||
- `ToDictionary` - conversion to standard Dictionary
|
||||
- LINQ operations (`Any`, `Where`, `FirstOrDefault`, `LastOrDefault`)
|
||||
- `AddRange` - bulk operations
|
||||
- `Count` - size queries
|
||||
|
||||
## Running Tests
|
||||
|
||||
### Run all tests
|
||||
```bash
|
||||
dotnet test
|
||||
```
|
||||
|
||||
### Run tests for a specific project
|
||||
```bash
|
||||
dotnet test OmegaLeo.HelperLib.Tests/OmegaLeo.HelperLib.Tests.csproj
|
||||
```
|
||||
|
||||
### Run tests with detailed output
|
||||
```bash
|
||||
dotnet test --verbosity normal
|
||||
```
|
||||
|
||||
### Run tests with code coverage
|
||||
```bash
|
||||
dotnet test --collect:"XPlat Code Coverage"
|
||||
```
|
||||
|
||||
## Test Structure
|
||||
|
||||
Tests are organized by the area of code they test:
|
||||
|
||||
```
|
||||
OmegaLeo.HelperLib.Tests/
|
||||
├── Extensions/
|
||||
│ ├── MathExtensionsTests.cs
|
||||
│ └── IListExtensionsTests.cs
|
||||
├── Helpers/
|
||||
│ └── BenchmarkUtilityTests.cs
|
||||
└── Models/
|
||||
└── NeoDictionaryTests.cs
|
||||
```
|
||||
|
||||
## Writing New Tests
|
||||
|
||||
When adding new functionality to the library, follow these guidelines:
|
||||
|
||||
1. **Create tests first** (TDD approach recommended)
|
||||
2. **Use descriptive test names** following the pattern: `MethodName_Scenario_ExpectedResult`
|
||||
3. **Follow the AAA pattern**:
|
||||
- **Arrange**: Set up test data
|
||||
- **Act**: Execute the method being tested
|
||||
- **Assert**: Verify the results
|
||||
4. **Test edge cases**: empty collections, null values, boundary conditions
|
||||
5. **Test error conditions**: ensure exceptions are thrown when expected
|
||||
|
||||
### Example Test Structure
|
||||
|
||||
```csharp
|
||||
[Fact]
|
||||
public void MethodName_Scenario_ExpectedResult()
|
||||
{
|
||||
// Arrange
|
||||
var input = new List<int> { 1, 2, 3 };
|
||||
|
||||
// Act
|
||||
var result = input.MyExtensionMethod();
|
||||
|
||||
// Assert
|
||||
Assert.Equal(expectedValue, result);
|
||||
}
|
||||
```
|
||||
|
||||
## Continuous Integration
|
||||
|
||||
Tests run automatically on:
|
||||
- **Pull Requests** to the main branch
|
||||
- **Pushes** to the main branch
|
||||
|
||||
The CI workflow (`.github/workflows/dotnet.yml`) is configured to:
|
||||
1. Restore dependencies
|
||||
2. Build the solution
|
||||
3. Run all tests
|
||||
4. Report results
|
||||
|
||||
Pull requests must pass all tests before they can be merged.
|
||||
|
||||
## Test Frameworks and Tools
|
||||
|
||||
- **xUnit** - Testing framework
|
||||
- **coverlet.collector** - Code coverage collection
|
||||
- **Microsoft.NET.Test.Sdk** - Test SDK
|
||||
|
||||
## Current Test Status
|
||||
|
||||
✅ **42 tests passing**
|
||||
- MathExtensions: 8 tests
|
||||
- IListExtensions: 14 tests
|
||||
- BenchmarkUtility: 8 tests
|
||||
- NeoDictionary: 12 tests
|
||||
|
||||
## Contributing
|
||||
|
||||
When contributing to this project:
|
||||
|
||||
1. Ensure all existing tests pass
|
||||
2. Add tests for any new functionality
|
||||
3. Maintain at least the current level of code coverage
|
||||
4. Follow the existing test naming and structure conventions
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Tests fail locally but pass in CI
|
||||
- Ensure you're using .NET 8.0 SDK
|
||||
- Run `dotnet restore` to update dependencies
|
||||
- Clear bin/obj folders and rebuild
|
||||
|
||||
### Tests pass locally but fail in CI
|
||||
- Check for environment-specific assumptions
|
||||
- Ensure tests are deterministic (not dependent on timing, randomness, etc.)
|
||||
- Review test output logs in the CI workflow
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [Main Library README](../README.md)
|
||||
- [Contributing Guidelines](../CONTRIBUTING.md)
|
||||
- [CI Workflow](.github/workflows/dotnet.yml)
|
||||
Reference in New Issue
Block a user