go test的作用是什么

“go test”是测试命令,作用是对Go语言编写的程序进行测试;这种测试是以代码包为单位的。“go test”命令会自动读取源码目录下面名为“*_test.go”的内含若干测试函数的源码文件,测试函数一般是以“Test”为名称前缀并有一个类型为“testing.T”的参数声明的函数。

go test的作用是什么

本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

Go语言拥有一套单元测试和性能测试系统,仅需要添加很少的代码就可以快速测试一段需求代码。

go test 命令,会自动读取源码目录下面名为 *_test.go 的文件,生成并运行测试用的可执行文件。

go test命令(测试命令)

go test命令用于对Go语言编写的程序进行测试。这种测试是以代码包为单位的。当然,这还需要测试源码文件的帮助。关于怎样编写并写好Go程序测试代码,我们会在本章的第二节加以详述。在这里,我们只讨论怎样使用命令启动测试。

go test命令会自动测试每一个指定的代码包。当然,前提是指定的代码包中存在测试源码文件。测试源码文件是名称以“_test.go”为后缀的、内含若干测试函数的源码文件。测试函数一般是以“Test”为名称前缀并有一个类型为“testing.T”的参数声明的函数.

现在,我们来测试goc2p项目中的几个代码包。在使用go test命令时指定代码包的方式与其他命令无异——使用代码包导入路径。如果需要测试多个代码包,则需要在它们的导入路径之间加入空格以示分隔。示例如下:

hc@ubt:~$ go test basic cnet/ctcp pkgtoolok      basic    0.012sok      cnet/ctcp    2.014sok      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: GetGorootFAIL    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.gook      command-line-arguments    0.010s

登录后复制

现在,我们故意使代码包pkgtool中的某个测试失败。现在我们再来运行测试:

hc@ubt:~$ go test basic cnet/ctcp pkgtoolok      basic   0.010sok      cnet/ctcp       2.015s--- FAIL: TestGetSrcDirs (0.00 seconds)        envir_test.go:85: Error: The src dir '/usr/local/go/src/pkg' is incorrect.FAILFAIL    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视频教程、编程教学】

以上就是go test的作用是什么的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2414531.html

(0)
上一篇 2025年3月3日 00:40:43
下一篇 2025年2月26日 07:05:46

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • go语言有什么好处

    go语言的好处:1、可直接编译成机器码,不依赖其他库;2、静态类型语言,但是有动态语言的感觉,写起来的效率很高;3、语言层面支持并发;4、内置runtime,支持垃圾回收;5、简单易学;6、内置了大量的库,特别是网络库非常强大;7、内置强大…

    2025年3月3日
    200
  • golang Gob是什么

    gob是Golang包自带的一个数据结构序列化的编码/解码工具,编码使用Encoder,解码使用Decoder。Gob使用io.Writer 接口,通过NewEncoder()函数创建Encoder对象通过调用Encode()方法实现编码操…

    2025年3月3日 编程技术
    200
  • go语言中协程与线程的区别是什么

    区别:1、一个线程可以多个协程,一个进程也可以单独拥有多个协程;2、线程是同步机制,而协程则是异步;3、协程能保留上一次调用时的状态,线程不行;4、线程是抢占式,协程是非抢占式的;5、线程是被分割的CPU资源,协程是组织好的代码流程,协程需…

    2025年3月3日
    200
  • 初探Go语言中的Goroutine和channel

    本篇文章带大家初步了解go语言中的goroutine和channel,希望对大家有所帮助! Go 语言的 CSP 并发模型的实现包含两个主要组成部分:一个是 Goroutine,另一个是 channel。本文将会介绍它们的基本用法和注意事项…

    2025年3月3日
    200
  • 一文聊聊go语言中的限流漏桶和令牌桶库

    本篇文章带大家聊聊go语言中的限流漏桶和令牌桶库,介绍令牌桶和漏桶的实现原理以及在实际项目中简单应用。 为什么需要限流中间件? 在大数据量高并发访问时,经常会出现服务或接口面对大量的请求而导致数据库崩溃的情况,甚至引发连锁反映导致整个系统崩…

    2025年3月3日
    200
  • go Realize是什么

    Realize是一个Go工具,专注于加快和改善开发人员的工作流程,自动化用户的工作流程,集成第三方的其他工具,定义自定义cli命令,并在每次更改时重新加载项目,而不必停止编写代码;执行“go get github.com/tockins/r…

    2025年3月3日
    200
  • go语言eof错误是什么

    在go语言中,eof是指文件结尾错误,是Go语言中最重要的错误变量,存在于io包中,用于表示输入流的结尾。因为每个文件都有一个结尾,所以“io.EOF”很多时候并不能算是一个错误,它更重要的是表示一个输入流结束了。 本教程操作环境:wind…

    2025年3月3日
    200
  • 一文浅析Golang中的nil和零值

    作为一个长期从事Java开发的人员,我痴迷于null检查和处理null值。在golang中,故事有些不同。在这篇文章中,我将尝试描述在golang中如何使用nil和零值。 非空和空类型 在go中类型可以是空或非空。 非空类型永远不能为nil…

    2025年3月3日
    200
  • GO goutil发布了v0.6.4版!更新速览!

    本篇文章带大家聊聊go工具库goutil的最新更新情况,介绍了gookit/goutil go常用功能的扩展工具库,都包含哪些知识,附更新日志,希望对大家有所帮助! gookit/goutil Go 常用功能的扩展工具库。包含:数字,字符串…

    2025年3月3日
    200
  • Go语言怎么判断结构体是否存在某方法?两种方式介绍

    go语言怎么判断结构体是否存在某方法?下面本篇文章给大家介绍一下golang判断结构体是否存在某方法的两种方式(附代码示例),希望对大家有所帮助! go 有时需要判断某个结构体是不是有某个方法,但是可能突然就一脸茫然,go 也可以像 php…

    2025年3月3日
    200

发表回复

登录后才能评论