• 盘点Golang测试相关库


    go-check

    https://github.com/go-check/check

    gocheck是一个单元测试框架,在golang官方的testing package之上丰富了很多功能,不久我介绍过Golang官方的单元测试框架,功能确实比较简陋。gocheck在此基础上提供了一些特性:

    丰富了assert 断言 + 判断动词: deep multi-type 对比,字符串比较以及正则匹配。
    按suite组织测试用例,支持suite级别的 setup() 和 teardown()。
    对于临时文件支持创建、删除临时文件和目录。

    示例:

    package test
    
    import (
     "io"
     "testing"
    
     . "gopkg.in/check.v1"
    )
    
    //继承testing的方法,可以直接使用go test命令运行
    func Test(t *testing.T) {
     TestingT(t)
    }
    
    // 创建测试套件结构体
    type MySuite struct{}
    
    var _ = Suite(&MySuite{})
    
    func (s *MySuite) TestHelloWorld(c *C) {
     c.Assert(42, Equals, "42")
     c.Assert(io.ErrClosedPipe, ErrorMatches, "io: .*on closed pipe")
     c.Check(42, Equals, 42)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    requests

    https://github.com/asmcos/requests

    https://github.com/wangluozhe/requests

    Golang自带的有 net/http包来发送HTTP请求,对于用过requests(python)的人就很难用了;requests是python下面的明星项目,其设计争相被其他语言模仿,我找到了两个golang下面的模仿项目。

    示例1(asmcos/requests)

    package main
    
    import "github.com/asmcos/requests"
    
    
    func main (){
    
        data := requests.Datas{
          "name":"requests_post_test",
        }
        resp,_ := requests.Post("https://www.httpbin.org/post",data)
        println(resp.Text())
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    示例2(wangluozhe/requests)

    package main
    
    import (
     "fmt"
     "github.com/wangluozhe/requests"
     "github.com/wangluozhe/requests/url"
    )
    
    func main() {
     req := url.NewRequest()
     headers := url.NewHeaders()
     headers.Set("User-Agent","123")
     req.Headers = headers
     req.Proxies = "http://127.0.0.1:8888"
     //req := &url.Request{}
     r, _ := requests.Get("https://httpbin.org/get",req)
     //r, _ := requests.Get("https://httpbin.org/get",nil)
     fmt.Println(r.Text)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    selenium

    https://github.com/tebeka/selenium

    selenium对我而言就像一位多年的老友,学习一门语言我一定去看看有没有selenium client支持,那怕第三方的库也成。因为官方没有提供Golang的selenium client, 这个项目是一个第三方库。

    示例

    package main
    
    import (
     "fmt"
     "os"
     "time"
    
     "github.com/tebeka/selenium"
    )
    
    const (
     chromeDriverPath = "D:\\webdriver\\chromedriver.exe"
     port             = 8080
    )
    
    func main() {
     // Start a WebDriver server instance
     opts := []selenium.ServiceOption{
      selenium.Output(os.Stderr), // Output debug information to STDERR.
     }
     selenium.SetDebug(true)
     service, err := selenium.NewChromeDriverService(chromeDriverPath, port, opts...)
     if err != nil {
      panic(err) // panic is used only as an example and is not otherwise recommended.
     }
     defer service.Stop()
    
     // Connect to the WebDriver instance running locally.
     caps := selenium.Capabilities{"browserName": "chrome"}
     wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
     if err != nil {
      panic(err)
     }
     defer wd.Quit()
    
     // Navigate to the simple playground interface.
     if err := wd.Get("https://cn.bing.com/"); err != nil {
      panic(err)
     }
    
     time.Sleep(time.Duration(2) * time.Second)
    
     // Get a reference to the text box containing code.
     elem, err := wd.FindElement(selenium.ByCSSSelector, "#sb_form_q")
     if err != nil {
      panic(err)
     }
     // Remove the boilerplate code already in the text box.
     if err := elem.Clear(); err != nil {
      panic(err)
     }
    
     // Enter some new code in text box.
     err = elem.SendKeys(`go selenium`)
     if err != nil {
      panic(err)
     }
     time.Sleep(time.Duration(2) * time.Second)
    
     if err := elem.SendKeys(selenium.EnterKey); err != nil {
      panic(err)
     }
    
     time.Sleep(time.Duration(2) * time.Second)
    
     title, err := wd.Title()
     fmt.Println("title", title)
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    playwright

    https://github.com/playwright-community/playwright-go

    playwright是巨硬(微软)公司推出的开源Web自动化功能,官方同样没提供Golang的playwright,我也找到了一个用Golang实现playwright。

    示例

    package main
    
    import (
     "fmt"
     "log"
    
     "github.com/playwright-community/playwright-go"
    )
    
    func main() {
     pw, err := playwright.Run()
     if err != nil {
      log.Fatalf("could not start playwright: %v", err)
     }
     browser, err := pw.Chromium.Launch()
     if err != nil {
      log.Fatalf("could not launch browser: %v", err)
     }
     page, err := browser.NewPage()
     if err != nil {
      log.Fatalf("could not create page: %v", err)
     }
     if _, err = page.Goto("https://news.ycombinator.com"); err != nil {
      log.Fatalf("could not goto: %v", err)
     }
     entries, err := page.QuerySelectorAll(".athing")
     if err != nil {
      log.Fatalf("could not get entries: %v", err)
     }
     for i, entry := range entries {
      titleElement, err := entry.QuerySelector("td.title > span > a")
      if err != nil {
       log.Fatalf("could not get title element: %v", err)
      }
      title, err := titleElement.TextContent()
      if err != nil {
       log.Fatalf("could not get text content: %v", err)
      }
      fmt.Printf("%d: %s\n", i+1, title)
     }
     if err = browser.Close(); err != nil {
      log.Fatalf("could not close browser: %v", err)
     }
     if err = pw.Stop(); err != nil {
      log.Fatalf("could not stop Playwright: %v", err)
     }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    webdriverAgent

    https://github.com/ElectricBubble/gwda

    这是用Golang实现的WebdriverAgent,做iOS移动自动化测试的同学我想对 webdriverAgent 并不陌生。在testerhome看到有同学分享的,这就是有意义的好轮子,嗯!

    示例

    package main
    
    import (
     "github.com/electricbubble/gwda"
     "log"
    )
    
    func main() {
     // var urlPrefix = "http://localhost:8100"
     // The function may also require 'iproxy 8100 8100' to forward the device port first
     // driver, _ := gwda.NewDriver(nil, urlPrefix)
    
     // Connect devices via USB
     driver, _ := gwda.NewUSBDriver(nil)
    
     log.Println(driver.IsWdaHealthy())
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    sib

    https://github.com/SonicCloudOrg/sonic-ios-bridge

    sonic-ios-bridge 是基于 gidevice 作为底层iOS通信协议,在此基础上丰富了周边辅助功能,如自动挂载开发者镜像、wda安装检测、iOS型号映射、命令行直接使用等等。以打造跨平台执行xctest、WebDriverAgentRunner、性能监听等等特色功能的命令行iOS调试工具。

    这是用Golang实现的一个命令行工具,了解过 sonic 云真机平台的同学应该对他不陌生。

    命令用法

    # 运行 wda
    > sib run wda -b your.wda.bundleId
    > sib run xctest -b your.wda.bundleId
    
    # 查看app列表
    > sib app list
    
    # 启动 app
    > sib app launch
    
    # 驱动监听
    > sib devices listen
    
    # 卸载app
    > sib app uninstall
    
    # 截图
    > sib screenshoot
    
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    goc

    https://github.com/qiniu/goc/

    goc 是专为 Go 语言打造的一个综合覆盖率收集系统,尤其适合复杂的测试场景,比如系统测试时的代码覆盖率收集以及精准测试。

    如果需要做go语言的代码覆盖率的话,他一定是一个很好的选择。

    goc同样以命令的方式提供功能。

    运行 goc server 命令启动一个服务注册中心:

    simple-go-server git:(master) ✗ goc server
    
    • 1

    运行 goc build 命令编译目标服务,然后启动插过桩的二进制。下面以 simple-go-server 工程为例:

    simple-go-server git:(master) ✗ goc build .
    ... // omit logs
    simple-go-server git:(master) ✗ ./simple-go-server  
    
    • 1
    • 2
    • 3

    运行 goc profile 命令收集刚启动的 simple server 的代码覆盖率:

    simple-go-server git:(master) ✗ goc profile
    mode: atomic
    enricofoltran/simple-go-server/main.go:30.13,48.33 13 1
    enricofoltran/simple-go-server/main.go:48.33,50.3 1 0
    enricofoltran/simple-go-server/main.go:52.2,65.12 5 1
    enricofoltran/simple-go-server/main.go:65.12,74.46 7 1
    enricofoltran/simple-go-server/main.go:74.46,76.4 1 0
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    vegeta

    https://github.com/tsenart/vegeta

    vegeta 是Golang实现的一个款HTTP负载测试工具和库。我们公众号专门一篇文章做过介绍。

    vegeta 同样以命令行方式使用。

    示例

    > echo "GET http://localhost:8000/api/user/" | ./vegeta attack -duration=10s| tee results.bin | ./vegeta report
    
    • 1

    goconvey

    https://github.com/smartystreets/goconvey

    goconvey 集成go test,编写行为测试,浏览器中运行测试。简单来说就是一个BDD行为驱动测试库,有意思的一点他会启动一个web服务,通过浏览器查看测试结果。

    示例

    package package_name
    
    import (
        "testing"
        . "github.com/smartystreets/goconvey/convey"
    )
    
    func TestSpec(t *testing.T) {
    
     // Only pass t into top-level Convey calls
     Convey("Given some integer with a starting value", t, func() {
      x := 1
    
      Convey("When the integer is incremented", func() {
       x++
    
       Convey("The value should be greater by one", func() {
        So(x, ShouldEqual, 2)
       })
      })
     })
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    启动服务

    $ $GOPATH/bin/goconvey
    
    • 1

    在浏览器中查看结果
    图片

    总结

    golang的生态还是丰富的,几乎各种需求都能找到对应库。但有不少库的质量堪忧,因为不少项目的维护停留在几个月,甚至好几年前,有种我错过Golang的黄金年代,但其实Golang正在变得越来越多人使用。

    我不会用Golang写自动化测试,看一看 selenium/playwright 的代码,err 的处理真的会让人崩溃,不可否认,Golang在其他方面很棒~!我目前正有在使用Golang写web服务。

    如果你发现Golang还有哪些测试人员会用到的宝藏项目,欢迎在留言~!


    资源分享

    下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    Laravel 博客开发|SEO 友好的 URL
    段码屏学习
    vue beforeEach 路由拦截 cookie 登录管理 jsonwebtoken 表单提交校验 sessionStorage localStorage
    IT硬件故障的主要原因和预防的最佳实践
    Nginx基本知识
    Springboot整合RokectMQ
    C++学习笔记--函数重载(2)
    Maven环境变量配置
    Qt多线程间信号槽传递非QObject类型对象的参数
    USRP 简介,对于NI软件无线电你所需要了解的一切
  • 原文地址:https://blog.csdn.net/wx17343624830/article/details/127687983