IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> gomonkey测试框架 -> 正文阅读

[开发测试]gomonkey测试框架

1.说明

gomonkey 是 golang 的一款打桩框架,目标是让用户在单元测试中低成本的完成打桩,从而将精力聚焦于业务功能的开发。

参考文档:https://blog.csdn.net/weixin_36163504/article/details/112583704

2.github仓库

https://github.com/agiledragon/gomonkey

3.用法参考

参考:https://blog.csdn.net/u013276277/article/details/104993370

4.使用场景

4.1为函数打桩

注意:下面的文件进行测试时,需要加上参数-gcflags=-l。 原因参考:https://www.jianshu.com/p/19089baf79ca

文件:isConfigFileContain.go

package funmonkey
 
import (
    "fmt"
    "io/ioutil"
    "os"
    "strings"
)
 
// 判断/opt/container/config.properties文件中是否包含str字符串
func isConfigFileContain(str string) (bool, error) {
    defer func() {
        if err := recover(); err != nil {
            fmt.Printf("错误:%v\n", err)
        }
    }()
 
    file, err := os.Open("/opt/container/config.properties")
    if err != nil {
        fmt.Printf("open错误:%v\n", err)
        return false, err
    }
    defer file.Close()
 
    content, err := ioutil.ReadAll(file)
    if err != nil {
        fmt.Printf("ReadAll错误:%v\n", err)
        return false, err
    }
    return strings.Contains(string(content), str), err
}

文件:isConfigFileContain_test.go

package funmonkey
 
import (
    "fmt"
    "io"
    "io/ioutil"
    "os"
    "testing"
    "github.com/agiledragon/gomonkey"
    // "github.com/stretchr/testify/assert"
    . "github.com/smartystreets/goconvey/convey"
)
 
// 用普通的方式测试会找不到文件
// func TestIsConfigFileContain(t *testing.T) {
//  ast := assert.New(t)
//  ast.True(isConfigFileContain("test"))
// }
 
// 以下用monkey patch进行测试
func TestIsConfigFileContain(t *testing.T) {
    Convey("TestIsConfigFileContain", t, func() {
 
        //下面正常逻辑
        Convey("return nil", func() {
            //open返回nil
            patches := gomonkey.ApplyFunc(os.Open, func(_ string) (*os.File, error) {
                return &os.File{}, nil
            })
            defer patches.Reset()
            //readAll返回nil
            patches.ApplyFunc(ioutil.ReadAll, func(_ io.Reader) ([]byte, error) {
                return nil, nil
            })
            flag, err := isConfigFileContain("str")
            So(err, ShouldBeNil)
            So(flag, ShouldEqual, false)
        })
        //返回错误
        Convey("return error when os.open error", func() {
            //open返回error
            patches := gomonkey.ApplyFunc(os.Open, func(str string) (*os.File, error) {
                return nil, fmt.Errorf("os.open panic")
            })
            defer patches.Reset()
            flag, err := isConfigFileContain("str")
            So(err, ShouldNotBeNil)
            So(flag, ShouldEqual, false)
        })
        //返回错误
        Convey("should be return error when ioutil.ReadAll error", func() {
            patches := gomonkey.ApplyFunc(os.Open, func(str string) (*os.File, error) {
                return nil, nil
            })
            defer patches.Reset()
            //readAll返回error
            patches.ApplyFunc(ioutil.ReadAll, func(io.Reader) ([]byte, error) {
                return nil, fmt.Errorf("ioutil.ReadAll panic")
            })
            flag, err := isConfigFileContain("str")
            So(err, ShouldNotBeNil)
            So(flag, ShouldEqual, false)
        })
    })
}

4.2为方法打桩

参考:https://blog.csdn.net/u013276277/article/details/104993370

4.3为变量打桩

文件:one.go

package main
 
import (
    "fmt"
 
    "xorm.io/xorm"
)
 
type Mode struct {
    Id   int64
    Type string
}
type Orm struct {
    *xorm.Engine
}
 
var GDB *Orm
 
func Init() {
    conn := "root" + ":" + "eisoo.com123" + "@tcp(" + "10.2.33.180" + ":" +
        "3306" + ")/" + "metadata" + "?charset=" + "utf8"
    //新建一个连接
    engine := new(xorm.Engine)
    engine, err := xorm.NewEngine("mysql", conn)
    if err != nil {
        fmt.Println(err)
        return
    }
    //开辟空间
    GDB = new(Orm)
    GDB.Engine = engine
}
 
func main() {
    var mode []Mode
    //使用全局变量进行查询
    GDB.Engine.Where("select").Find(&mode)
    fmt.Println(mode)
}

文件:one_test.go

package main
 
import (
    "fmt"
 
    "xorm.io/xorm"
)
 
type Mode struct {
    Id   int64
    Type string
}
type Orm struct {
    *xorm.Engine
}
 
var GDB *Orm
 
func Init() {
    conn := "root" + ":" + "123456" + "@tcp(" + "10.2.33.184" + ":" +
        "3306" + ")/" + "metadata" + "?charset=" + "utf8"
    //新建一个连接
    engine := new(xorm.Engine)
    engine, err := xorm.NewEngine("mysql", conn)
    if err != nil {
        fmt.Println(err)
        return
    }
    //开辟空间
    GDB = new(Orm)
    GDB.Engine = engine
}
 
func main() {
    var mode []Mode
    //使用全局变量进行查询
    GDB.Engine.Where("select").Find(&mode)
    fmt.Println(mode)
}

5.小结

gomonkey能够mock大部分的函数、方法、变量等内容,能够满足大部分mock需求。但是对于需要访问服务器、访问数据库等,就不太好用了。后面将介绍一种针对服务器访问的测试框架,httptest。

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-07-17 12:14:55  更:2021-07-17 12:15:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 11:21:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码