go - GO 在测试设置方法中附加标准输入
问题描述
我正在使用内置testing
模块来运行我在 GO 项目中进行的一些功能测试。在我的项目中,我有外部依赖项,我在我的TestMain
方法中连接到这些依赖项。我将这些连接保存到变量中,然后我在测试中使用这些变量,并且连接可能需要很长时间才能正确建立(Kafka 有人吗?)。我想按需运行测试,但是在设置了这些变量之后。
stdin
所以我想要的是在我的函数中收听TestMain
并运行或退出测试。但我希望它由用户控制,这样我就可以设置我的测试环境,并且测试将在我的命令下运行。
但可悲的是,似乎在运行时go test ...
直接stdin
映射到/dev/null
. 因此,当我尝试阅读时os.Stdin
,会出现EOF
错误。最低限度的代码是:
package tests
import (
"bufio"
"fmt"
"os"
"testing"
)
func TestMain(m *testing.M) {
reader := bufio.NewReader(os.Stdin)
if input, err := reader.ReadString('\n'); err != nil {
fmt.Println(err)
fmt.Println("-----------")
fmt.Println(input)
os.Exit(1)
}
fmt.Println("ESCAPED!")
os.Exit(m.Run())
}
我已经在圈子中阅读了如何模拟单元测试和排序,但我的案例更多的是功能测试运行器。有没有办法,甚至是一些诡计,可以让我打开或更改测试过程stdin
?
解决方案
您可以重定向os.Stdin
,但它取决于操作系统:
package tests
import (
"fmt"
"os"
"testing"
"bufio"
"runtime"
)
func TestMain(m *testing.M) {
var ttyName string
if runtime.GOOS == "windows" {
ttyName = "con"
} else {
ttyName = "/dev/tty"
}
f, err := os.Open(ttyName)
if err != nil {
panic(err)
}
defer f.Close()
oldStdin := os.Stdin
defer func() { os.Stdin = oldStdin }()
os.Stdin = f
reader := bufio.NewReader(os.Stdin)
if input, err := reader.ReadString('\n'); err != nil {
fmt.Println("Error:", err)
fmt.Println("-----------")
fmt.Println(input)
os.Exit(1)
}
fmt.Println("ESCAPED!")
os.Exit(m.Run())
}
func TestHello(t *testing.T){
fmt.Println("Hello")
}
推荐阅读
- r - 使打印(在真实的、有形的纸上)更漂亮的 Rmd 的方法?
- angular - 添加组件内容时,Angular7 Material7.3侧边栏切换停止工作
- java - 如何以编程方式独立于选项卡指示器位置突出显示 TabLayout 的选项卡
- ios - BLE 外设无广告
- jquery - 从 CDN 切换到本地托管文件后,DataTables 缺少排序图标
- html - 如何撤消 CSS 规则?
- grails - 如何在 Grails / Spock 测试中打印响应而不是:org.grails.plugins.testing.GrailsMockHttpServletResponse@62c0fcae
- apache-kafka - kafka流如何计算水印?
- bash - Swizzle Shell 命令
- c# - 选择打印机名称而不显示 PrintDialog