【Go命令教程】8. go test
go test 命令用于对 Go 语言编写的程序进行测试。这种测试是以 代码包 为单位的。当然,这还需要测试源码文件的帮助。关于怎样编写并写好 Go 程序测试代码,我们会在本章的第二节加以详述。在这里,我们只讨论怎样使用命令启动测试。
go test 命令会自动测试每一个指定的 代码包。当然,前提是指定的代码包中存在测试源码文件。测试源码文件是名称以“_test.go”为后缀的、内含若干测试函数的源码文件。测试函数一般是以“Test”为名称前缀并有一个类型为“testing.T”的参数声明的函数.
现在,我们来测试 goc2p 项目中的几个代码包。在使用 go test 命令时指定代码包的方式与其他命令无异 —— 使用代码包导入路径。如果需要测试多个代码包,则需要在它们的导入路径之间加入 空格 以示分隔。示例如下:
hc@ubt:~$ go test basic cnet/ctcp pkgtool
ok basic 0.012s
ok cnet/ctcp 2.014s
ok pkgtool 0.014s
go test 命令在执行完所有的代码包中的测试文件之后,会以代码包为单位打印出测试概要信息。在上面的示例中,对应三个代码包的三行信息的第一列都是“ok”。这说明它们都通过了测试。每行的第三列显示运行相应测试所用的时间,以秒为单位。我们还可以在代码包目录下运行不加任何参数的运行 go test 命令。其作用和结果与上面的示例是一样的。
另外,我们还可以指定 测试源码文件 来进行测试。这样的话,go test 命令只会执行指定文件中的测试,像这样:
hc@ubt:~/golang/goc2p/src/pkgtool$ go test envir_test.go
# command-line-arguments
./envir_test.go:25: undefined: GetGoroot
./envir_test.go:40: undefined: GetAllGopath
./envir_test.go:81: undefined: GetSrcDirs
./envir_test.go:83: undefined: GetAllGopath
./envir_test.go:90: undefined: GetGoroot
FAIL command-line-arguments [build failed]
我们看到,与指定源码文件进行编译或运行一样,命令程序会为指定的源码文件生成一个虚拟代码包——“command-line-arguments”。但是,测试并没有通过。但其原因并不是测试失败,而是编译失败。对于运行这次测试的命令程序来说,测试源码文件 envir_test.go 是属于代码包“command-line-arguments”的。并且,这个测试源码文件中使用了库源码文件 envir.go 中的函数。但是,它却没有显示导入这个库源码文件所属的代码包。这显然会引起编译错误。如果想解决这个问题,我们还需要在执行命令时加入这个测试源码文件所测试的那个源码文件。示例如下:
hc@ubt:~/golang/goc2p/src/pkgtool$ go test envir_test.go envir.go
ok command-line-arguments 0.010s
现在,我们故意使代码包 pkgtool 中的某个测试失败。现在我们再来运行测试:
hc@ubt:~$ go test basic cnet/ctcp pkgtool
ok basic 0.010s
ok cnet/ctcp 2.015s
--- FAIL: TestGetSrcDirs (0.00 seconds)
envir_test.go:85: Error: The src dir '/usr/local/go/src/pkg' is incorrect.
FAIL
FAIL pkgtool 0.009s
我们通过以上示例中的概要信息获知,测试源码文件中 envir_test.go 的测试函数 TestGetSrcDirs 中的测试失败了。在包含测试失败的测试源码文件名的那一行信息中,紧跟测试源码文件名的用冒号分隔的数字是错误信息所处的行号,在行号后面用冒号分隔的是错误信息。这个错误信息的内容是用户自行编写的。另外,概要信息的最后一行以“FAIL”为前缀。这表明针对代码包 pkgtool 的测试未通过。未通过的原因在前面的信息中已有描述。
一般情况下,我们会把 测试源码文件 与 被测试的源码文件 放在 同一个代码包 中。
并且,这些源码文件中声明的包名也都是相同的。除此之外我们还有一种选择,那就是测试源码文件中声明的包名可以是所属包名再加“_test”后缀。我们把这种测试源码文件叫做包外测试源码文件。不过,包外测试源码文件存在一个弊端,那就是在它们的测试函数中无法测试被测源码文件中的包级私有的程序实体,比如包级私有的变量、函数和结构体类型。这是因为这两者的所属代码包是不相同的。所以,我们一般很少会编写包外测试源码文件。
关于标记
go test 命令的标记处理部分是庞大且繁杂的,以至于使 Go 语言的开发者们不得不把这一部分的逻辑从 go test 命令程序主体中分离出来并建立单独的源码文件。因为 go test 命令中包含了编译动作,所以它可以接受可用于 go build 命令的所有标记。另外,它还有很多特有的标记。这些标记的用于控制命令本身的动作,有的用于控制和设置测试的过程和环境,还有的用于生成更详细的测试结果和统计信息。
可用于 go test 命令的几个比较常用的标记是 -c、-i 和 -o。这两个就是用于控制 go test 命令本身的动作的标记。详见下表。
表0-6 go test 命令的标记说明
| 标记名称 | 标记描述 |
|---|---|
| -c | 生成用于运行测试的可执行文件,但不执行它。这个可执行文件会被命名为“pkg.test”,其中的“pkg”即为被测试代码包的导入路径的最后一个元素的名称。 |
| -i | 安装/重新安装运行测试所需的依赖包,但不编译和运行测试代码。 |
| -o | 指定用于运行测试的可执行文件的名称。追加该标记不会影响测试代码的运行,除非同时追加了标记 -c 或 -i。 |
上述这几个标记可以搭配使用。搭配使用的目的可以是让 go test 命令既安装依赖包又编译测试代码,但不运行测试。也就是说,让命令程序跑一遍运行测试之前的所有流程。这可以测试一下测试过程。注意,在加入 -c 标记后,命令程序会把用于运行测试的可执行文件存放到当前目录下。
除此之外,go test 命令还有很多功效各异的标记。但是由于这些标记的复杂性,我们需要结合测试源码文件进行详细的讲解。所以我们在这里略过不讲。
摘自:
http://wiki.jikexueyuan.com/project/go-command-tutorial/0.7.html
【Go命令教程】8. go test的更多相关文章
- Make 命令教程 -- 阮一峰
摘自http://www.ruanyifeng.com/blog/2015/02/make.html Make 命令教程 作者: 阮一峰 日期: 2015年2月20日 代码变成可执行文件,叫做编译(c ...
- 痞子衡嵌入式:第一本Git命令教程(0)- 索引
大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家讲的是Git命令汇编,共12篇文章,循序渐进地介绍Git操作的完整过程. 在开始Git课程之前,需要先跟大家普及2个重要概念(四度空间.四种状 ...
- Android ADB命令教程二——ADB命令详解
Android ADB命令教程二——ADB命令详解 转载▼ 原文链接:http://www.tbk.ren/article/249.html 我们使用 adb -h 来看看,adb命令里面 ...
- 天河2号-保持使用yhrun/srun时连接不中断 (screen 命令教程 )
问题重述: 当我们使用天河机进行并行程序实验的时候,都会使用到yhrun/srun命令.在超算环境下,yhrun 命令用来进行提交交互式作业,有屏幕输出.但是容易受到网络波动影响导致断网或者关闭窗口最 ...
- 【Go命令教程】命令汇总
[Go命令教程]1. 标准命令详解 [Go命令教程]2. go build [Go命令教程]3. go install [Go命令教程]4. go get [Go命令教程]5. go clean [G ...
- Windows 批处理(cmd/bat)常用命令教程
Windows批处理(cmd/bat)常用命令教程 简单详细,建议收藏 常见问题: 1.如果你自己编写的.bat文件,双击打开,出现闪退 2.批处理.bat 文件中输出中文乱码 解决方法在文章末尾! ...
- MySQL使用教程收集(语法教程/命令教程)
说明:现在市面上的教程除了基本语法外,都基本是五花八门的,最权威且最全面的解释应该上官网去查看. https://www.tutorialspoint.com/mysql/index.htm http ...
- Make 命令教程
http://www.ruanyifeng.com/blog/2015/02/make.html 作者: 阮一峰 日期: 2015年2月20日 代码变成可执行文件,叫做编译(compile):先编译这 ...
- npm命令教程
教程:http://www.runoob.com/nodejs/nodejs-npm.html 常用命令:http://www.cnblogs.com/PeunZhang/p/5553574.html
- 痞子衡嵌入式:第一本Git命令教程(7.1)- 清理之缓存(stash)
今天是Git系列课程第七课,上一课我们学会了查看Git本地历史提交,今天痞子衡要讲的是Git仓库的清理操作,一共4个命令,都是日常开发中非常实用的命令,掌握这4个命令,会让你有一种玩弄Git仓库于股掌 ...
随机推荐
- [转]perf + 火焰图分析程序性能
1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...
- Html设置html与body元素高度问题
为什么要设置HTML和body的高度? 在一些比较正规的网站经常见到会设置html与body的高度.是为了后面的div高度正确的显示. div的100%是从其上一级div的宽高继承来的,有一点很关键, ...
- 因子分析(Factor analysis)
1.引言 在高斯混合和EM算法中,我们运用EM算法拟合混合模型,但是我们得考虑得需要多少的样本数据才能准确识别出数据中的多个高斯模型!看下面两种情况的分析: 第一种情况假如有 m 个样本,每个样本的维 ...
- ASP.NET中Request.ApplicationPath、Request.FilePath、Request.Path、.Request.MapPath、
1.Request.ApplicationPath->当前应用的目录 Jsp中, ApplicationPath指的是当前的application(应用程序)的目录,ASP.NET中也是这 ...
- liunx 安装和解压命令
tar.gz格式 sudo tar -xvf file.tar.gz -C /目录/ //注意C为大写,-C /目录是可选的 zip sudo jar xvf file.zip //jar ...
- Java List 转 String
JAVA中List转换String,String转换List,Map转换String,String转换Map之间的转换工具类(调优)https://www.cnblogs.com/cn-wxw/p/6 ...
- 《python源码剖析》,看看
这书高级了,有点超出理解能力. 但走出舒适区,不是大家都在说的么?:) 看完了些章节,还是很有收获的, 截图存照.
- xgboost 实践
xgboost 安装:xgboost:Scalable and Flexible Gradient Boosting github: eXtreme Gradient Boosting 中文教程:可 ...
- CentOS 7.4 系统安装 git
CentOS 7.4 系统安装 git 一.使用 yum 安装 1.查看系统是否已经安装 git [root@localhost ~]# git --version 2.yum 安装 git [roo ...
- sonarQube代码管理工具
第一步:安装环境:jdk 1.8 idea mysql5.6以上 sonarqube5.6.6 第二歩:下载好sonarqube后,解压打开bin目录,启动相应OS目录下的StartSonar ...