安利一个好用的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 就不在此列举。可以在官网上翻翻,让写单元测试更简单。

目录
相关文章
|
26天前
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
81 8
|
1月前
|
人工智能 JavaScript 前端开发
自动化测试框架的演进与实践###
本文深入探讨了自动化测试框架从诞生至今的发展历程,重点分析了当前主流框架的优势与局限性,并结合实际案例,阐述了如何根据项目需求选择合适的自动化测试策略。文章还展望了未来自动化测试领域的技术趋势,为读者提供了宝贵的实践经验和前瞻性思考。 ###
|
2月前
|
人工智能 监控 测试技术
探索软件测试中的自动化框架选择与优化策略####
【10月更文挑战第21天】 本文深入剖析了软件测试领域面临的挑战,聚焦于自动化测试框架的选择与优化这一核心议题。不同于传统摘要的概述方式,本文将以一个虚拟案例“X项目”为线索,通过该项目从手动测试困境到自动化转型的成功历程,生动展现如何根据项目特性精准匹配自动化工具(如Selenium、Appium等),并结合CI/CD流程进行深度集成与持续优化,最终实现测试效率与质量的双重飞跃。读者将跟随“X项目”团队的视角,直观感受自动化框架选型的策略性思考及实践中的优化技巧,获得可借鉴的实战经验。 ####
38 0
|
9天前
|
数据采集 人工智能 自然语言处理
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
Midscene.js 是一款基于 AI 技术的 UI 自动化测试框架,通过自然语言交互简化测试流程,支持动作执行、数据查询和页面断言,提供可视化报告,适用于多种应用场景。
103 1
Midscene.js:AI 驱动的 UI 自动化测试框架,支持自然语言交互,生成可视化报告
|
22天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
54 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
27天前
|
安全 Ubuntu Linux
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
44 9
Metasploit Pro 4.22.6-2024111901 (Linux, Windows) - 专业渗透测试框架
|
2月前
|
Java 测试技术 API
探索软件测试中的自动化框架选择####
在当今快节奏的软件开发周期中,自动化测试已成为确保产品质量与加速产品迭代的关键策略。本文深入剖析了自动化测试的核心价值,对比分析了市场上主流的自动化测试框架,旨在为项目团队提供选型时的考量因素及实践指南,助力高效构建适应未来变化的自动化测试体系。 ####
|
1月前
|
Java 测试技术 API
探索软件测试中的自动化测试框架
本文深入探讨了自动化测试在软件开发中的重要性,并详细介绍了几种流行的自动化测试框架。通过比较它们的优缺点和适用场景,旨在为读者提供选择合适自动化测试工具的参考依据。
|
1月前
|
jenkins 测试技术 持续交付
自动化测试框架的搭建与实践
在软件开发领域,自动化测试是提升开发效率、确保软件质量的关键手段。本文将引导读者理解自动化测试的重要性,并介绍如何搭建一个基本的自动化测试框架。通过具体示例和步骤,我们将探索如何有效实施自动化测试策略,以实现软件开发流程的优化。
70 7
|
1月前
|
数据管理 jenkins 测试技术
自动化测试框架的设计与实现
在软件开发周期中,测试是确保产品质量的关键步骤。本文通过介绍自动化测试框架的设计原则、组件构成以及实现方法,旨在指导读者构建高效、可靠的自动化测试系统。文章不仅探讨了自动化测试的必要性和优势,还详细描述了框架搭建的具体步骤,包括工具选择、脚本开发、执行策略及结果分析等。此外,文章还强调了持续集成环境下自动化测试的重要性,并提供了实际案例分析,以帮助读者更好地理解和应用自动化测试框架。