#regression #test #task #cargo #collect #input #execute

bin+lib cargo-regression

Collect test task from input files, execute them and compare results with golden

12 unstable releases (3 breaking)

new 0.3.2 Feb 16, 2025
0.3.1 Feb 16, 2025
0.2.2 Feb 14, 2025
0.1.4 Feb 14, 2025
0.0.1 Feb 10, 2025

#306 in Development tools

Download history 953/week @ 2025-02-09

958 downloads per month

MIT license

53KB
1.5K SLoC

Cargo Regression

ci crates.io License

Collect test task from input files, execute them and compare results with golden.

Usage

cargo install cargo-regression

Or you can download the latest/examples.zip, and call ./regression instead of cargo regression.

Then set your test files like ./demo, and

cargo regression ./demo

The tests will be exectued in ./tmp in default, change the directory by --workdir. All CLI arguments here:

Argument Description
--workdir xxx Change the directory to perform test
--permits 2 Set total permits to manage parallelism, see schedule-parallelism
--debug Show debug information & config files
--include demo/trybuild/* Set include filter, default is none
--exclude demo/trybuild/* Set exclude filter, default is none

Set Extension(s)

cargo-regression will collect all files that match extensions as test tasks, you can set extensions in two ways:

  • By commmand arguments
cargo regression ./demo --extensions py sh
  • By xx/__all__.toml
# override for all sub-dir
extensions = ["py", "sh"]

Other Config

The full configs demo is demo/full.toml. Except extensions can only be defined in xx/__all__.toml, the other configs can be defined in both xx/__all__.toml and xxx.toml. There are three types of configs:

  • xx/__all__.toml: Affect all task for current and all sub directories
  • xxx.toml: Only affect for input task file xxx.xx
  • Argument: Is equivalent to set it in the most top /__all__.toml
Argument In xxx.toml Description
--exe-path bash exe-path = "bash" The executable path to execute task
--args {{name}}.sh arg1 args = ["{{name}}.sh", "arg1"] The arguements for execute task, default ["{{name}}.{{extension}}"]
NA envs = { k1 = "v1", k2 = "v2" } The environment variables, see test-match.toml
NA extern-files = ["data.json"] In defualt only {{name}}.xx files will be linked to work dir, use this to link other files, see __all__.toml
--print-errs print-errs = true Print errors rather than save to reports
NA ignore = true Ignore that task
NA epsilon = 0.001 The value assert's tolerance, default is 1e-10

Variable Table

There are a few keywords that will be replaced into its values, for all configs.

Variable Description
{{rootdir}} The absolute path of test root
{{name}} The name of task file
{{extension}} The extension of task file

Extend Config

In default the configs will be override after you define them in xxx.toml. But for args, envs, and extern-files, you can extend them base on the super's configs. See test-extend.toml

Advanced Features

Test Filter

Only test specified tasks.

# No filter
cargo regression ./demo
# Only include demo/trybuild/* and ./demo/test-sh/*
cargo regression ./demo --include demo/trybuild/* ./demo/test-sh/*
# Exclude demo/trybuild/*
cargo regression ./demo --exclude demo/trybuild/*
# Combined filter
cargo regression ./demo --include demo/trybuild/* --exclude demo/trybuild/compile-ok.rs

Schedule Parallelism

permits and permit are virtual resource costs, you can define permits in arguments (default=1), and define permit in task toml config file (default=0). See test-premit

cargo regression ./demo --include demo/test-premit/* --permits 1
cargo regression ./demo --include demo/test-premit/* --permits 2

assertion

exit-code

Assert the exit code, default is 0. See test-exit.toml

[assert]
exit-code = 1

equal

The output file should equal to the golden. See compile-fail.toml

[[assert.golden]]
file = "{{name}}.stderr"
# The task's stder' should equal to __golden__/{{name}}.stderr
equal = true

match

Match pattern and assert the number (count) of it. See test-match.toml

[[assert.golden]]
# match pattern from task stdout
file = "{{name}}.stdout"
match = [
  # regular expression match
  { pattern = 'f.*o', count = 4 },
  # should contain word "fo" at least once
  { pattern = '\bfo\b', count-at-least = 1 },
  # should contain word "fo" at most once
  { pattern = '\bfo0\b', count-at-most = 1 },
]

value

Capture float number and assert the value (count) of it. The epsilon is assert tolerance, if the epsilon is not defined, default epsilon is 1e-10 See test-value.toml

[[assert.golden]]
# match float value from task stdout
file = "{{name}}.stdout"
value = [
  # match 'f.*o' and then match a float, assert it should within 4±0.01
  { pattern-before = 'f.*o', value = 4.0, epsilon = 0.01 },
  # match a float and then match 'after\b', assert it should > 1-0.0000000001
  { pattern-after = 'after\b', value-at-least = 1 },
  # math the float between 'f.*o' and 'after\b', assert it should within 4±0.0000000001
  { pattern-before = 'f.*o', pattern-after = 'after\b', value = 4.0 }
]

Use its library

use cargo_regression::{test, Args, TestExitCode};

#[tokio::main]
async fn main() -> TestExitCode {
  // Get arguments from CLI
  let args = Args::parse_from(std::env::args_os());
  // Or set fixed arguemnts
  let args = Args::new("./demo").debug();
  args.test().await
}

See more in ./examples

Reminder: For fixed argument, the include and exclude variables should be all files matched by yourself, e.g., using ["path/A", "path/B"] rather than ["path/*"].

Dependencies

~7–15MB
~179K SLoC

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy