如何测试 Web REST 服务器

问题描述 投票:0回答:1

我目前正在使用 Rust 编写一个 REST Web 服务器。

我正在使用“reqwest”来测试 REST API。为了运行这些测试,我需要运行一个服务器实例。

如果我在运行“cargo test”之前启动它,cargo 会失败,因为它可以覆盖二进制文件(在 Windows 上)

所以,我尝试过:

  1. 在运行测试之前使用(“cargo run”)运行服务器
  2. 运行所有测试后停止服务器。

对于1),我找到了几个解决方案(test_env_helpers,Once,...) 但对于2),我还没有找到解决方案。我试过了:

  • test_env_helpers:在运行所有测试之前调用“after_all”方法
  • static_int + "#[dynamic(drop)]" 未调用 Drop 方法
  • suitest:调用“after_all”,但每个测试模块中仅运行一个测试

有什么建议吗?

testing rust rust-cargo
1个回答
0
投票

一种解决方案是使用集成测试。它们与服务器二进制文件分开编译并可以访问服务器二进制文件。不过,您有责任找出二进制文件的路径。

// tests/test_server.rs
use std::io::{BufRead, BufReader};
use std::process::{Command, Stdio};

pub fn test_server() {
    let mut path = std::env::current_exe().unwrap();
    assert!(path.pop());
    if path.ends_with("deps") {
        assert!(path.pop());
    }

    // Note: Cargo automatically builds this binary for integration tests.
    path.push(format!("{}{}", env!("CARGO_PKG_NAME"), std::env::consts::EXE_SUFFIX));

    let mut cmd = Command::new(path);
    cmd.env_clear();
    cmd.stdin(Stdio::piped());
    cmd.stdout(Stdio::piped());
    cmd.stderr(Stdio::piped());
    // TODO: cmd.args([]);

    let mut server = cmd.spawn().unwrap();
    
    let stdout = server.stdout.take().unwrap();
    let reader = BufReader::new(stdout);
    let mut lines = reader.lines();
    
    while let Some(Ok(line)) = lines.next() {
        // TODO: Server needs to print "listening" to stdout
        if line.contains("listening") {
            break;
        }
    }
    
    // TODO: Run tests.
}
© www.soinside.com 2019 - 2024. All rights reserved.