go - 使用 Gingko 和 Gomega 进行异步测试
问题描述
我根据我的要求扩展了以下代码。https://github.com/radovskyb/watcher/blob/master/example/basics/main.go
此代码的目的是监视某些事件(CREATE、WRITE)并据此采取适当的行动。为了测试这段代码,我使用了 Ginkgo 和 Gomega,这就是我寻求帮助的地方。
我正在尝试测试以下代码和平(也在链接中提供),我不确定我应该如何进行。
go func() {
for {
select {
case event := <-w.Event:
fmt.Println(event) // Print the event's info.
case err := <-w.Error:
log.Fatalln(err)
case <-w.Closed:
return
}
}
}()
我检查了一下,Gomega 支持支持“通道”的异步测试,但我尝试了几件事,但最终初始化了需要触发实际事件进行测试的新观察者对象。我试图创建“tempDir”,这样我就可以触发 CRETE / WRITE 事件,然后关闭通道,但它没有帮助,在运行这个特定的测试之后,它只是等待通道关闭。
w := watcher.New()
w.FilterOps(watcher.Create, watcher.Write)
dir, err := ioutil.TempDir("", "watcher2")
Expect(err).To(BeNil())
defer os.RemoveAll(dir)
tmpfile := filepath.Join(dir, "watcherremoved")
err = ioutil.WriteFile(tmpfile, []byte("init"), 0666)
Expect(err).To(BeNil())
event := <-w.Event
Eventually(event.Path).Should(Equal(ADMIN_VAULT))
<-w.Closed
解决方案
测试类型很少
单元测试
此方法测试一段代码。例如功能甚至部分功能。
视角:功能用户(开发者)
行为测试
这只是黑盒测试,您测试整个功能的行为(有时是其中的一部分)。
视角:模块用户
端到端测试
这是测试整个程序工作流程。
视角:程序用户
当然还有更多的测试类型,但是这 3 种会告诉你一个基本的区别。
前两种测试类型需要有一些模块,可以在代码中重用。所以这意味着,您可以在实际生产代码和测试场景中使用这个模块。
测试看起来像:
编写测试 -> 运行测试函数(传递参数并获取结果) -> 验证结果。
第三个只是您编译并启动它的程序,通过所有步骤并验证它们是否正常。
您的代码在测试方面非常糟糕。您不能重用代码的任何部分,因为您在主函数中拥有一切。
所以测试过程如下:
编译程序 -> 运行程序(带有一些参数) -> 与程序交互 -> 抓取输出 -> 分析收集的输出。
所以测试你的代码的解决方案是重构它。学习编写可测试的代码还有很长的路要走。
为了提高您的技能,您可以查看一些开源代码。
但我的建议是,你可以买这本书然后写。这将向您展示可测试代码的基础知识。这本书太棒了,这是 IT 世界的经典之作。
书:
Test Driven Development
by Kent Beck
ISBN 13: 9780321146533
ISBN 10: 0321146530
推荐阅读
- c++ - 当有同名文件时,我想覆盖文件。(C++ 文件.write)
- github-api - AppCenter Webhook 请求的“签名无效”消息
- amazon-web-services - 已安排 EC2 持久性实例停用
- python-3.x - 刮掉class下br标签下的文字
- python - 如何在 jupyterlab 中缩放图表
- angular - HttpClient 在 RESTful API 上无法正常工作
- javascript - 使用 javascript/jquery 在一个函数中编写多个按钮
- php - 使用 PHP 数组数据将多个 foreach MySQL insert 语句合并为一个
- javascript - 使用“成功/错误”捕获 DataTable JSON/AJAX GET 是否正确填充
- amazon-web-services - AWS S3 自动对象键名规范化为小写