bats-core / bats-assert

Common assertions for Bats
Creative Commons Zero v1.0 Universal
96 stars 42 forks source link

Missing `assert_stderr` and similar assertions #42

Open jbriales opened 2 years ago

jbriales commented 2 years ago

The run command in bats-core has the ability to keep stderr-related output into separate variables:

Use --separate-stderr to split stdout and stderr into $output/$stderr and ${lines[@]}/${stderr_lines[@]}

as per https://bats-core.readthedocs.io/en/latest/writing-tests.html#run-test-other-commands

Should we have assertion helpers that apply to stderr only?

martin-schulze-vireso commented 2 years ago

Since this is a relatively recent addition to bats-core, I would be cautious to add a feature that relies on a recent addition. We would need some kind of guard to avoid breaking suites by using the wrong bats version. I also dislike the amount of code duplication that entails. Would prefixing assert_output with output="$stderr" be a bad option?

jbriales commented 2 years ago

I think the proposed workaround is very spot on and indeed works nicely and unblocks here. I think with this alternative, it's not worth cluttering the code and duplicating functionalities as you mentioned. Closing this. Thanks!

viathor commented 2 years ago

@jbriales @martin-schulze-vireso I'd like to revisit this.

I agree there is a viable workaround. However, normally bats tests tend to look very clean and elegant and the workaround is rather jarring. Also, --separate-stderr is no longer as recent as it was back when this was first filed.

Code duplication could be avoided by implementing this as a flag, say -r, --stderr added to both assert_output and assert_line.

WDYT?

jbriales commented 2 years ago

I agree on bats being generally quite clean and this workaround getting dealing with stderr checks less seamless or "native".

I'm not sure about the impl details, but if we went for extending, I'd find having assert_stderr more discoverable than assert_output --stderr.

martin-schulze-vireso commented 2 years ago

I agree on bats being generally quite clean and this workaround getting dealing with stderr checks less seamless or "native".

I'm not sure about the impl details, but if we went for extending, I'd find having assert_stderr more discoverable than assert_output --stderr.

I'd Vote for this as well. The existing flag parser in assert_output Just assumes flags it does not know to be the test expectation. This means you will get a somewhat misleading error message in older versions.

viathor commented 2 years ago

Yeah, assert_stderr sounds good, too. I suppose the counterpart for assert_line would be something like assert_stderr_line or assert_line_stderr?

jbriales commented 2 years ago

Yeah, assert_stderr sounds good, too. I suppose the counterpart for assert_line would be something like assert_stderr_line or assert_line_stderr?

Because it would refer to a check in a specific line vs checking against the full output, I'd say assert_stderr and assert_stderr_line would be the most intuitive pair?

martin-schulze-vireso commented 2 years ago

Because it would refer to a check in a specific line vs checking against the full output, I'd say assert_stderr and assert_stderr_line would be the most intuitive pair?

assert_stderr and assert_stderr_line sounds good to me.

viathor commented 2 years ago

Sounds like there is agreement that this should be done (and even how it should be done). Perhaps it could be reopened? :-)

hgl commented 1 year ago

Another case against output="$stderr" is that if you use shellcheck, it's going to complain stderr not being defined, so you'd have to either use ${stderr?} or add a shellcheck disable comment.

With assert_stderr, there is no need to jump through such hoops.

mh182 commented 2 weeks ago

Is someone working on this? I also stumbled on this problem. The first thing I did was searching for assert_stderr. Consistency is a powerful concept.