Skip to content

Commit 9ea9d3a

Browse files
Optimize tests compilation with --exact flag (#2569)
<!-- Reference any GitHub issues resolved by this PR --> Closes #2530 ## Introduced changes - Optimize tests performance when using `--exact` flag - Display `other filtered out` instead of number of filtered tests. This is should be brought back and addressed in #2574 Before ```rust Tests: 1 passed, 0 failed, 0 skipped, 0 ignored, 5 filtered out ``` After ```rust Tests: 1 passed, 0 failed, 0 skipped, other ignored, other filtered out ``` ## Checklist <!-- Make sure all of these are complete --> - [x] Linked relevant issue - [x] Updated relevant documentation - [x] Added relevant tests - [x] Performed self-review of the code - [x] Added changes to `CHANGELOG.md` --------- Co-authored-by: Fiiranek <[email protected]> Co-authored-by: Franciszek Job <[email protected]>
1 parent eacc4dd commit 9ea9d3a

File tree

18 files changed

+151
-32
lines changed

18 files changed

+151
-32
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1919
#### Fixed
2020
- `account delete` command: It is no longer necessary to provide the `--url` argument each time. Either the `--url` or `--network` argument must be provided, but not both, as they are mutually exclusive.
2121

22+
### Forge
23+
24+
#### Changed
25+
26+
- When using test name filter with `--exact` flag, forge will try to compile only the selected test.
27+
2228
## [0.31.0] - 2024-09-26
2329

2430
### Cast

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/forge/src/pretty_printing.rs

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,33 @@ pub(crate) fn print_running_tests(test_target_location: TestTargetLocation, test
2626
println!("{}", style(plain_text).bold());
2727
}
2828

29-
pub(crate) fn print_test_summary(summaries: &[TestTargetSummary], filtered: usize) {
29+
// TODO(#2574): Bring back "filtered out" number in tests summary when running with `--exact` flag
30+
pub(crate) fn print_test_summary(summaries: &[TestTargetSummary], filtered: Option<usize>) {
3031
let passed: usize = summaries.iter().map(TestTargetSummary::count_passed).sum();
3132
let failed: usize = summaries.iter().map(TestTargetSummary::count_failed).sum();
3233
let skipped: usize = summaries.iter().map(TestTargetSummary::count_skipped).sum();
3334
let ignored: usize = summaries.iter().map(TestTargetSummary::count_ignored).sum();
3435

35-
println!(
36-
"{}: {} passed, {} failed, {} skipped, {} ignored, {} filtered out",
37-
style("Tests").bold(),
38-
passed,
39-
failed,
40-
skipped,
41-
ignored,
42-
filtered,
43-
);
36+
if let Some(filtered) = filtered {
37+
println!(
38+
"{}: {} passed, {} failed, {} skipped, {} ignored, {} filtered out",
39+
style("Tests").bold(),
40+
passed,
41+
failed,
42+
skipped,
43+
ignored,
44+
filtered
45+
);
46+
} else {
47+
println!(
48+
"{}: {} passed, {} failed, {} skipped, {} ignored, other filtered out",
49+
style("Tests").bold(),
50+
passed,
51+
failed,
52+
skipped,
53+
ignored
54+
);
55+
}
4456
}
4557

4658
pub(crate) fn print_test_seed(seed: u64) {

crates/forge/src/run_tests/package.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
load_test_artifacts, should_compile_starknet_contract_target,
1212
},
1313
shared_cache::FailedTestsCache,
14-
test_filter::TestsFilter,
14+
test_filter::{NameFilter, TestsFilter},
1515
warn::{
1616
warn_if_available_gas_used_with_incompatible_scarb_version,
1717
warn_if_incompatible_rpc_version,
@@ -172,8 +172,13 @@ pub async fn run_for_package(
172172
}
173173
}
174174

175-
let filtered = all_tests - not_filtered;
176-
pretty_printing::print_test_summary(&summaries, filtered);
175+
// TODO(#2574): Bring back "filtered out" number in tests summary when running with `--exact` flag
176+
if let NameFilter::ExactMatch(_) = tests_filter.name_filter {
177+
pretty_printing::print_test_summary(&summaries, None);
178+
} else {
179+
let filtered = all_tests - not_filtered;
180+
pretty_printing::print_test_summary(&summaries, Some(filtered));
181+
}
177182

178183
let any_fuzz_test_was_run = summaries.iter().any(|test_target_summary| {
179184
test_target_summary

crates/forge/src/run_tests/workspace.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use scarb_api::{
1616
target_dir_for_workspace, ScarbCommand,
1717
};
1818
use scarb_ui::args::PackagesFilter;
19+
use shared::consts::SNFORGE_TEST_FILTER;
1920
use std::env;
2021

2122
#[allow(clippy::too_many_lines)]
@@ -44,6 +45,15 @@ pub async fn run_for_workspace(args: TestArgs) -> Result<ExitStatus> {
4445

4546
let filter = PackagesFilter::generate_for::<Metadata>(packages.iter());
4647

48+
if args.exact {
49+
let test_filter = args.test_filter.clone();
50+
if let Some(last_filter) =
51+
test_filter.and_then(|filter| filter.split("::").last().map(String::from))
52+
{
53+
set_forge_test_filter(last_filter);
54+
}
55+
}
56+
4757
build_artifacts_with_scarb(
4858
filter.clone(),
4959
args.features.clone(),
@@ -80,6 +90,10 @@ pub async fn run_for_workspace(args: TestArgs) -> Result<ExitStatus> {
8090
pretty_printing::print_latest_blocks_numbers(block_number_map.get_url_to_latest_block_number());
8191
pretty_printing::print_failures(&all_failed_tests);
8292

93+
if args.exact {
94+
unset_forge_test_filter();
95+
}
96+
8397
Ok(if all_failed_tests.is_empty() {
8498
ExitStatus::Success
8599
} else {
@@ -101,3 +115,11 @@ fn extract_failed_tests(
101115
)
102116
})
103117
}
118+
119+
fn set_forge_test_filter(test_filter: String) {
120+
env::set_var(SNFORGE_TEST_FILTER, test_filter);
121+
}
122+
123+
fn unset_forge_test_filter() {
124+
env::remove_var(SNFORGE_TEST_FILTER);
125+
}

crates/forge/src/test_filter.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use forge_runner::TestCaseFilter;
77
// Specifies what tests should be included
88
pub struct TestsFilter {
99
// based on name
10-
name_filter: NameFilter,
10+
pub(crate) name_filter: NameFilter,
1111
// based on `#[ignore]` attribute
1212
ignored_filter: IgnoredFilter,
1313
// based on rerun_failed flag
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[package]
2+
name = "duplicated_test_names"
3+
version = "0.1.0"
4+
edition = "2023_11"
5+
6+
[dev-dependencies]
7+
snforge_std = { path = "../../../../../snforge_std" }
8+
9+
[scripts]
10+
test = "snforge test"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#[test]
2+
fn test_simple() {
3+
assert(1 == 1, 'simple check');
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#[test]
2+
fn test_simple() {
3+
assert(1 == 1, 'simple check');
4+
}

0 commit comments

Comments
 (0)