golang Subprocess tests

Sometimes you need to test the behavior of a process, not just a function.

func Crasher() {
fmt.Println("Going down in flames!")
os.Exit(1)
}

To test this code, we invoke the test binary itself as a subprocess:

func TestCrasher(t *testing.T) {
if os.Getenv("BE_CRASHER") == "1" {
Crasher()
return
}
cmd := exec.Command(os.Args[0], "-test.run=TestCrasher")
cmd.Env = append(os.Environ(), "BE_CRASHER=1")
err := cmd.Run()
if e, ok := err.(*exec.ExitError); ok && !e.Success() {
return
}
t.Fatalf("process ran with err %v, want exit status 1", err)
}

核心技巧在于os.args[0]可以获取到真实的可执行 test 程序,从而改变环境变量.

最新文章

  1. Swift String类型常规操作
  2. Chrome开发者工具不完全指南(五、移动篇)
  3. php实现设计模式之 解释器模式
  4. java中String、StringBuffer、StringBuilder的区别
  5. JS小数点加减乘除运算后位数增加的解决方案
  6. 当android studio一直显示gradle compile dependency
  7. 文本信息“welcome to java programming!”
  8. .net开发---自定义页面打印区域
  9. python文件目录遍历保存成xml文件代码
  10. 以前学习cisco ccna 课程的时候做的笔记
  11. jmeter 脚本规范
  12. HDU1348 Wall 凸包
  13. Linux tar命令之--exclude参数 排除指定的文件或目录
  14. DIV+CSS初学随记
  15. Mybatis 通用 Mapper 和 Spring 集成
  16. mysql5.7.25安装
  17. 传参导出Excel表乱码问题解决方法
  18. python中的控制流
  19. spring的@Transactional注解详细用法(转载)
  20. delphi IOS 后台状态保存

热门文章

  1. 求分数1+1/2+1/3+.....+1/n的值
  2. Vue.js:表单
  3. CommonJS、CMD和AMD规范分别是什么
  4. 第六章 深入分析ClassLoader工作机制
  5. python's twenty-sixth day for me 模块
  6. 简单的HTTP服务实现
  7. 在CentOS6.x下安装Compiz——桌面立方体,特效种种
  8. pandas map, apply, applymap区别
  9. Django----解决跨域
  10. sql语句in超过1000时的写法