Skip to content

feat(s3s-test): add ignored tests and concurrent case execution#516

Merged
Nugine merged 3 commits intomainfrom
copilot/extend-s3s-tests-features
Feb 27, 2026
Merged

feat(s3s-test): add ignored tests and concurrent case execution#516
Nugine merged 3 commits intomainfrom
copilot/extend-s3s-tests-features

Conversation

Copy link
Contributor

Copilot AI commented Feb 25, 2026

Extends s3s-test with two features from the tracking issue: ignored test support and concurrent test execution within fixtures.

Ignored tests

  • Cases tagged CaseTag::Ignored are skipped at runtime and reported as IGNORED (yellow) in output
  • CaseReport and CountSummary gain an ignored field; all_passed() now checks failed == 0 rather than passed == total
  • --run-ignored CLI flag strips Ignored tags via TestContext::include_ignored(), running them normally

Concurrent case execution

  • Test execution is sequential by default
  • --concurrent CLI flag enables concurrent case execution within a fixture via tokio::spawn
  • When concurrent, handles are awaited in registration order to preserve deterministic report output
  • Suite/fixture setup and teardown remain sequential in both modes
// Tag a case as ignored
fixture.case("some_flaky_test", some_flaky_test).tag(CaseTag::Ignored);

// Run including ignored tests
// cargo run --bin s3s-e2e -- --run-ignored

// Run tests concurrently
// cargo run --bin s3s-e2e -- --concurrent

✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

- report.rs: Add `ignored` field to CaseReport and CountSummary
- runner.rs: Handle ignored cases (skip with report), run cases
  concurrently within fixtures using tokio::spawn
- tcx.rs: Add include_ignored() method to strip Ignored tags
- cli.rs: Add --run-ignored CLI option, show IGNORED status in output

Co-authored-by: Nugine <30099658+Nugine@users.noreply.github.com>
Copilot AI changed the title [WIP] Extend s3s-tests to support ignored tests and concurrent runs feat(s3s-test): add ignored tests and concurrent case execution Feb 25, 2026
@Nugine Nugine added the needs-human-intervention AI PRs that need non-trivial work to make progress label Feb 26, 2026
@Nugine
Copy link
Member

Nugine commented Feb 26, 2026

@copilot Test execution should be sequential by default. Add a flag to control concurrent test exection.

…urrent flag

Co-authored-by: Nugine <30099658+Nugine@users.noreply.github.com>
Copy link
Contributor Author

Copilot AI commented Feb 26, 2026

@copilot Test execution should be sequential by default. Add a flag to control concurrent test exection.

Made test execution sequential by default. Added --concurrent flag to opt into concurrent case execution within fixtures. Commit dc21ac0.

@codecov
Copy link

codecov bot commented Feb 27, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@Nugine Nugine removed the needs-human-intervention AI PRs that need non-trivial work to make progress label Feb 27, 2026
@Nugine Nugine marked this pull request as ready for review February 27, 2026 15:18
Copilot AI review requested due to automatic review settings February 27, 2026 15:18
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Extends the s3s-test crate’s test runner and CLI to support ignored test cases and optional concurrent case execution within fixtures, improving flexibility for flaky/long-running suites.

Changes:

  • Add CaseTag::Ignored handling with reporting (IGNORED) and new ignored counters in summaries.
  • Add --run-ignored to run ignored tests normally by stripping the Ignored tag.
  • Add --concurrent to execute cases within a fixture concurrently while preserving deterministic report ordering.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 1 comment.

File Description
crates/s3s-test/src/tcx.rs Adds include_ignored() to remove Ignored tags so those cases run normally.
crates/s3s-test/src/runner.rs Implements ignored-case skipping/reporting and optional concurrent per-fixture execution via spawned tasks.
crates/s3s-test/src/report.rs Extends report schema with ignored fields and adjusts all_passed() logic.
crates/s3s-test/src/cli.rs Adds CLI flags (--run-ignored, --concurrent) and prints IGNORED status in summaries.
Comments suppressed due to low confidence (4)

crates/s3s-test/src/runner.rs:169

  • run_case() always tokio::spawns the case future and awaits the handle. This creates an extra task even when --concurrent is disabled and also results in a double-spawn in concurrent mode (one for run_case, one inside it). Consider executing case_future directly and only spawning at the point you actually need isolation/panic capture.
async fn run_case(case_name: String, case_future: BoxFuture<'static, crate::Result>) -> CaseReport {
    info!("Test case start");
    let t0 = Instant::now();

    let result = spawn(case_future.in_current_span()).await;

crates/s3s-test/src/report.rs:45

  • CaseReport derives Deserialize. Adding the new non-optional ignored: bool field will cause deserialization of older JSON reports (without this field) to fail unless a default is provided. Consider adding #[serde(default)] to ignored (or making it Option<bool>).

    pub passed: bool,
    pub ignored: bool,
    pub duration_ns: u64,
    pub duration_ms: f64,

crates/s3s-test/src/report.rs:63

  • CountSummary derives Deserialize. Adding the new non-optional ignored: u64 field will cause deserialization of older JSON reports (without this field) to fail unless a default is provided. Consider adding #[serde(default)] to ignored (or making it Option<u64>).
    pub total: u64,
    pub passed: u64,
    pub failed: u64,
    pub ignored: u64,
}

crates/s3s-test/src/runner.rs:262

  • In concurrent mode, JoinHandle<CaseReport> errors are converted into a synthetic CaseReport with name "<unknown>" and FnResult::Panicked, losing the actual case name and potentially misclassifying cancelled tasks as panics. Store the case name alongside the handle and map JoinError into Panicked vs Err(cancelled) consistently with run_case().
                    CaseHandle::Running(h) => h.await.unwrap_or_else(|_| CaseReport {
                        name: String::from("<unknown>"),
                        passed: false,
                        ignored: false,
                        duration_ns: 0,

@Nugine Nugine added this pull request to the merge queue Feb 27, 2026
Merged via the queue into main with commit 117ddac Feb 27, 2026
21 checks passed
@Nugine Nugine deleted the copilot/extend-s3s-tests-features branch February 27, 2026 16:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants