我有用 Rust 编写的功能,我通过 pyo3 将其暴露给 python。我想测试 python 函数是否正确公开并正确处理 python 类型。
我已经进行了测试来验证实际的功能实现(在 Rust 中)和端到端集成(在 Python 中)。
如何在 rust 中测试 pyo3 python 函数?
这在 pyo3 文档中的 3.4 执行现有 Python 代码 - 想要使用其他模块在 Rust 中嵌入 Python? 和前面的章节中介绍了这一点,尽管文档不包含完整的示例。
在包含
lib.rs
和 #[pymodule]
的 #[pyfunction]
中,您可以添加:
#[cfg(test)]
mod tests {
use pyo3::exceptions::PyTypeError;
use super::*;
#[test]
fn test_fizzbuzz() {
pyo3::append_to_inittab!(py_fizzbuzzo3);
pyo3::prepare_freethreaded_python();
Python::with_gil(|py| {
let fizzbuzzo3 = py
.import_bound("fizzbuzzo3")
.expect("Failed to import fizzbuzzo3");
let fizzbuzz = fizzbuzzo3
.getattr("fizzbuzz")
.expect("Failed to get fizzbuzz function");
let result: PyResult<String> = match fizzbuzz.call1((1i32,)) {
Ok(r) => r.extract(),
Err(e) => Err(e),
};
let result = result.unwrap();
let expected_result = "1";
assert_eq!(result, expected_result);
});
}
}
pyo3::append_to_inittab!(py_fizzbuzzo3);
使同一文件中的 python 模块可用,并且必须在初始化 python 解释器之前调用let fizzbuzzo3 = py.import_bound("fizzbuzzo3").expect("Failed to import fizzbuzzo3");
然后导入模块let fizzbuzz = fizzbuzzo3.getattr("fizzbuzz").expect("Failed to get fizzbuzz function");
将 python 函数分配给一个变量,以便:fizzbuzz.call1((1i32,))
来调用该函数