首先,请记住 Rust 测试是以 并行 方式运行的。这意味着任何共享的设置都需要是线程安全的。
并且不要复制初始化代码
你可以像避免复制 其他任何代码 一样来做:创建一个函数、创建一个类型、创建特性等等:
use std::path::PathBuf;
fn root() -> PathBuf {
PathBuf::from("data/")
}
#[test]
fn test_one() {
let root = root();
}
#[test]
fn test_two() {
let root = root();
}
在Java中,我会先定义变量,然后在setup()
方法中初始化它。
相反,可以创建一个名为Setup
的结构体,其中包含所有这些变量,并将其构建为每个测试的第一件事:
use std::path::{Path, PathBuf};
struct Setup {
root: PathBuf,
}
impl Setup {
fn new() -> Self {
Self {
root: PathBuf::from("data/"),
}
}
}
#[test]
fn test_one() {
let setup = Setup::new();
let root: &Path = &setup.root;
}
#[test]
fn test_two() {
let setup = Setup::new();
let root: &Path = &setup.root;
}
但是在测试中我还没有看到过[lazy-static]的使用示例。
那是因为在测试中没有不同的使用方式,它只是代码:
但是我在测试中没有看到过 [lazy-static] 的使用示例,这是因为在测试中它的使用方式与普通代码并无区别:
use lazy_static::lazy_static;
use std::path::Path;
lazy_static! {
static ref ROOT: &'static Path = Path::new("data/");
}
#[test]
fn test_one() {
let root = *ROOT;
}
#[test]
fn test_two() {
let root = *ROOT;
}
另请参阅:
特别针对您的情况,通常情况下您不需要确切的Path
,因为字符串切片实现了AsRef<Path>
。换句话说,大多数接受Path
的地方接受&str
:
static ROOT: &str = "data/";
#[test]
fn test_one() {
let root = ROOT;
}
#[test]
fn test_two() {
let root = ROOT;
}