安利一个好用的Golang单元测试框架:gocheck

简介: Golang下如何写单元测试?官方提供的testing package略显简陋,不过好在我们有Gocheck。 ### 什么是好的单元测试? 在进入正题前,先来温习下前人总结的单元测试几条原则: 1 单元测试应该在最低的功能/参数上验证程序的正确性 ... 3 单元测试过后,机器状态保持不变 ... 6 独立性,

Golang下如何写单元测试?官方提供的testing package略显简陋,不过好在我们有Gocheck。

什么是好的单元测试?

在进入正题前,先来温习下前人总结的单元测试几条原则:
http://www.atatech.org/articles/2523

1   单元测试应该在最低的功能/参数上验证程序的正确性
...
3    单元测试过后,机器状态保持不变
...
6    独立性,单元测试的运行/通过/失败不依赖于别的测试,可以人为构造数据,以保持单元测试的独立性。

好的单元测试,应该遵循上面的原则;好的单元测试框架,应该为我们践行这些原则提供方便。

gocheck,简单好用

gocheck官网:http://labix.org/gocheck

Golang官方的testing package算是很弱的了:居然连assert都不支持。Gocheck在testing库之上,丰富了很多功能,带我们脱离Golang官方测试框架下无尽的“if…else…"苦海。尤其好用的特性包括:

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

示例1:文件操作相关的单元测试

“单元测试过后,机器状态保持不变”的原则告诉我们,如果单元测试要读写文件,单元测试结束后要清理创建的临时文件。

gocheck可以创建一个临时目录,在测试结束时自动删除它,省去了手动清理的步骤。

示例:

package hello_test

import (
    "testing"
    "io/ioutil"
    "io"

    . "gopkg.in/check.v1"
)

const txt = "adfagaggafaf"

// Hook up gocheck into the "go test" runner.
func Test(t *testing.T) { TestingT(t) }

type MySuite struct {
    dir string   // 测试用的临时目录
    f   string   // 测试用的临时文件
}

var _ = Suite(&MySuite{})

// Setupsuite 准备测试用的临时文件
func (s *MySuite) SetUpSuite(c *C) {
    dir := c.MkDir()    // Suite结束后会自动销毁c.MkDir()创建的目录

    tmpfile, err := ioutil.TempFile(dir, "")
    if err != nil {
        c.Errorf("Fail to create test file: %v\n", tmpfile.Name(), err)
    }

    err = WriteFile(tmpfile.Name(), txt)
    if err != nil {
        c.Errorf("Fail to prepare test file.%v\n", tmpfile.Name(), err)
    }
    s.dir = dir
    s.f = tmpfile.Name()   
}

func (s *MySuite) TestFoo(c *C) {
    // ... 实际测试代码
    c.Assert(bkpName, Matches, s.f+".ops_agent_bkp.+")
}

示例2:Mock web api相关的单元测试

“独立性”的原则告诉我们,对于需要调用外部api的功能,最好mock数据。利用gocheck的SetUpSuite()和TearDownSuite()方法,可以新建一个http test server,结束时关闭它。

示例:

package hello_test

import (
    "fmt"
    "net/http"
    "net/http/httptest"
    "testing"

    . "gopkg.in/check.v1"
)

const (
    resp1 = `{
   "data" : {
      "cluster" : "*****",
      "hostname" : "xxxxx"
   },
   "err_code" : 0,
   "err_msg" : ""
}
`
    resp2 = `{
   "data" : [
      {
         "hostname" : "e18h13551.XXX",
         "ip" : "100.22.33.44",
         "state" : "GOOD"
      },
      {
         "hostname" : "dddd",
         "ip" : "101.14.12.55",
         "state" : "GOOD"
      }
   ],
   "err_code" : 0,
   "err_msg" : ""
}
`
)

// Hook up gocheck into the "go test" runner.
func Test(t *testing.T) { TestingT(t) }

type MySuite struct {
    ts *httptest.Server
}

func (s *MySuite) SetUpSuite(c *C) {
    h := http.NewServeMux()
    h.HandleFunc("/machine", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, resp1)
    })
    h.HandleFunc("/batch", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, resp2)
    })
    s.ts = httptest.NewServer(h)
}

func (s *MySuite) TearDownSuite(c *C) {
    s.ts.Close()
}

var _ = Suite(&MySuite{})

func (s *MySuite) TestFoo(c *C) {
    // 实际测试代码....
    clusterName, err := getClusterName(s.ts.URL, "/machine")
    c.Assert(err, IsNil)
    c.Assert(clusterName, Equals, "MiniLVSCluster-5e87-2384205713506559")
}

其他

Gocheck其他好用的特性,比如强大的checker 就不在此列举。可以在官网上翻翻,让写单元测试更简单。

目录
相关文章
|
1月前
|
敏捷开发 分布式计算 测试技术
深入理解软件测试中的自动化框架选择与优化策略
【2月更文挑战第29天】 在软件开发的生命周期中,测试环节扮演着至关重要的角色。随着敏捷开发和持续集成的普及,自动化测试成为确保软件质量和加快产品上市速度的关键手段。本文将探讨在构建自动化测试框架时面临的挑战,分析不同类型自动化框架的特点及其适用场景,并提出一系列优化策略,旨在帮助测试工程师提高测试效率,确保测试结果的准确性。
23 0
|
5天前
|
Web App开发 JavaScript 前端开发
深入理解自动化测试框架Selenium的设计与实现
【4月更文挑战第20天】 在软件测试领域,自动化测试已成为提升测试效率和确保产品质量的关键手段。Selenium作为一款广泛使用的开源自动化测试框架,其设计精巧且功能强大,为Web应用提供了一种灵活、高效的测试解决方案。本文将深入探讨Selenium的核心架构与实现细节,解析其如何通过模拟用户操作来执行测试用例,以及它如何适应不断变化的Web技术标准。通过对Selenium内部机制的剖析,旨在帮助测试工程师更好地掌握该工具,并在测试实践中发挥其最大效能。
|
7天前
|
监控 测试技术 数据安全/隐私保护
如何将代理IP集成到自动化测试框架中?
如何将代理IP集成到自动化测试框架中?
|
7天前
|
存储 监控 Go
Golang框架实战-KisFlow流式计算框架(1)-概述
KisFlow是针对缺乏数仓平台但又有实时计算需求的企业的解决方案,它提供分布式批量消费、有状态流式计算、数据流监控和分布式任务调度等功能。通过KisFunction实现业务逻辑复用,减轻对业务数据库的压力。系统包括流式计算层和任务调度层,支持多种数据源和中间件集成。KisConfig用于配置管理,KisFunction是基本计算单元。设计目标是使业务工程师能轻松进行流式计算。项目源码可在GitHub查看:https://github.com/aceld/kis-flow。
36 0
Golang框架实战-KisFlow流式计算框架(1)-概述
|
9天前
|
敏捷开发 监控 前端开发
深入理解自动化测试框架Selenium的架构与实践
【4月更文挑战第16天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加快迭代速度的关键手段。Selenium作为一种广泛使用的自动化测试工具,其开源、跨平台的特性使得它成为业界的首选之一。本文旨在剖析Selenium的核心架构,并结合实际案例探讨其在复杂Web应用测试中的高效实践方法。通过详细解读Selenium组件间的交互机制以及如何优化测试脚本,我们希望为读者提供深入理解Selenium并有效运用于日常测试工作的参考。
14 1
|
10天前
|
自然语言处理 测试技术 API
深入理解自动化测试框架Selenium的设计理念与实践
【4月更文挑战第15天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加速迭代的关键手段。Selenium作为一种广泛使用的自动化测试框架,提供了对多种浏览器和平台的支持,极大地促进了Web应用的功能测试。本文旨在剖析Selenium的核心设计理念,探讨其在实际项目中的应用,并指出常见的误区及最佳实践,以期帮助测试工程师更高效地利用Selenium进行测试工作。
|
11天前
|
监控 测试技术 API
深入理解自动化测试框架Selenium的设计与实现
【4月更文挑战第14天】在软件开发过程中,自动化测试是确保代码质量、减少人工重复劳动的关键步骤。Selenium作为一款广泛使用的自动化测试工具,提供了对多种浏览器和操作系统的支持。本文将探讨Selenium的核心组件及其架构设计,分析其如何通过WebDriver与浏览器交互,以及它如何支持多种编程语言进行脚本编写。同时,我们还将讨论Selenium Grid的作用以及它如何实现并行测试,以缩短测试周期并提高测试效率。
176 59
|
13天前
|
Web App开发 前端开发 Java
框架分析(11)-测试框架
框架分析(11)-测试框架
|
27天前
|
敏捷开发 设计模式 监控
深入理解自动化测试框架的设计原则
在软件开发的复杂多变环境中,自动化测试已成为确保产品质量和加速市场交付的关键步骤。本文将探讨自动化测试框架的设计原则,包括模块化、可扩展性、易用性和可靠性,旨在为软件测试工程师提供构建高效、健壮且易于维护的自动化测试系统的指导。通过分析设计模式的应用,我们将了解如何减少代码冗余,提高测试覆盖率,并适应快速变化的技术要求。
|
28天前
|
前端开发 IDE JavaScript
深入理解自动化测试框架Selenium的设计与实现
本文旨在探讨开源自动化测试框架Selenium的核心设计及其实现机制。通过分析其架构、组件和工作原理,揭示Selenium如何有效地支持跨浏览器、跨平台的自动化Web测试。文中不仅介绍了Selenium的主要功能模块,还详细讨论了其面临的挑战及应对策略,为读者提供了深入了解和使用Selenium的理论基础和实践指导。