go unit test-monkey
package main
import (
"fmt"
"github.com/bouk/monkey"
"os"
"os/exec"
"reflect"
"testing"
)
// 假如我们要测试函数 call
func call(cmd string) (int, string) {
bytes, err := exec.Command("sh", "-c", cmd).CombinedOutput()
output := string(bytes)
if err != nil {
return 1, reportExecFailed(output)
}
return 0, output
}
// 上面的函数会调用它,这个函数一定要mock掉!
func reportExecFailed(msg string) string {
os.Exit(1) // 讨人嫌的副作用
return msg
}
func TestExecSussess(t *testing.T) {
// 恢复 patch 修改
// 实际使用中会把 UnpatchAll 放到 teardown 函数里
// 不过在 go 自带的 testing 里就这么处理了
defer monkey.UnpatchAll()
// mock 掉 exec.Command 返回的 *exec.Cmd 的 CombinedOutput 方法
monkey.PatchInstanceMethod(
reflect.TypeOf((*exec.Cmd)(nil)),
"CombinedOutput", func(_ *exec.Cmd) ([]byte, error) {
return []byte("results"), nil
},
)
// mock 掉 reportExecFailed 函数
monkey.Patch(reportExecFailed, func(msg string) string {
return msg
})
rc, output := call("any")
if rc != 0 {
t.Fail()
}
if output != "results" {
t.Fail()
}
}
func TestExecFailed(t *testing.T) {
defer monkey.UnpatchAll()
// 上次 mock 的是执行成功的情况,这一次轮到执行失败
monkey.PatchInstanceMethod(
reflect.TypeOf((*exec.Cmd)(nil)),
"CombinedOutput", func(_ *exec.Cmd) ([]byte, error) {
return []byte(""), fmt.Errorf("sth bad happened")
},
)
monkey.Patch(reportExecFailed, func(msg string) string {
return msg
})
rc, output := call("any")
if rc != 1 {
t.Fail()
}
if output != "" {
t.Fail()
}
}
=====================================
package main
import (
"fmt"
"github.com/bouk/monkey"
"strings"
)
func main() {
var guard *monkey.PatchGuard
guard = monkey.Patch(fmt.Println, func(a ...interface{}) (n int, err error) {
s := make([]interface{}, len(a))
for i, v := range a {
s[i] = strings.Replace(fmt.Sprint(v), "hell", "*bleep*", -1)
}
// 以下代码等价于
// guard.Unpatch()
// defer guard.Restore()
// return fmt.Println(s...)
guard.Unpatch()
n, err = fmt.Println(s...)
guard.Restore()
return
})
fmt.Println("what the hell?") // what the *bleep*?
fmt.Println("what the hell?") // what the *bleep*?
}
go unit test-monkey的更多相关文章
- 【初学python】使用python调用monkey测试
目前公司主要开发安卓平台的APP,平时测试经常需要使用monkey测试,所以尝试了下用python调用monkey,代码如下: import os apk = {'j': 'com.***.test1 ...
- ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12.ABP领域层——工作单元(Unit Of work) ABP是“ASP.NET Boilerplate Pr ...
- ABP源码分析十:Unit Of Work
ABP以AOP的方式实现UnitOfWork功能.通过UnitOfWorkRegistrar将UnitOfWorkInterceptor在某个类被注册到IOCContainner的时候,一并添加到该类 ...
- Failed to stop iptables.service: Unit iptables.service not loaded.
redhat 7 [root@lk0 ~]# service iptables stop Redirecting to /bin/systemctl stop iptables.service Fai ...
- Monkey Patch/Monkey Testing/Duck Typing/Duck Test
Monkey Patch Monkey Testing Duck Typing Duck Test
- VS2012 Unit Test 个人学习汇总(含目录)
首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualStudio.TestTools.UnitTesting.a ...
- VS2012 Unit Test —— 我对IdleTest库动的大手术以及对Xml相关操作进行测试的方式
[1]我的IdleTest源码地址:http://idletest.codeplex.com/ [2]IdleTest改动说明:2013年10月份在保持原有功能的情况下对其动了较大的手术,首先将基本的 ...
- VS2012 Unit Test——Microsoft Fakes入门
如题,本文主要作为在VS2012使用Fakes的入门示例,开发工具必须是VS2012或更高版本. 关于Fakes的MSDN地址:http://msdn.microsoft.com/en-us/libr ...
- monkey命令选项参考
基本参数: --help 打印帮助消息 -v 可以在命令行中出现多次,每次一个-V选项都会增加monkey向命令行打印输出的详细级别.默认的级别0只会打印启动信息. ...
- MTU(Maximum transmission unit) 最大传输单元
最大传输单元(Maximum transmission unit),以太网MTU为1500. 不同网络MTU如下: 如果最大报文数据大小(MSS)超过MTU,则会引起分片操作. 路径MTU: 网路 ...
随机推荐
- flask第十九篇——模板【3】
请关注微信公众号:自动化测试实战 今天我们继续模板的知识,现在我们增加字典的复杂度,这个时候在render_template第二个参数可以传**title,以后我们会用**context代替原来的ti ...
- 《selenium2 python 自动化测试实战》(14)——下载文件
说下载文件之前,我再和大家说一下用cookie登录的事,既然我们用cookie登录,那么传过去的cookie肯定是要和对应的网站完全一致的,注意,是包括大小写哦,本来我也是不知道,我用这个方法登录自己 ...
- 接口测试框架——第四篇-url、excel内容等
到现在为止,发送邮件(email_module).读excel(excel_module).发送requests(requests_module).常量(setting)我们都已经完成了,看看第一篇中 ...
- jest js 测试框架-简单方便人性化
1. 安装 yarn global add jest-cli or npm install -g jest-cli 备注:可以安装为依赖不用全局安装 2. 项目代码 a. 项目初始化 yarn ini ...
- cnpm 私服搭建(基于docker)
备注: 使用docker-compose 进行安装 1. 代码clone git clone https://github.com/cnpm/cnpmjs.org.git 2. docker bu ...
- 福勒(Martin Fowler)
福勒(Martin Fowler),在面向对象分析设计.UML.模式.软件开发方法学.XP.重构等方面,都是世界顶级的专家,现为Thought Works公司的首席科学家.Thought Works是 ...
- bzoj 3779 重组病毒——LCT维护子树信息
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3779 调了很久……已经懒得写题解了.https://www.cnblogs.com/Zinn ...
- golang的sync包例子
package main import ( "fmt" "sync" ) var wg sync.WaitGroup func asyncTestFunc() ...
- C# 中的委托和事件(1)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- UI“三重天”之实践Uiautomator1
说起来Uiautomator也有一年没碰过了.借此来回顾.总结一下. 也是阅读<精通APP自动化测试>一书.实践出真知的一个框架.编写了部分移动端UI自动化脚本.后续再深入学习. 虽然现在 ...