wmproxy

wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子

项目地址

国内: https://gitee.com/tickbh/wmproxy

github: https://github.com/tickbh/wmproxy

自动化测试

在程序中,通常会写一些自动化测试的功能,来保证我们的代码正确的执行符合预期的效果,随着时间的变化,当代码变动的数据越来越多时,保证能实时的测试确保整个系统高概率的正常运转,不会因为改一个Bug而产生另一个Bug

Rust中的测试

Rust中的测试分为两个部分

  • 文档测试

文档测试通常在函数前面或者类前面,通过文档测试来保证该函数的运行能符合我们的预期,通常/// ``` 包围,以下为测试示例,如果仅仅以///开头那么测试

/// 测试vec的大小
///
/// use std::vec::Vec;
///
/// let mut vec = Vec::new();
/// assert_eq!(vec.len(), 0);
/// vec.push(1);
/// assert_eq!(vec.len(), 1);
fn show_test() { }

此时我们运行cargo test可以看的到如下输出:

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

此时并不能识别我们的文档测试用例,那么我们在代码前后加上/// ```再来运行

/// 测试vec的大小
///
/// ```
/// use std::vec::Vec;
///
/// let mut vec = Vec::new();
/// assert_eq!(vec.len(), 0);
/// vec.push(1);
/// assert_eq!(vec.len(), 1);
/// ```
fn show_test() { }

将得到如下输出

running 1 test
test src\lib.rs - show_test (line 3) ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.22s

此时测试通过自动化模块

  • 测试模块

    这是每个模块下可以通过自定义测试函数来对每个类进行自动化测试,让我们来看下面一个例子:
fn str_len(s: &str) -> usize {
s.len()
} async fn str_len_async(s: &str) -> usize {
// 做些异步的事情
s.len()
} #[cfg(test)]
#[allow(non_snake_case)]
mod tests {
use super::*; #[test]
fn test_str_len() {
assert_eq!(str_len("x5ff"), 4);
}

此时运行测试结果很完美的通过测试

running 1 test
test tests::test_str_len ... ok test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

当我们将str_len->str_len_async时,那么他提示我们

error[E0369]: binary operation `==` cannot be applied to type `impl Future<Output = usize>`
--> src\lib.rs:29:9
|
29 | assert_eq!(str_len_async("x5ff"), 4);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| impl Future<Output = usize>
| {integer}
|
= note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: `impl Future<Output = usize>` doesn't implement `Debug`
--> src\lib.rs:29:9
|
29 | assert_eq!(str_len_async("x5ff"), 4);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `impl Future<Output = usize>` cannot be formatted using `{:?}` because it doesn't implement `Debug`
|
= help: the trait `Debug` is not implemented for `impl Future<Output = usize>`
= note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info) Some errors have detailed explanations: E0277, E0369.
For more information about an error, try `rustc --explain E0277`.

因为异步返回的结果是Future,所以我们无法通过编译。

那么异步的函数如何通过自动化测试呢?

我们尝试将测试函数改成异步

mod tests {
use super::*; #[test]
async fn test_str_len() {
assert_eq!(str_len_async("x5ff").await, 4);
}
}

编译器提示我们,因为编译器暂时不能支持异步的测试

error: async functions cannot be used for tests
--> src\lib.rs:28:5
|
28 | async fn test_str_len() {
| ^----
| |
| _____`async` because of this
| |
29 | | assert_eq!(str_len_async("x5ff").await, 4);
30 | | }
| |_____^

异步测试的两种方法

此处讲的依赖tokioruntime,其它的异步为类似。

  • #[tokio::test]来完成异步测试

    首先我们依赖:
[dependencies]
tokio = { version = "*", features = [
"macros",
"test-util",
] }
tokio-test = "0.4.3"

此刻我们将代码改写成:

#[cfg(test)]
#[allow(non_snake_case)]
mod tests {
use super::*; #[tokio::test]
async fn test_str_len() {
assert_eq!(str_len_async("x5ff").await, 4);
}
}

此时运行cargo test,将正常的运行通过

  • 用宏定义来完成异步测试

此方法运用的是通过同步函数中运行一个runtime来运行异步函数

以下是我们的宏定义及调用

macro_rules! aw {
($e:expr) => {
tokio_test::block_on($e)
};
}
#[test]
fn test_str_len_async_2() {
assert_eq!(aw!(str_len_async("x5ff")), 4);
}

此时运行cargo test,将正常的运行通过

running 2 tests
test tests::test_str_len_async_2 ... ok
test tests::test_str_len ... ok test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

但是此时如果是局部测试,该方法有另一个好处,编辑器的识别度较高,能更好的显示支持

小结

测试是编程中不可缺少的伙伴,他可以让我们更早的发现问题解决问题,编写测试用例可能看起来会慢一些,但是对后期可能潜在的Bug的排查会节省大量的时间。

点击 [关注][在看][点赞] 是对作者最大的支持

34. 干货系列从零用Rust编写负载均衡及代理,异步测试在Rust中的实现的更多相关文章

  1. Docker系列-(3) Docker-compose使用与负载均衡

    上一篇文章介绍了docker镜像的制作与发布,本文主要介绍实际docker工程部署中经常用到的docker-compose工具,以及docker的网络配置和负载均衡. Docker-compose介绍 ...

  2. Nginx服务器部署 负载均衡 反向代理

    Nginx服务器部署负载均衡反向代理 LVS Nginx HAProxy的优缺点 三种负载均衡器的优缺点说明如下: LVS的优点: 1.抗负载能力强.工作在第4层仅作分发之用,没有流量的产生,这个特点 ...

  3. [架构]辨析: 高可用 | 集群 | 主从 | 负载均衡 | 反向代理 | 中间件 | 微服务 | 容器 | 云原生 | DevOps | ...

    词汇集 灾备 冷备份 双机热备份 异地容灾备份 云备份 灾难演练 磁盘阵列(RAID) 故障切换 心跳监测 高可用 集群 主从复制(Master-Slave) 多集群横向扩容(master-clust ...

  4. 死磕nginx系列--使用upsync模块实现负载均衡

    问题描述 nginx reload是有一定损耗的,如果你使用的是长连接的话,那么当reload nginx时长连接所有的worker进程会进行优雅退出,并当该worker进程上的所有连接都释放时,进程 ...

  5. hbase源码系列(一)Balancer 负载均衡

    看源码很久了,终于开始动手写博客了,为什么是先写负载均衡呢,因为一个室友入职新公司了,然后他们遇到这方面的问题,某些机器的硬盘使用明显比别的机器要多,每次用hadoop做完负载均衡,很快又变回来了. ...

  6. 架构之Nginx(负载均衡/反向代理)

    Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器 ,也是一个 IMAP/POP3/SMTP 代理 服务器 . Nginx 是由 Igor Sys ...

  7. nginx负载均衡(反向代理)

    6,安装nginx 6.1 依赖库安装  要安装在root根目录里,不要装在虚拟环境里面 yum install gcc-c++ pcre pcre-devel zlib zlib-devel ope ...

  8. Apache和Nginx负载均衡集群及测试分析

    一.应用场景介绍 本文主要是介绍Apache和Tomcat在Linux环境下的安装讲解以及AJP协议动静分离负载均衡的实现,以及与Nginx负载性能比较.联网安装较为简单,故此处只说脱机的Linux环 ...

  9. nginx域名转发 负载均衡 反向代理

    公司有三台机器在机房,因为IP不够用,肯定要分出来,所以要建立单IP 多域名的反向代理, 就是当请求www.abc.com 跳转到本机, 请求www.bbc.com 跳转到192.168.0.35 机 ...

  10. Nginx HTTP负载均衡/反向代理的相关参数测试

    原文地址:http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/03/15/1984976.html 测试目的 (1)弄清楚HTTP Upstr ...

随机推荐

  1. 数据可视化【原创】vue复合数字形式展示

    做数据可视化的时候,经常碰到需要很灵活的数字形式展示. 先上个效果图: 如图包括名称,数量,别名,单位,上升下降,环比等等的复合数据展示,并且需要支持样式灵活配置. 此组件包括2个模块,父容器组件bo ...

  2. 白盒AES和SM4实现的差分故障分析

    DFA攻击背景介绍 传统的密码安全性分析环境被称为黑盒攻击环境,攻击者只能访问密码系统的输入与输出,但随着密码系统部署环境的多样化,该分析模型已经不能够反映实际应用中攻击者的能力.2002年,Chow ...

  3. 命令行获取chrome版本的多个方法

    命令行获取chrome版本的多个方法 基于win10 测试 背景 在selenium的驱动安装中用webdriver_manager自动处理chromedriver是比较好的做法 webdriver_ ...

  4. css的认知与样式

      目录 1. 介绍css 2. CSS语法 3. CSS注释 4. CSS中的颜色值 5. CSS长度单位 6. html引入CSS的三种方法 6.1 行内样式(内联样式) 6.2   内嵌样式 6 ...

  5. K8s部署轻量级日志收集系统EFK(elasticsear + filebeat + kibana)

    目录 K8s部署EFK(elasticsear + filebeat + kibana)日志收集 一.准备镜像 二.搭建Elasticsearch + kibana 1.在可执行kubectl命令的服 ...

  6. [CISCN 2019华东南]Web11

    看到下面connection 里面的内容有一点像抓包出来的 就抓包试试 似乎感觉也没有什么用 看到这个东西,那么就想到改IP 添加X-Forwarded-For:127.0.0.1 发现这个IP随着我 ...

  7. Java基础知识1-10

    测试要点 一.Java基础 1.常用设计模式有哪些?在项目中有哪里用的到?单例中懒汉饿汉优缺点? 软件设计模式分为三类分别为创建型.结构型.行为型. 1.1创建型 1.1.1单例模式(singleto ...

  8. 2020 5 17 codeforces

    cf还没结束,就开始写总结了.cf确实是个好东西,能够直接暴露出弱点和增加刷题量.以后还是要多打打的.这次我发现自己的码力还是不行.一个二分都要调好久.唉T1sb题,就是入门用的.题目看不懂...写了 ...

  9. 深入理解 Skywalking Agent

    概述 Agent 功能介绍 + 整体结构 + 设计 插件机制详解 Trace Segment Span 详解 异步 Trace 详解 如何正确地编写插件并防止内存泄漏 扩展:如何基于 Skywalki ...

  10. Perceptual Losses 风格迁移论文复现小记

    看了一篇李飞飞组的论文 Perceptual Losses for Real-Time Style Transfer and Super-Resolution. 论文地址为:https://arxiv ...