Golang测试方法(一)

本篇文章内容来源于Golang核心开发组成员Andrew Gerrand在Google I/O 2014的一次主题分享“Testing Techniques”,即介绍使用Golang开发 时会使用到的测试技术(主要针对单元测试),包括基本技术、高级技术(并发测试、mock/fake、竞争条件测试、并发测试、内/外部测 试、vet工具等)等,感觉总结的很全面,这里整理记录下来,希望能给大家带来帮助。原Slide访问需要自己搭梯子。另外这里也要吐槽一 下:Golang官方站的slide都是以一种特有的golang artical的格式放出的(用这个工具http://go-talks.appspot.com/可以在线观看),没法像pdf那样下载,在国内使用和传播极其不便。

一、基础测试技术

  • 1、测试Go代码

Go语言内置测试框架。

内置的测试框架通过testing包以及go test命令来提供测试功能。

下面是一个完整的测试strings.Index函数的完整测试文件:

//strings_test.go (这里样例代码放入strings_test.go文件中)
package strings_test

import (
    "strings"
    "testing"
)

func TestIndex(t *testing.T) {
    const s, sep, want = "chicken", "ken", 4
    got := strings.Index(s, sep)
    if got != want {
        t.Errorf("Index(%q,%q) = %v; want %v", s, sep, got, want)//注意原slide中的got和want写反了
    }
}

如下:

$go test -v strings_test.go
=== RUN TestIndex
— PASS: TestIndex (0.00 seconds)
PASS
ok      command-line-arguments    0.007s

go test的-v选项是表示输出详细的执行信息。

将代码中的want常量值修改为3,我们制造一个无法通过的测试:

$go test -v strings_test.go
=== RUN TestIndex
— FAIL: TestIndex (0.00 seconds)
    strings_test.go:12: Index("chicken","ken") = 4; want 3
FAIL
exit status 1
FAIL    command-line-arguments    0.008s
  • 2、表驱动测试

Golang的struct字面值(struct literals)语法让我们可以轻松写出表驱动测试。

package strings_test

import (
        "strings"
        "testing"
)

func TestIndex(t *testing.T) {
        var tests = []struct {
                s   string
                sep string
                out int
        }{
                {"", "", 0},
                {"", "a", -1},
                {"fo", "foo", -1},
                {"foo", "foo", 0},
                {"oofofoofooo", "f", 2},
                // etc
        }
        for _, test := range tests {
                actual := strings.Index(test.s, test.sep)
                if actual != test.out {
                        t.Errorf("Index(%q,%q) = %v; want %v",
                             test.s, test.sep, actual, test.out)
                }
        }
}

结果如下:

$go test -v strings_test.go
=== RUN TestIndex
— PASS: TestIndex (0.00 seconds)
PASS
ok      command-line-arguments    0.007s
  • 3、T结构

*testing.T参数用于错误报告:

t.Errorf("got bar = %v, want %v", got, want)
t.Fatalf("Frobnicate(%v) returned error: %v", arg, err)
t.Logf("iteration %v", i)

也可以用于enable并行测试(parallet test):
t.Parallel()

控制一个测试是否运行:

if runtime.GOARCH == "arm" {
    t.Skip("this doesn't work on ARM")
}
  • 4、运行测试

我们用go test命令来运行特定包的测试。

默认执行当前路径下包的测试代码。

$ go test
PASS

$ go test -v
=== RUN TestIndex
— PASS: TestIndex (0.00 seconds)
PASS

要运行工程下的所有测试,我们执行如下命令:

$ go test github.com/nf/…

标准库的测试:
$ go test std

注:假设strings_test.go的当前目录为testgo,在testgo目录下执行go test都是OK的。但如果我们切换到testgo的上一级目录执行go test,我们会得到什么结果呢?

$go test testgo
can't load package: package testgo: cannot find package "testgo" in any of:
    /usr/local/go/src/pkg/testgo (from $GOROOT)
    /Users/tony/Test/GoToolsProjects/src/testgo (from $GOPATH)

提示找不到testgo这个包,go test后面接着的应该是一个包名,go test会在GOROOT和GOPATH下查找这个包并执行包的测试。

  • 5、测试覆盖率

go tool命令可以报告测试覆盖率统计。

我们在testgo下执行go test -cover,结果如下:

go build _/Users/tony/Test/Go/testgo: no buildable Go source files in /Users/tony/Test/Go/testgo
FAIL    _/Users/tony/Test/Go/testgo [build failed]

显然通过cover参数选项计算测试覆盖率不仅需要测试代码,还要有被测对象(一般是函数)的源码文件。

我们将目录切换到$GOROOT/src/pkg/strings下,执行go test -cover:

$go test -v -cover
=== RUN TestReader
— PASS: TestReader (0.00 seconds)
… …
=== RUN: ExampleTrimPrefix
— PASS: ExampleTrimPrefix (1.75us)
PASS
coverage: 96.9% of statements
ok      strings    0.612s

go test可以生成覆盖率的profile文件,这个文件可以被go tool cover工具解析。

在$GOROOT/src/pkg/strings下面执行:

$ go test -coverprofile=cover.out

会再当前目录下生成cover.out文件。

查看cover.out文件,有两种方法:

a) cover -func=cover.out

$sudo go tool cover -func=cover.out
strings/reader.go:24:    Len                66.7%
strings/reader.go:31:    Read                100.0%
strings/reader.go:44:    ReadAt                100.0%
strings/reader.go:59:    ReadByte            100.0%
strings/reader.go:69:    UnreadByte            100.0%
… …
strings/strings.go:638:    Replace                100.0%
strings/strings.go:674:    EqualFold            100.0%
total:            (statements)            96.9%

b) 可视化查看

执行go tool cover -html=cover.out命令,会在/tmp目录下生成目录coverxxxxxxx,比如/tmp/cover404256298。目录下有一个 coverage.html文件。用浏览器打开coverage.html,即可以可视化的查看代码的测试覆盖情况。

关于go tool的cover命令,我的go version go1.3 darwin/amd64默认并不自带,需要通过go get下载。

$sudo GOPATH=/Users/tony/Test/GoToolsProjects go get code.google.com/p/go.tools/cmd/cover

下载后,cover安装在$GOROOT/pkg/tool/darwin_amd64下面。

GitLab5.0安装全过程(转)

GitLab5发布快一个月了,决定试用下,5.0最大的特性就是用GitLab-Shell取代了Gitolite,这大大降低了安装难度,不多本人在安装过程中还是越到了一些问题,所以记录下来供要安装GitLab5的朋友参考!

- 阅读剩余部分 -

总结一些常用的MYSQL查询语句,供备忘

mysql语句基础。

- 阅读剩余部分 -

OAuth 2.0规范中文翻译版,提供下载

OAuth协议致力于使网站和应用程序(统称为消费方)能够在无须用户透露其认证证书的情况下,通过API访问某个web服务(统称为服务提供方)的受保护资源。更一般地说,OAuth为API认证提供了一个可自由实现且通用的方法。这是OAUTH2.0的规范,新浪微博和人人网都在用。 点击下载 : OAuth_2.0_中文译本

MacType对于前端设计的影响,附下载地址

对比参照正在浏览这里的你,你会发现MacType会让前端设计师对自己设计的页面的认知上造成一定的影响,这点很不好...   MacTypeInstaller_2012_0406_0用下载工具为佳

记在nginx上安装wordpress超级擦车,顺带实现rewrite

标题喜感一些~ 呵呵,其实就是WP SUPER CACHE 这个插件 众所周知WP自身没有缓存机制,这是让人多么蛋疼的一件事情啊~,程序本身做大以后就已经臃肿得让人受不了了,而且这丫居然没缓存,我这个前端CSS<8K,JQ调用SAE的小博客的速度都让人要抓狂了,何况那些装了若干插件的呢. 所以今天没办法啦,必须要好博客好好整一整了. 比较影响速度的因素有: 1. 后台(PHP+MySQL): 根据请求,运行语句,操作数据库,生成页面返回

效率低的或查询量大会让cpu飙升2. 线路Ping 命令大家都会用,这时间就代表一个来回
(Ping偶尔会Timeout超时,也就是所谓的丢包,常规原因有2种:真丢,假丢 ; 例如有些服务器设置侦测到集中密集的ICMP包会选择性的丢弃掉 ;10次里丢1次完全不同于10次访问有一次打不开,网页是走 TCP/IP 需要3次握手 .Ping 相对重要的参数就是时间了,国外一般200-300ms左右,国内一般100内)3. 前台: 闻名的 yslow 34 rules, 做了这些简单的调整, 可以明显的提速25%-50%

- 阅读剩余部分 -

程序猿 技术不是你的全部

这是一位前辈写的。 在学校的时候,曾一度的迷恋技术,认为掌握了技术后就非常牛X,可以到外面做些项目,从中获取一些报酬,自己更是乐此不疲。并且认为看了很多的技术书籍,学了很多的语言,看了许多牛X技术的底层原理,就自认为自己在这方面是专家权威,高智商的人。当然,可能你希望大家叫你大神、大牛、精英、前辈,自己的虚荣心都得到了小小的满足。

  千万不要认为技术牛X了就可以从屌丝变身高富帅,不懂技术的人没有前途 总所周知,程序猿是一个高薪的职业。但是,只有你真正的进入这个行业你才清楚,这个看上去还不错的薪水,你却付出了超过薪水价值的代价。创业型与游戏型公司里面的项目小组一般是5~10个人,因为他们需要快速的开发以应对多变的市场波动,所以程序猿的每天工作时长都在12小时以上,身体和精神收到摧残不说。作为程序猿的你很少有时间去陪陪自己的家人、自己的女友。除了自己工作和技术上的朋友,很少有时间去拓宽自己的朋友圈。久而久之,很多程序猿不爱说话,不爱出门,最终成为宅男。每当想出去走走,散散心,体会体会下什么才是生活而不是生存,你会发现你不仅没有时间,连个志同道合的朋友都找不出来。 反而一些整天跑市场、接待客户的人,在其中锻炼出来了自己的口才,拓展了自己的交际圈,相信假以时日他们必定能够成就一番事业。

- 阅读剩余部分 -

一个十分详细实用的的换轴视频(带钢板)适用于凯酷,plu


sftp使用方法

sftp ipv4地址 或者sftp [ipv6地址 ] 输入密码: lcd lls 等是对当前服务器进行操作 cd ls 等是对远程的服务器进行操作 put是将当前服务器文件夹内的某一个文件发送到远程服务器当前的目录下

- 阅读剩余部分 -

Linux svn 使用

svn add values/strings.xml //--添加 svn st //--查看状态 svn ci //--提交 svn ci -m "svn ci, permission" 1、 将文件checkout到本地目录

svn checkout path(path是服务器上的目录) 例如:svn checkout svn: // 192.168.1.1 / pro / domain 简写:svn co

2、 往版本库中添加新的文件

svn add file 例如:svn add test.php(添加test.php) svn add * .php(添加当前目录下所有的php文件)

- 阅读剩余部分 -

PhpStorm使用记录

Linux下(目前我用的是archlinix,不知道在ubuntu/opensuse等下面情况怎么?),默认字体很模糊。 看了下其启动脚本,发现linux版的phpstorm用的是系统的JRE,并不像在windows下面用的是自带JRE的。 因此,系统中JRE的字体配置会影响到phpstorm,如果你在编辑器中使用的是JRE中的虚拟字体(如monospaced等)的话。 由于我先前调netbeans时已经把monospaced映射到DejaVu Sans Mono了,因此,这里直接在编辑器的配置那里把字体选为monospaced.用虚拟字体的好处是中文与英文可以用不同的字体呈现。 解决字体模糊问题的办法: 开启JVM的反锯齿项:

cd /opt/PhpStorm/bin/
sudo cp PhpStorm.vmoptions PhpStorm.vmoptions.orig
sudo vim  PhpStorm.vmoptions

  加上如下选项:

- 阅读剩余部分 -