一般为了保证整个系统的稳定性,通常都需要编写大量的单元测试,诸如像java的junit,php的phpunit等都提供了类似的功能。golang中的testing包提供了这个测试的功能,结合go test工具搞起来就很方便了。

golang中的单元测试不单有功能测试,也还提供了性能测试,非常给力。

功能测试

在golang的src目录下新建目录math,测试目录结构如下:

golang单元测试目录

fibonacci.go代码如下,主要有一个Fibonacci函数

package lib//斐波那契数列
//求出第n个数的值
func Fibonacci(n int64) int64 {if n < 2 {return n}return Fibonacci(n-1) + Fibonacci(n-2)

fibonacci_test.go就是测试的文件了,golang需要测试文件一律用”_test”结尾,测试的函数都用Test开头,代码如下:

package libimport ("testing"
)func TestFibonacci(t *testing.T) {r := Fibonacci(10)if r != 55 {t.Errorf("Fibonacci(10) failed. Got %d, expected 55.", r)}
}

使用go test测试这个程序

$ go test libok lib 0.008s

如果提示找不到包,则将该代码路径加入环境变量GOPATH就可以了。

can't load package: package lib: cannot find package "lib" in any of:

性能测试

结合上面的方法,这里测试一下函数的性能,如果需要进行性能测试,则函数开头使用Benchmark就可以了。

//性能测试
func BenchmarkFibonacci(b *testing.B) {for i := 0; i < b.N; i++ {Fibonacci(10)}
}

接下来执行这个性能测试:

$ go test -bench=. libPASSBenchmarkFibonacci 5000000 436 ns/opok lib 2.608s

其中第二行输出表示这个函数运行了5000000次,平均运行一次的时间是436ns。

这个性能测试只测试参数为10的情况。如果有需要可以测试多个参数:

//测试参数为5的性能
func BenchmarkFibonacci5(b *testing.B) {for i := 0; i < b.N; i++ {Fibonacci(5)}
}//测试参数为20的性能
func BenchmarkFibonacci20(b *testing.B) {for i := 0; i < b.N; i++ {Fibonacci(20)}
}

运行一下:

$ go test -bench=. libPASSBenchmarkFibonacci 5000000 357 ns/opBenchmarkFibonacci5 100000000 29.5 ns/opBenchmarkFibonacci20 50000 44688 ns/opok lib 7.824s

如果性能测试的方法非常多,那需要的时间就会比较久。可以通过-bench=参数设置需要运行的性能测试行数:

$ go test -bench=Fibonacci20 libPASSBenchmarkFibonacci20 50000 44367 ns/opok lib 2.677s

转载请注明:快乐编程 » golang中的单元测试

翻阅golang包手册的时候看到net/http/httputil有一个type ReverseProxy,这个不是反向代理吗!golang自带反向代理功能?好奇就试了一下,确实非常简单,没有几行代码就实现了一个简易的反向代理服务。

关于反向代理百度百科上说的非常详细了,这里摘录一下定义:

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

golang实现代码

package mainimport ("log""net/http""net/http/httputil""net/url"
)type handle struct {host stringport string
}func (this *handle) ServeHTTP(w http.ResponseWriter, r *http.Request) {remote, err := url.Parse("http://" + this.host + ":" + this.port)if err != nil {panic(err)}proxy := httputil.NewSingleHostReverseProxy(remote)proxy.ServeHTTP(w, r)
}func startServer() {//被代理的服务器host和porth := &handle{host: "127.0.0.1", port: "80"}err := http.ListenAndServe(":8888", h)if err != nil {log.Fatalln("ListenAndServe: ", err)}
}func main() {startServer()
}

关键的代码就是NewSingleHostReverseProxy这个方法,查看源码的话不难看出该方法返回了一个ReverseProxy对象,在ReverseProxy中的ServeHTTP方法实现了这个具体的过程,主要是对源http包头进行重新封装,而后发送到后端服务器。

转载请注明:快乐编程 » golang实现的反向代理

Go语言中的单元测试及反向代理相关推荐

  1. Linux系统中使用Nginx实现反向代理

    1. Nginx的安装 1.1. 配置nginx安装包源: sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-rel ...

  2. Nginx中配置服务的反向代理(服务器集群技术)

    需求:安装两个tomcat服务,通过nginx反向代理. 1:安装两个及以上tomcat 2:配置tomcat 修改端口:打开bin目录下的server.xml文件 修改下面三个端口, 不能重复防止冲 ...

  3. 容器化单页面应用中Nginx反向代理与Kubernetes部署

    在<容器化单页面应用中RESTful API的访问>一文中,我介绍了一个在容器化环境中单页面应用访问后端服务的完整案例.这里我将继续使用这个案例,介绍一下容器化单页面应用部署的另一个场景: ...

  4. 彻底吃透Web服务器、容器、应用程序服务器与反向代理

    出处:cnblogs.com/vipyoumay/p/7455431.html 我们知道,不同肤色的人外貌差别很大,而双胞胎的辨识很难.有意思的是 Web 服务器/Web 容器/Web 应用程序服务器 ...

  5. YARP(Yet Another Reverse Proxy)是使用 .NET 构建的高度可定制的反向代理

    点击上方蓝字 关注我们 (本文阅读时间:16分钟) YARP 1.0已经发布了,现在可以从 NuGet 下载.YARP(Yet Another Reverse Proxy)是使用 .NET 构建的高度 ...

  6. Nginx 反向代理 负载均衡 虚拟主机

    Nginx 反向代理 负载均衡 虚拟主机配置 通过本章你将学会利用Nginx配置多台虚拟主机,清楚代理服务器的作用,区分正向代理和反向代理的区别,搭建使用Nginx反向搭理和负载均衡,了解Nginx常 ...

  7. 利用 squid 反向代理提高网站性能

    本文在介绍 squid 反向代理的工作原理的基础上,指出反向代理技术在提高网站访问速度,增强网站可用性.安全性方面有很好的用途.作者在具体的实验环境下,利用 DNS 轮询和 Squid 反向代理技术, ...

  8. nginx反向代理原理简介

    From:http://zcnick.blog.51cto.com/1992444/774662 1.反向代理的概念 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上 ...

  9. 缓存加速-----Squid-访问控制列表日志分析反向代理

    文章目录 一: ACL访问控制 1.1: ACL访问控制概述 1.2: ACL访问控制实验 二: Squid日志分析 三: 反向代理 3.1: 反向代理详解 3.2: 实验分析以及结构图 3.3: 具 ...

最新文章

  1. 【模拟】【贪心】POJ2709Painter
  2. AsyncLocal 与 async await
  3. VTK:InfoVis之SCurveSpline
  4. Codeforces Gym 100286I iSharp 水题
  5. 消息中间件—Kafka 的设计思想
  6. linux虚拟机 dev sda2,虛擬機linux下 /dev/sda2 滿了怎么辦,測試用過,真實可行
  7. 20191016:(leetcode习题)寻找两个有序数组的中位数
  8. dcopserver出错解决办法
  9. C#winform两个或多个panel重叠布局时如何显示一个
  10. 中国网和七牛云达成战略合作,携手打造国际化融媒中心
  11. MyBatis-Plus 分页查询以及自定义sql分页
  12. linux安装vlan管理软件,Linux_Linux下配置vlan网卡教程,1.需要使用到vconfig软件。首先y - phpStudy...
  13. 小狸智能原创工具·AI伪原创API工具
  14. 文件排版2.2 (python)
  15. 【小程序云开发】本地调试和云端测试的结果不一致,返回值result为null
  16. ViewCompanion Premium(HPGL、HPGL2和HP-RTL文件浏览和打印软件)官方正式版V13.10 | 内置viewcompanion注册码
  17. 如何完成计算机的安装程序,如何安装计算机系统程序.doc
  18. 极速办公(PPT)如何设置幻灯片大小
  19. Linux runtime PM 机制
  20. CSDN 开始起航

热门文章

  1. 盒子阴影(HTML、CSS)
  2. 实验3-7 统计学生成绩 (15 分)
  3. php 相对时间,php返回相对时间(如:20分钟前,3天前)的方法
  4. 阿里云oss权限控制,上传下载测试
  5. JVM常见的七种垃圾收集器的简单比较
  6. 为VIP解决问题时写的源码
  7. win8删除后清空回收站文件怎么恢复
  8. 作为前端Web开发者,这12条基本命令不可不会
  9. 线性筛法--------2013年1月2日
  10. Requirejs常用配置和应用