依赖、特征等无关变更致Rust测试异常失败求助
诡异的SQLite3 Rust绑定测试问题
在大型Rust仓库中发现,向Cargo.toml添加未被引用的依赖后,部分测试开始失败,该问题已在一个仓库稳定复现。核心代码如下:
mod test { pub fn b<T>(db: *mut libsqlite3_sys::sqlite3, _: T) { let rc = unsafe { libsqlite3_sys::sqlite3_create_function( db, // db "x".as_ptr() as _, // zFunction 0, // nArg 0, // eTextRep std::ptr::null_mut(), // pApp None, // xFunc None, // xStep None, // xFinal ) }; match rc { libsqlite3_sys::SQLITE_MISUSE => (), x => panic!("Wanted SQLITE_MISUSE, got {:?}", x), } } } #[test] #[ignore] fn z() { format!("{:?}", &[1, 2, 3, 4]); panic!("not run"); } #[test] fn a() { const FILENAME: &[u8] = b":memory:\0"; let mut db: *mut libsqlite3_sys::sqlite3 = std::ptr::null_mut(); let rc = unsafe { libsqlite3_sys::sqlite3_open(FILENAME.as_ptr() as _, &mut db) }; assert_eq!(rc, libsqlite3_sys::SQLITE_OK); test::b(db, 0); }
在MacOS设备上,执行cargo test --lib --features=static时测试通过(sqlite3_create_function返回SQLITE_MISUSE):
$ cargo test --lib --features=static Finished test [unoptimized + debuginfo] target(s) in 0.52s Running unittests src/lib.rs (target/debug/deps/sqlite3_ext-5449511dde1f34ef) running 2 tests test z ... ignored test a ... ok test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.01s
但按代码逻辑,sqlite3_create_function不应返回SQLITE_MISUSE,且存在诸多诡异现象:
- 不使用
--features=static时测试失败(该特征未被任何代码引用) - 删除未执行的
format!代码行时测试失败 - 增删Cargo.toml中未被引用的依赖时测试失败
- 重命名“static”特征为其他名称时测试失败
- 重命名“test”模块为其他名称时测试失败
- 在Linux系统运行时测试失败
添加[features] joke = []到Cargo.toml后,表现为:
cargo test --lib --features=joke测试失败(无SQLITE_MISUSE返回)cargo test --lib --features=static测试通过(返回SQLITE_MISUSE)cargo test --lib --features=static,joke测试失败(无SQLITE_MISUSE返回)
使用的环境为MacOS 10.14.6 (18G9323)、rustc 1.61.0 (fe5b13d68 2022-05-18),已上传二进制文件至GitHub。
内容的提问来源于stack exchange,提问作者Ryan Patterson
相关产品推荐
相关产品推荐

