Home > Net >  How to configure cargo test with custom arguments in VSCode
How to configure cargo test with custom arguments in VSCode

Time:05-18

I have some tests which create/read/write/delete a file and I always use the same file name in each of them, therefore I need to run them sequentially to avoid simultaneous operations on the same file. In the command line I can just do it like this

cargo test -- --test-threads=1

however in the VSCode Run/Debug menu it doesn't seem to work. I'm using the autogenerated configuration with Rust Analyzer, plus these extra arguments for the sequential run.

This is my launch.json:

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug executable 'my-project'",
            "cargo": {
                "args": [
                    "build",
                    "--bin=my-project",
                    "--package=my-project"
                ],
                "filter": {
                    "name": "my-project",
                    "kind": "bin"
                }
            },
            "args": [],
            "cwd": "${workspaceFolder}"
        },
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug unit tests in executable 'my-project'",
            "cargo": {
                "args": [
                    "test",
                    "--no-run",
                    "--bin my-project",
                    "--package my-project",
                    "--", // here I've added the arguments
                    "--test-threads=1", // here I've added the arguments
                ],
                "filter": {
                    "name": "my-project",
                    "kind": "bin"
                }
            },
            "args": [],
            "cwd": "${workspaceFolder}"
        }
    ]
}

And this is the output I get when running the second command (the one which calls cargo test):

Running `cargo test --no-run --bin my-project --package my-project --message-format=json -- --test-threads=1`...
error: Found argument '--bin my-project' which wasn't expected, or isn't valid in this context

    Did you mean '--bin'?

    If you tried to supply `--bin my-project` as a value rather than a flag, use `-- --bin my-project`

USAGE:
    cargo.exe test --no-run --bin [<NAME>]

For more information try --help

CodePudding user response:

VSCode uses a two steps process:

  1. it calls cargo test --no-run to compile the test executable and
  2. it calls the test executable directly.

You should put --test-threads=1 in the last args array:

{
    "type": "lldb",
    "request": "launch",
    "name": "Debug unit tests in executable 'my-project'",
    "cargo": {
        "args": [
            "test",
            "--no-run",
            "--bin=my-project",
            "--package=my-project",
        ],
        "filter": {
            "name": "my-project",
            "kind": "bin"
        }
    },
    "args": [ "--test-threads=1" ],
    "cwd": "${workspaceFolder}"
}

CodePudding user response:

Each argument should be one entry in the array. -- --test-threads=1 is composed of two arguments: -- and --test-threads=1. So you need two entries in the array.

This also applies to --bin my-project and --package my-project. Another solution for them is like in the first entry, to use --bin=my-project and --package=my-project.

"args": [
    "test",
    "--no-run",
    "--bin",
    "my-project",
    "--package",
    "my-project",
    "--",
    "--test-threads=1",
],
  • Related