docs: revamp README with feature showcase and auto-updating benchmarks#6430
Conversation
Rewrites the README around what TUnit can actually do: hero snippet with real failure output, focused object-diff example, benchmark table vs xUnit/NUnit/MSTest, and sections for mocking, shared fixtures, custom assertions, and the ASP.NET Core/Aspire/Playwright/FsCheck integrations. The benchmark table lives between <!-- benchmarks:start/end --> markers and is regenerated weekly: a new update-readme-benchmarks.js step in the speed-comparison workflow rewrites it from latest.json inside the existing automated benchmark PR.
Not up to standards ⛔🔴 Issues
|
| Category | Results |
|---|---|
| BestPractice | 1 minor |
| CodeStyle | 1 minor |
🟢 Metrics 12 complexity
Metric Results Complexity 12
NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.
Code reviewReviewed the README rewrite, the new Verification performed: cross-checked every API surface shown in the new README snippets against the actual source ( Finding:
await Assert.That(order.Items)
.HasCount(3)
.And.Contains(item => item.Sku == "ABC-123");
Everything else — the benchmark automation script, the workflow wiring ( |
HasCount(int) is [Obsolete]; showcase the recommended Count().IsEqualTo(3) path instead. Chains identically via CollectionCountEqualsAssertion.
'a fraction of a second slower' understates source-gen cost on very large suites (scales with test count). Reworded to 'pay a little up front'.
Property injection lets subclasses inherit shared fixtures without re-threading constructor parameters; note constructor injection still works.
Code review (follow-up)Re-reviewed after the four fixup commits. Diff scope: Previously flagged issue — resolved: the New finding — maintainability (minor, non-blocking):
Since this table is now stitched into the weekly automated PR with zero human review expected (per the PR description), a silent-drop failure mode is the one place this automation could quietly go stale. Two options that would close the gap:
Not a blocker for this PR — the automation as written matches today's six scenarios correctly — but worth a quick follow-up so the "never goes stale" guarantee in the PR description actually holds for future scenario additions. Everything else — the marker-replacement logic, the workflow step ordering (runs after |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6e4ed6d0c3
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| ### ASP.NET Core | ||
|
|
||
| ```csharp | ||
| public class ApiFactory : TestWebApplicationFactory<Program>; |
There was a problem hiding this comment.
Use valid class declarations in integration snippets
Readers copying the new ASP.NET Core sample hit a C# syntax error here because public class ...; is not a valid class declaration; the Aspire sample below uses the same semicolon-only form. These examples need an empty body such as { } (or another valid declaration) before users can try the TUnit integration code.
Useful? React with 👍 / 👎.
Summary
Rewrites the README to actually showcase TUnit, and adds automation so the new benchmark table never goes stale.
README changes
differs at memberobject diff) — all message formats verified againstTUnit.Assertions.Tests.docs/static/benchmarks/latest.json, with an honest note that source generation trades a slightly slower build for faster runs.[GenerateAssertion]), shared fixtures viaClassDataSource+IAsyncInitializer, parallelism control (DependsOn,NotInParallel,ParallelLimiter<T>), hooks, and TUnit.Mocks (previously just a table row).TUnit.FsCheckandTUnit.OpenTelemetryto the packages table; noted F#/VB.NET support.Benchmark automation
.github/scripts/update-readme-benchmarks.jsrenders the table between<!-- benchmarks:start/end -->markers fromlatest.json(skipsNAcells, fails loudly if markers vanish).speed-comparison.ymlruns it afterprocess-benchmarks.jsand includesREADME.mdin the existing weekly auto-PR, so the table refreshes with zero manual effort.Verification
HasCount(n),Contains(predicate),.Because(...),[Before(Test)],IFoo.Mock()/Returns/WasCalled(Times.Once),ClassDataSourceshared scopes,TestWebApplicationFactory<T>,AspireFixture<T>,PageTest,[FsCheckProperty].