Problem
Calling cargo test on a project that has the #![windows_subsystem = "windows"] global attribute does not show the expected human-readable output.
Instead of showing
> cargo test
Compiling no_output v0.1.0 (C:\Programming\no_output)
Finished dev [unoptimized + debuginfo] target(s) in 0.71s
Running target\debug\deps\no_output-c8b57bda8502ba55.exe
running 1 test
test tests::test_panic ... FAILED
failures:
---- tests::test_panic stdout ----
thread 'tests::test_panic' panicked at 'This tape has just self-destructed!', src\main.rs:9:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.
failures:
tests::test_panic
test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out
error: test failed, to rerun pass '--bin no_output'
it shows
> cargo test
Compiling no_output v0.1.0 (C:\Programming\no_output)
Finished dev [unoptimized + debuginfo] target(s) in 1.40s
Running target\debug\deps\no_output-c8b57bda8502ba55.exe
error: test failed, to rerun pass '--bin no_output'
which not quite as informative as the former message (it does not tell which tests failed).
Steps
This requires a Windows computer.
cargo new.main.rs file:#![windows_subsystem = "windows"]
fn main() {
println!("Hello, world!");
}
#[cfg(test)]
mod tests {
#[test]
fn test_panic() {
panic!("This tape has just self-destructed!");
}
}
cargo test on your project.Possible Solution(s)
My guess is that this is due to executables targeting the Windows subsystem having no console and standard output initialized by default on Windows. Therefore, 2 possible solutions come to my mind:
cargo test-compiled executables to target the console subsystem when compiled for Windows;AllocConsole() function provided by the Windows API.Notes
Output of cargo version: this happens on pretty much any cargo version.
Tested on cargo 1.39.0 (1c6ec66d5 2019-09-30) and cargo 1.41.0-nightly (626f0f40e 2019-12-03).
Apologies if this has already been reported. I was unable to find a similar issue in the repository 馃槄
Thanks for the report. I have moved this to rust-lang/rust, as that is where issues for libtest are tracked. This looks to be an issue with the libtest harness.
Interestingly, the output works when run from a cygwin/msys shell, but doesn't with cmd or powershell.
As a workaround, perhaps something like this well help:
#![cfg_attr(not(test), windows_subsystem = "windows")]
Isn't this expected behavior?
Good question, I have no idea! I could see an argument that when built with --test that rustc could ignore the windows_subsystem attribute, since the intent is to write to the console. But I do not know what the consequences would be.
I'm pretty sure this is due to defaults regarding how console and windows processes inherit stdout/stdin differently. By default console processes will inherit stdout/stdin from the parent process while windows processes do not. I believe the reason we allow stdout/stdin to be inherited instead of explicitly piping it is to allow console processes to emit colors using the conhost color API, because otherwise colors would not work in some situations on Windows.
This issue isn't limited to tests only. I build a GUI currently and want to avoid popping up a console on start. However using the cli version is not possible anymore because it does not output anything due to stdout/stdin not being attached to anything.
It would be very helpful if there is a winapi call to make which allows to attach stdout/stdin to the parent. This can be used for cargo test too.