@cratis/pi 7.103.5 → 7.103.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/corpus/agents/screenplay-modeler.md +1 -0
- package/package/corpus/harnesses/copilot/instructions/local-work-artifacts.instructions.md +7 -7
- package/package/corpus/harnesses/copilot/instructions/profiles.instructions.md +6 -2
- package/package/corpus/harnesses/copilot/instructions/specs.csharp.instructions.md +7 -5
- package/package/corpus/harnesses/pi/agents/screenplay-modeler.md +1 -0
- package/package/corpus/harnesses/pi/extensions/cratis-mcp/ServerBridge.ts +7 -5
- package/package/corpus/harnesses/pi/extensions/cratis-mcp/process.ts +15 -3
- package/package/corpus/hooks/scripts/cratis-cleanup-worktrees.sh +13 -5
- package/package/corpus/rules/local-work-artifacts.md +7 -7
- package/package/corpus/rules/profiles.md +6 -2
- package/package/corpus/rules/specs.csharp.md +7 -5
- package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/SKILL.md +7 -3
- package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/references/dependency-map.md +31 -14
- package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/references/dotnet-nuget.md +3 -0
- package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/references/npm-yarn.md +6 -4
- package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/references/train-mode.md +43 -0
- package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/references/worked-examples.md +5 -1
- package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/scripts/cratis-local-packages.sh +1065 -60
- package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/scripts/dependency-map.tsv +1 -1
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +2 -2
- package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +2 -2
- package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +1 -1
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/file-layout.md +15 -6
- package/package/corpus/skills/cratis-screenplay-event-modeling/verification.json +4 -1
- package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +7 -3
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +15 -4
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +49 -3
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/repairs.md +27 -3
- package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +14 -0
- package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +6 -0
- package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +1 -1
- package/package/corpus/skills/cratis-screenplay-model-review/verification.json +2 -0
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/SKILL.md +4 -0
- package/package/corpus/skills/cratis-screenplay-projections/SKILL.md +4 -5
- package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +4 -5
- package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +2 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +6 -0
- package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +13 -0
- package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +10 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +3 -0
- package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +8 -2
- package/package/corpus/skills/cratis-screenplay-ui-composition/references/ui-profile-and-theme.md +28 -0
- package/package/corpus/skills/cratis-screenplay-ui-composition/verification.json +4 -0
- package/package/corpus/skills/cratis-specifications-csharp/SKILL.md +20 -13
- package/package/corpus/skills/cratis-specifications-csharp/references/running-specs.md +90 -0
- package/package/corpus/skills/cratis-specifications-csharp/references/shared-lifecycle.md +55 -23
- package/package/corpus/skills/cratis-specifications-csharp/verification.json +5 -3
- package/package/corpus/skills/filter-syntax/SKILL.md +3 -1
- package/package/corpus/skills/run-tests/SKILL.md +1 -1
- package/package.json +1 -1
|
@@ -25,8 +25,8 @@ Sources:
|
|
|
25
25
|
|
|
26
26
|
| Package | Purpose |
|
|
27
27
|
| --- | --- |
|
|
28
|
-
| `Cratis.Specifications.XUnit` | `Specification` base, lifecycle discovery, `ShouldXxx` assertions,
|
|
29
|
-
| `Cratis.Specifications` | `Catch.Exception`, `SpecificationMethods` (dependency of the XUnit
|
|
28
|
+
| `Cratis.Specifications.XUnit.v3` | `Specification` base, lifecycle discovery, `ShouldXxx` assertions, shared lifecycle by default (house default; `.XUnit` is the xUnit v2 equivalent) |
|
|
29
|
+
| `Cratis.Specifications` | `Catch.Exception`, `SpecificationMethods` (dependency of the XUnit packages) |
|
|
30
30
|
| `Cratis.Arc.Testing` | `CommandScenario<TCommand>` preserves explicit principal/override/policy services; see application-scenarios |
|
|
31
31
|
| `Cratis.Chronicle.Testing` | `EventScenario`, `ReadModelScenario<T>`, `ReactorScenario<T>` |
|
|
32
32
|
|
|
@@ -100,10 +100,14 @@ resolved read-model key. See the ReactorScenario reference for diagnostics,
|
|
|
100
100
|
exception capture and UTC occurrence-time defaults.
|
|
101
101
|
|
|
102
102
|
Specification projects are named `<Source>.Specs`. Add a `PackageReference` to
|
|
103
|
-
`Cratis.Specifications.XUnit`, not just `Cratis.Specifications`; the C#
|
|
104
|
-
namespace stays `Cratis.Specifications`. The house
|
|
105
|
-
|
|
106
|
-
|
|
103
|
+
`Cratis.Specifications.XUnit.v3`, not just `Cratis.Specifications`; the C#
|
|
104
|
+
namespace stays `Cratis.Specifications`. The house default is Specifications 5
|
|
105
|
+
on xUnit v3 with `xunit.v3.mtp-off` and `<OutputType>Exe</OutputType>`, run as
|
|
106
|
+
the built executable. 5.0 targets net10.0 only; net8.0/net9.0 projects stay on
|
|
107
|
+
4.x and net48 on 3.x. A project that stays on xUnit v2 references
|
|
108
|
+
`Cratis.Specifications.XUnit`. Read [running-specs.md](references/running-specs.md)
|
|
109
|
+
for the project shape, the executable loop, filters, mixed solutions and the
|
|
110
|
+
4.x → 5.0 checklist; the `run-tests` and `filter-syntax` skills own command choice.
|
|
107
111
|
`Cratis.Specifications.NUnit` is an alternative with the same base pattern,
|
|
108
112
|
`[Test]` instead of `[Fact]`, and **public** test methods.
|
|
109
113
|
|
|
@@ -199,15 +203,18 @@ public class when_<behavior> : Specification
|
|
|
199
203
|
- Fields are `private` in a concrete specification and `protected` in a `given/`
|
|
200
204
|
context, named `_camelCase`.
|
|
201
205
|
- Any phase may be `async Task`. `void Destroy()` is optional teardown, after
|
|
202
|
-
|
|
206
|
+
once per eligible class by default (shared lifecycle); after each fact in a
|
|
207
|
+
`[PerFactSpecificationLifecycle]` class.
|
|
203
208
|
|
|
204
|
-
`Cratis.Specifications.XUnit` discovers `Establish`, `Because`, and `Destroy` by
|
|
209
|
+
`Cratis.Specifications.XUnit.v3` discovers `Establish`, `Because`, and `Destroy` by
|
|
205
210
|
convention — there are no attributes on them.
|
|
206
211
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
212
|
+
The shared lifecycle is the default: one instance and one Establish/Because
|
|
213
|
+
execution per specification class. Facts must not mutate that shared context;
|
|
214
|
+
`CRSPEC0008` is an error when one does. Read
|
|
215
|
+
[shared-lifecycle.md](references/shared-lifecycle.md) for eligibility, opting a
|
|
216
|
+
class, assembly or project out with `[PerFactSpecificationLifecycle]`, and
|
|
217
|
+
fixing `CRSPEC0008`.
|
|
211
218
|
|
|
212
219
|
## Step 4 — Extract a reusable context
|
|
213
220
|
|
|
@@ -297,7 +304,7 @@ between collaborators. That is where defects hide.
|
|
|
297
304
|
Requires `Cratis.Specifications` 4.0.0 for the analyzers.
|
|
298
305
|
|
|
299
306
|
CRSPEC0001–CRSPEC0007 ship as **warnings** in `Cratis.Specifications`, `.XUnit`,
|
|
300
|
-
and `.NUnit
|
|
307
|
+
`.XUnit.v3` and `.NUnit`; `CRSPEC0008` is an error. A warnings-as-errors build enforces them: `should_` names,
|
|
301
308
|
one specification per file (given contexts exempt), no facts on given contexts,
|
|
302
309
|
test attributes on `should_` methods, no explicit base lifecycle calls, public
|
|
303
310
|
specification classes, and no `Because` on given contexts. See
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
<!-- Copyright (c) Cratis. All rights reserved. -->
|
|
2
|
+
<!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
|
|
3
|
+
|
|
4
|
+
# Running specifications and migrating to 5.0
|
|
5
|
+
|
|
6
|
+
Requires `Cratis.Specifications.XUnit.v3` 5.0 on `net10.0`. Check the
|
|
7
|
+
`PackageReference` versions in the specification project; 4.x projects follow the
|
|
8
|
+
checklist below before the executable loop applies.
|
|
9
|
+
|
|
10
|
+
Sources: [Running specifications fast](https://github.com/Cratis/Specifications/blob/main/Documentation/running-fast.md),
|
|
11
|
+
[The native runner](https://github.com/Cratis/Specifications/blob/main/Documentation/runner.md) and
|
|
12
|
+
[Upgrading to 5.0](https://github.com/Cratis/Specifications/blob/main/Documentation/upgrading-5.0.md).
|
|
13
|
+
|
|
14
|
+
## Project shape
|
|
15
|
+
|
|
16
|
+
```xml
|
|
17
|
+
<PropertyGroup>
|
|
18
|
+
<TargetFramework>net10.0</TargetFramework>
|
|
19
|
+
<OutputType>Exe</OutputType>
|
|
20
|
+
</PropertyGroup>
|
|
21
|
+
<ItemGroup>
|
|
22
|
+
<PackageReference Include="Cratis.Specifications.XUnit.v3" />
|
|
23
|
+
<PackageReference Include="xunit.v3.mtp-off" />
|
|
24
|
+
<PackageReference Include="Microsoft.NET.Test.Sdk" />
|
|
25
|
+
<PackageReference Include="xunit.runner.visualstudio" />
|
|
26
|
+
</ItemGroup>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Versions live in `Directory.Packages.props`. Keep `Cratis.Specifications` and the
|
|
30
|
+
adapter package on the same version. The Cratis AI repository's `Source/Cratis.AI.Specs`
|
|
31
|
+
is a worked example, including the CI step that runs the built executable.
|
|
32
|
+
|
|
33
|
+
## Local loop
|
|
34
|
+
|
|
35
|
+
An xUnit v3 suite costs about 4.5 times more CPU through `dotnet test` than as the
|
|
36
|
+
built executable (indicative, from the upstream benchmark). Restore and build once,
|
|
37
|
+
then run the executable:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
dotnet restore Source/MyProject.Specs
|
|
41
|
+
dotnet build Source/MyProject.Specs --configuration Release --no-restore
|
|
42
|
+
./Source/MyProject.Specs/bin/Release/net10.0/MyProject.Specs
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Without an apphost, run `dotnet <path>/MyProject.Specs.dll`. `dotnet run --no-build`
|
|
46
|
+
also works but still starts MSBuild to resolve the project, so prefer the executable
|
|
47
|
+
for repeated runs. A pass is exit code 0 with the reported total equal to the
|
|
48
|
+
passed count.
|
|
49
|
+
|
|
50
|
+
Where a solution mixes Microsoft.Testing.Platform and VSTest projects, run each
|
|
51
|
+
project on its own; `dotnet test` on the whole solution does not work there.
|
|
52
|
+
|
|
53
|
+
## Filters
|
|
54
|
+
|
|
55
|
+
The executable accepts the filters of the xUnit v3 runner flavor the project
|
|
56
|
+
references. Check the flavor with `<executable> -h`; the `run-tests` skill owns
|
|
57
|
+
the command choice and `filter-syntax` owns the expression syntax.
|
|
58
|
+
|
|
59
|
+
| Project references | Filter flags |
|
|
60
|
+
| --- | --- |
|
|
61
|
+
| `xunit.v3.mtp-off` (house default) | `-class`, `-method`, `-namespace`, `-trait`, or one `-filter "<query>"`; do not mix the three kinds |
|
|
62
|
+
| MTP-enabled `xunit.v3` | `--filter-class`, `--filter-method`, `--filter-trait`, or one `--filter-query` |
|
|
63
|
+
| `Cratis.Specifications.Runner` (experimental native runner) | `--treenode-filter '/*/*/when_registering/*'` or `--filter-uid <uid>` |
|
|
64
|
+
|
|
65
|
+
Do not use `dotnet test --filter` against an MTP executable. See the
|
|
66
|
+
[`run-tests`](../../run-tests/SKILL.md) and [`filter-syntax`](../../filter-syntax/SKILL.md)
|
|
67
|
+
skills for the exact command per platform.
|
|
68
|
+
|
|
69
|
+
## Migrate from 4.x to 5.0
|
|
70
|
+
|
|
71
|
+
Follow the upstream [upgrade guide](https://github.com/Cratis/Specifications/blob/main/Documentation/upgrading-5.0.md)
|
|
72
|
+
and record the spec count and outcomes first.
|
|
73
|
+
|
|
74
|
+
1. Record the baseline: total, passed, failed and skipped counts, and the list of
|
|
75
|
+
discovered classes and methods, from the unmodified branch.
|
|
76
|
+
2. Target `net10.0` in every specification project; projects that must stay on
|
|
77
|
+
net8.0/net9.0 stay on 4.x.
|
|
78
|
+
3. Move `Cratis.Specifications` and the adapter package to the same 5.0 version. For
|
|
79
|
+
xUnit v3 switch to `Cratis.Specifications.XUnit.v3`, `xunit.v3.mtp-off` and
|
|
80
|
+
`<OutputType>Exe</OutputType>`.
|
|
81
|
+
4. Delete any `[assembly: Xunit.TestFramework(...)]` that registers Cratis
|
|
82
|
+
Specifications.
|
|
83
|
+
5. Fix each `CRSPEC0008` error by moving the change into `Establish` or `Because`; use
|
|
84
|
+
`[PerFactSpecificationLifecycle]` only when the fact genuinely needs a fresh instance.
|
|
85
|
+
6. Rebuild with warnings as errors and fix new nullable warnings.
|
|
86
|
+
7. Run the executable and require the same total, the same passed count and the same
|
|
87
|
+
classes and methods as the baseline (display names may become more readable),
|
|
88
|
+
with no new skips. A different count means a spec was
|
|
89
|
+
lost or duplicated; investigate before continuing.
|
|
90
|
+
8. Point CI at the built executable, and run mixed solutions project by project.
|
|
@@ -1,38 +1,70 @@
|
|
|
1
1
|
<!-- Copyright (c) Cratis. All rights reserved. -->
|
|
2
2
|
<!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
|
|
3
3
|
|
|
4
|
-
#
|
|
4
|
+
# Shared specification lifecycle
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
Requires `Cratis.Specifications.XUnit.v3` or `.XUnit` 5.0. Before 5.0 the shared
|
|
7
|
+
lifecycle was an opt-in on xUnit and `CRSPEC0008` was informational; check the package
|
|
8
|
+
version before relying on either. NUnit, TUnit and the native runner always share the
|
|
9
|
+
instance.
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
Source: [Running specifications fast](https://github.com/Cratis/Specifications/blob/main/Documentation/running-fast.md)
|
|
12
|
+
and [Upgrading to 5.0](https://github.com/Cratis/Specifications/blob/main/Documentation/upgrading-5.0.md).
|
|
11
13
|
|
|
12
|
-
The house default
|
|
13
|
-
per
|
|
14
|
+
The shared lifecycle is the house default. Plain xUnit builds a new instance per fact,
|
|
15
|
+
so `Establish` and `Because` would run once per fact; the shared lifecycle runs them
|
|
16
|
+
once per class, which is what a specification means: one context, one action,
|
|
17
|
+
several assertions. Construction, `Establish` and `Because` happen once, all facts share
|
|
18
|
+
the instance, and `Destroy` runs once after the last fact, including when
|
|
19
|
+
initialization failed. A throwing `Establish` or `Because` fails every fact in that
|
|
20
|
+
class.
|
|
14
21
|
|
|
15
|
-
|
|
22
|
+
The package registers the test framework. Delete any hand-written
|
|
23
|
+
`[assembly: Xunit.TestFramework("Cratis.Specifications.SpecificationTestFramework", ...)]`;
|
|
24
|
+
a duplicate fails the build with `CS0579`.
|
|
16
25
|
|
|
17
|
-
|
|
26
|
+
## Eligibility
|
|
27
|
+
|
|
28
|
+
A class is shared only when it derives from `Specification`, has a single public
|
|
29
|
+
parameterless constructor (or only framework-managed fixture arguments), does not
|
|
30
|
+
implement `IDisposable`, and has only plain facts. Theories, `ITestOutputHelper`
|
|
31
|
+
constructors, custom `IAsyncLifetime` implementations, custom fact test cases and plain
|
|
32
|
+
xUnit classes keep the per-fact lifecycle.
|
|
33
|
+
|
|
34
|
+
`Specification.InitializeAsync()` is idempotent for a single instance. It does not make
|
|
35
|
+
an ineligible class shared or cache instances across classes.
|
|
36
|
+
|
|
37
|
+
## CRSPEC0008
|
|
38
|
+
|
|
39
|
+
`CRSPEC0008` is an error by default: a `should_` fact that assigns to or increments an
|
|
40
|
+
instance field or property of the specification, or calls `Add`, `AddRange`, `Remove`,
|
|
41
|
+
`RemoveAt`, `Clear` or `Insert` on one, would make the result depend on fact order.
|
|
42
|
+
Move the change into `Establish` or `Because`:
|
|
18
43
|
|
|
19
44
|
```csharp
|
|
20
|
-
|
|
21
|
-
|
|
45
|
+
public class when_registering : Specification
|
|
46
|
+
{
|
|
47
|
+
List<string> _registered;
|
|
22
48
|
|
|
23
|
-
|
|
49
|
+
void Establish() => _registered = [];
|
|
50
|
+
void Because() => _registered.Add("first");
|
|
51
|
+
|
|
52
|
+
[Fact] void should_have_one_registration() => _registered.Count.ShouldEqual(1);
|
|
53
|
+
}
|
|
24
54
|
```
|
|
25
55
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
56
|
+
Do not lower the severity to pass the gate. When the repository must lower it, set it in
|
|
57
|
+
`.editorconfig` with `dotnet_diagnostic.CRSPEC0008.severity = warning`.
|
|
58
|
+
|
|
59
|
+
## Keep per-fact execution
|
|
60
|
+
|
|
61
|
+
Use the narrowest scope; the reason is a fact that genuinely needs a fresh instance.
|
|
30
62
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
63
|
+
| Scope | How |
|
|
64
|
+
| --- | --- |
|
|
65
|
+
| One class | `[PerFactSpecificationLifecycle]` on the class |
|
|
66
|
+
| The assembly | `[assembly: PerFactSpecificationLifecycle]` |
|
|
67
|
+
| The project | `<CratisSpecificationsSharedLifecycle>false</CratisSpecificationsSharedLifecycle>` |
|
|
36
68
|
|
|
37
|
-
|
|
38
|
-
|
|
69
|
+
Read [running-specs.md](./running-specs.md) for the executable loop and the 4.x → 5.0
|
|
70
|
+
checklist.
|
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
"input": "Set up a C# specification project and choose its lifecycle.",
|
|
4
4
|
"fixtures": [],
|
|
5
5
|
"assertions": [
|
|
6
|
-
{ "kind": "skill-contains", "value": "Cratis.Specifications.XUnit" },
|
|
7
|
-
{ "kind": "skill-contains", "value": "
|
|
8
|
-
{ "kind": "skill-contains", "value": "
|
|
6
|
+
{ "kind": "skill-contains", "value": "Cratis.Specifications.XUnit.v3" },
|
|
7
|
+
{ "kind": "skill-contains", "value": "<OutputType>Exe</OutputType>" },
|
|
8
|
+
{ "kind": "skill-contains", "value": "running-specs.md" },
|
|
9
|
+
{ "kind": "skill-contains", "value": "[PerFactSpecificationLifecycle]" },
|
|
10
|
+
{ "kind": "skill-contains", "value": "CRSPEC0008" },
|
|
9
11
|
{ "kind": "skill-contains", "value": "shared-lifecycle.md" },
|
|
10
12
|
{ "kind": "skill-contains", "value": "CRSPEC0001–CRSPEC0007" },
|
|
11
13
|
{ "kind": "skill-contains", "value": "Do not suppress these warnings" }
|
|
@@ -80,7 +80,9 @@ dotnet test --filter "Name~LoginTest"
|
|
|
80
80
|
|
|
81
81
|
## MTP filters — xUnit (v3)
|
|
82
82
|
|
|
83
|
-
xUnit v3 on MTP uses **framework-specific filter flags** instead of the generic `--filter` expression
|
|
83
|
+
xUnit v3 on MTP uses **framework-specific filter flags** instead of the generic `--filter` expression. A project on `xunit.v3.mtp-off` (the Cratis specification default) runs the native xUnit v3 executable instead and takes `-class`, `-method`, `-namespace`, `-trait` or one `-filter "<query>"`; see the `cratis-specifications-csharp` skill's `references/running-specs.md`.
|
|
84
|
+
|
|
85
|
+
The flags below apply to the MTP-enabled `xunit.v3` runner:
|
|
84
86
|
|
|
85
87
|
| Flag | Description |
|
|
86
88
|
|------|-------------|
|
|
@@ -12,7 +12,7 @@ metadata:
|
|
|
12
12
|
|
|
13
13
|
# Run .NET Tests
|
|
14
14
|
|
|
15
|
-
Cratis rules in `.cratis/ai/rules/` (including `csharp.md`, `specs.csharp.md`, and `orleans.md`) and the `cratis-*` skills win where they differ. Specification authoring belongs to **cratis-specifications-csharp**; Cratis
|
|
15
|
+
Cratis rules in `.cratis/ai/rules/` (including `csharp.md`, `specs.csharp.md`, and `orleans.md`) and the `cratis-*` skills win where they differ. Specification authoring belongs to **cratis-specifications-csharp**; Cratis spec projects on Specifications 5 and xUnit v3 run as the built executable, not `dotnet test`; see its `references/running-specs.md` for the loop and filter flags. Projects still on xUnit v2 run on VSTest.
|
|
16
16
|
|
|
17
17
|
Return or execute the command or command sequence that matches the repository's
|
|
18
18
|
project system, test platform, framework, and SDK mode.
|