【发布时间】:2016-11-02 15:51:53
【问题描述】:
如果我的代码可以与 net.Conn 一起使用,如何在不实际创建到 localhost 的网络连接的情况下为其编写测试?
我在网上没有看到任何解决方案;人们似乎要么忽略它(没有测试),要么编写无法并行运行的测试(即使用实际的网络连接,这会耗尽端口),或者使用 io.Pipe。
但是,net.Conn 定义了SetReadDeadline、SetWriteDeadline;而 io.Pipe 没有。 net.Pipe 也没有,尽管表面上声称实现了接口,但它只是简单地实现了:
func (p *pipe) SetDeadline(t time.Time) error {
return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
}
func (p *pipe) SetReadDeadline(t time.Time) error {
return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
}
func (p *pipe) SetWriteDeadline(t time.Time) error {
return &OpError{Op: "set", Net: "pipe", Source: nil, Addr: nil, Err: errors.New("deadline not supported")}
}
(见:https://golang.org/src/net/pipe.go)
那么...还有其他方法可以做到这一点吗?
我将接受任何显示如何在测试中使用流的答案,其工作期限不是实际的网络套接字。
(懒惰地,这个cloudflare blogpost 涵盖了使用截止日期的动机,以及为什么在每个连接的 goroutine 中永远阻塞不是一个可接受的解决方案;但不管那个论点,特别是在这种情况下,我正在寻找一个解决方案 用于测试,我们故意要处理不良连接挂起等边缘情况。)
(注意。这可能看起来像 Simulate a tcp connection in Go 的副本,但请注意,该问题中提出的所有解决方案都没有实现 Deadline 功能,这正是我在这里询问如何测试的具体内容)
【问题讨论】:
-
为什么不能使用网络连接?大多数需要 net.Conn 的测试都使用一个,通常是测试控制下的另一个本地端点。
-
你要查看网卡的日志(以太网/wifi,...)。
-
当你有很多很多测试时,每个测试使用一个实际的网络端口肯定不会扩展吗? (并行运行......)你做什么,选择一个随机端口并希望?分配一个端口池并乐观地绑定端口,直到找到一个空闲的端口?
-
你让操作系统为你绑定端口。
-
第 1 步:重构,您的代码仅使用 Conn 接口 (golang.org/pkg/net/#Conn) 第 2 步:实现 Conn 接口以进行测试 第 3 步:将实现中的值与预期值进行比较。
标签: unit-testing go