Ignore
things in Rust test
2022/07/31 COSCUP
Antonio Yang
Test in Rust
Rust offers a good tool for testing, we can quickly run tests with test cases, examples, and documents, and also can be selected by features with cargo
cargo test
Basic use
cargo test add_
With filter
cargo test --examples cargo test --example=add-twice
Filter by example
cargo test
Filter by features
cargo test --features=redundant
It is awesome, but...
Issues with Rust test
Integration test is not well considered in Rust
- Run test when corresponding component existing
Integration test
- Ignore when corresponding component is non-existing
Test
Use envar to ignore
- Run test when envar existing
- Ignore when envar absent
Test
Use envar to ignore
Hard to know the test ignored
Alway pass in the test case when ignoring
Not really know why ignoring
Use envar to ignore
Check envar when test running
Conditions: envar, file, http service, tcp socket, user, cpu, .. etc.
cargo test
Show ignore in the test case when ignoring
Show ignore message
Check condition when test case compiling
Let's try ignore in run time
Ignore in runtime
Integration test is not well considered in Rust
How a testcase run with cargo test
Buildtime vs Runtime
#[test]
fn test_case () {
ignore!("some message")
}
#[test]
#[ignore]
fn test_case () {
}
Note: ignore! is not really defined in Rust
#[test]
fn test_case () {
ignore!("some message")
}
Similar patten with panic
#[test]
fn test_case () {
panic!("some message")
}
Note: ignore! is not really defined in Rust
Let's look at panic!
Define return code
Test result base on return code
Parse panic message
library/test/src/test_result.rs
Ignore-by-panic
More than runtime ignore...
Still more...
cargo test -- --include-ignored
cargo test -- --ignored
Run ignored and not ignored tests
Run only ignored tests
These two options are designed for ignoring in build time, and not suitable for ignoring in runtime
Possible way to handle ignore in runtime
fn test::mark_ignored
— mark the current test as ignored; continue.fn test::mark_failed
— mark the current test as failed; continue.fn test::ignore
— mark the current test as ignored; continue if--include-ignored
, otherwise abort (unwind).-
fn test::skip
— mark the current test as ignored; if--include-ignored
, fail; abort (unwind).- Could be omitted, as it's just an alias for
{test::ignore(); test::fail()}
.
- Could be omitted, as it's just an alias for
fn test::fail
— mark the current test as failed; abort (unwind).
〞
A true requirement cannot be ignored
If ignored, it will grow savagely
If conditional statements
in side a String
A lot of documents for a small test because there is no standard way to do this
Any idea?
Djaesuhn.tjl @ flicr CC BY-SA 2.0
Collect other's idea
Reference
Thank You!
yanganto
yanganto
Ignore things in Rust
By Antonio Yang
Ignore things in Rust
- 906