This repository provides a starter template for new C# projects.
- DotnetStarter.Logic - is a DLL project for business logic
- DotnetStarter.Logic.Tests - is the corresponding xUnit test project, configured with static code rules allowing underscores in test names (GlobalSuppressions.cs)
To compile, test and run this project the latest .NET Core SDK is required on your machine. For calculating code metrics I recommend metrix++. This requires python.
If you are interested in test coverage, then you'll need the following tools installed:
dotnet tool install --global coverlet.console --configfile NuGet-OfficialOnly.config
dotnet tool install --global dotnet-reportgenerator-globaltool --configfile NuGet-OfficialOnly.config
Run the following commands from the folder containing the .sln
file in order to build and test.
dotnet build
dotnet test
# If you like continuous testing then use the dotnet file watcher to trigger your tests
dotnet watch --project ./DotnetStarter.Logic.Tests test
# As an alternative, run the tests with coverage and produce a coverage report
rm -r DotnetStarter.Logic.Tests/TestResults && \
dotnet test --no-restore --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput='./TestResults/coverage.cobertura.xml' && \
reportgenerator "-reports:DotnetStarter.Logic.Tests/TestResults/*.xml" "-targetdir:report" "-reporttypes:Html;lcov" "-title:DotnetStarter"
open report/index.html
dotnet format
... check code metrics using metrix++
-
Configure the location of the cloned metrix++ scripts
export METRIXPP=/path/to/metrixplusplus
-
Collect metrics
python "$METRIXPP/metrix++.py" collect --std.code.complexity.cyclomatic --std.code.lines.code --std.code.todo.comments --std.code.maintindex.simple -- .
-
Get an overview
python "$METRIXPP/metrix++.py" view --db-file=./metrixpp.db
-
Apply thresholds
python "$METRIXPP/metrix++.py" limit --db-file=./metrixpp.db --max-limit=std.code.complexity:cyclomatic:5 --max-limit=std.code.lines:code:25:function --max-limit=std.code.todo:comments:0 --max-limit=std.code.mi:simple:1
At the time of writing, I want to stay below the following thresholds:
--max-limit=std.code.complexity:cyclomatic:5
--max-limit=std.code.lines:code:25:function
--max-limit=std.code.todo:comments:0
--max-limit=std.code.mi:simple:1
To detect duplicates I use the CPD Copy Paste Detector tool from the PMD Source Code Analyzer Project.
If you have installed PMD by download & unzip, replace pmd
by ./run.sh
.
The homebrew pmd formula makes the pmd
command globally available.
pmd cpd --minimum-tokens 50 --language cs --files .