0

0

Golang跳过长时间测试 Short模式应用

P粉602998670

P粉602998670

发布时间:2025-08-28 08:37:01

|

427人浏览过

|

来源于php中文网

原创

Go语言中通过testing.Short()函数识别并标记长测试,开发者在测试中判断该函数返回值,若为true则调用t.Skip()跳过耗时或依赖外部资源的测试;如TestSomethingLongRunning中使用if testing.Short() { t.Skip("...") }实现短模式跳过;通常执行时间超几百毫秒或涉及网络、数据库操作的测试被视为长测试,需手动标记;在CI/CD中不应完全依赖-short模式,但可分阶段使用,如在快速预检阶段运行go test -short以快速反馈,再在后续阶段执行完整测试,确保覆盖率;为避免滥用导致覆盖不足,团队需建立规范明确标记范围,确保CI流水线始终运行完整测试,并通过代码审查和定期检查覆盖率防止测试遗漏。

golang跳过长时间测试 short模式应用

在Go语言的测试体系中,

go test -short
命令提供了一种快速迭代的机制,它允许开发者在本地开发时,跳过那些耗时较长、通常涉及外部资源或大量计算的测试,从而显著加快测试反馈循环,提升开发效率。这就像是给你的测试套件装了个“快速模式”开关,让你能优先验证核心逻辑的正确性,而把全面的、耗时的验证留给持续集成(CI)环境。

解决方案

要应用

go test -short
模式,核心在于在你的测试代码中利用
testing
包提供的
testing.Short()
函数。这个函数会在你运行
go test -short
命令时返回
true
。因此,你可以在测试函数内部通过判断
testing.Short()
的返回值来决定是否跳过当前测试。

通常,我们会将那些需要访问数据库、进行网络请求、执行文件I/O操作、或者需要长时间计算的测试标记为“长测试”。一个典型的做法是:

package mypackage

import (
    "testing"
    "time" // 假设某个操作需要模拟耗时
)

func TestSomethingFast(t *testing.T) {
    // 这是一个快速测试,无论是否是short模式都会运行
    if 1+1 != 2 {
        t.Errorf("Basic arithmetic failed")
    }
}

func TestSomethingLongRunning(t *testing.T) {
    if testing.Short() {
        t.Skip("Skipping long-running test in short mode") // 在short模式下跳过
    }

    // 模拟一个耗时操作,比如数据库查询、API调用等
    time.Sleep(2 * time.Second)
    t.Log("Long-running test completed successfully.")
}

func TestAnotherLongRunningWithResource(t *testing.T) {
    if testing.Short() {
        t.Skip("Skipping resource-intensive test in short mode")
    }

    // 这里可以放置需要外部资源(如真实数据库连接)的测试逻辑
    // 假设需要连接到外部服务
    // client, err := connectToExternalService()
    // if err != nil {
    //     t.Fatal(err)
    // }
    // defer client.Close()
    // ... 执行测试 ...
    t.Log("Resource-intensive test completed.")
}

当你执行

go test
时,所有测试都会运行。但当你执行
go test -short
时,
TestSomethingLongRunning
TestAnotherLongRunningWithResource
就会被跳过,因为它们内部检查了
testing.Short()
true
。这种机制让开发者能够灵活地控制测试的粒度和运行时间。

立即学习go语言免费学习笔记(深入)”;

Go语言中如何识别并标记长时间测试?

识别长时间测试,这事儿说起来有点主观,但又很实际。通常,一个测试如果执行时间超过几百毫秒,或者它依赖外部服务、数据库,每次跑起来都得等个几秒甚至几十秒,那它就很有可能被归类为“长测试”了。我们写代码的时候,很容易就能感觉到哪个测试跑起来“肉”,因为它会拖慢整个测试套件的执行速度。

具体到识别上,你可以用

go test -v -bench .
来看看哪些基准测试(benchmarks)耗时,虽然这主要针对性能测试,但也能侧面反映出一些代码块的执行效率。更直接的方式,是留意
go test
完整运行一次需要多久。如果你的本地开发环境,每次修改代码后跑一遍测试要等个十几秒甚至更久,那么就得考虑哪些测试可以被跳过了。

标记嘛,就像前面代码示例里那样,直接在测试函数开头加个

if testing.Short() { t.Skip(...) }
就行。这其实是一种约定,也是一种开发纪律。团队内部可以约定一个阈值,比如“凡是需要网络请求的测试,或者执行时间预计超过1秒的,都应该在
short
模式下跳过”。这样,大家在写新测试时就能有个明确的指导。这种标记不是自动的,需要我们开发者手动判断和添加,这本身也是一种深思熟虑的体现,因为你知道哪些测试是你的“核心快检”,哪些是“深度体检”。

在CI/CD流水线中如何有效利用
go test -short

go test -short
模式在CI/CD流水线中的应用,其实是个有点意思的话题,它不像本地开发那样直观。毕竟,CI/CD的目标是确保代码质量,通常我们会希望在流水线中运行所有测试,包括那些耗时的集成测试和端到端测试,以提供最全面的质量保障。所以,直接在CI/CD中全面使用
-short
模式来替代完整测试,那绝对是自欺欺人,是不可取的。

DALL·E 2
DALL·E 2

OpenAI基于GPT-3模型开发的AI绘图生成工具,可以根据自然语言的描述创建逼真的图像和艺术。

下载

但是,这并不意味着它在CI/CD里就毫无用武之地。想象一下,如果你的CI/CD流水线有多个阶段,比如“快速构建与单元测试”和“全面集成与部署测试”。在“快速构建”阶段,你可能需要一个极其迅速的反馈,比如在开发者提交代码到版本控制系统时,立即运行一个非常快的检查,以确保基本语法无误、核心单元测试通过,这时就可以考虑在这一阶段使用

go test -short
。这可以作为一种“预检”,快速筛掉那些连基本功能都跑不通的提交,避免浪费后续耗时更长的CI资源。

举个例子,在GitHub Actions或者GitLab CI中,你可以在

push
事件触发的第一个job中运行
go test -short
。如果通过,再触发一个更全面的job,运行所有的测试。这种分阶段的策略,既能保证快速反馈,又不牺牲最终的测试覆盖率。但务必记住,最终部署到生产环境的代码,一定是要经过所有测试的洗礼的。
-short
模式在这里扮演的是一个“守门员”的角色,而不是“终审法官”。

如何避免滥用
testing.Short()
导致测试覆盖不足?

滥用

testing.Short()
是个真实存在的风险,这就像是给了你一个“跳过”按钮,用多了就容易产生依赖,甚至忘记了还有“完整测试”这回事。最直接的后果就是测试覆盖率下降,一些只在“长测试”中被验证的边缘情况或集成逻辑,可能长时间得不到充分测试,直到生产环境出现问题才暴露出来,那时候代价可就大了。

要避免这种滥用,首先,也是最关键的,就是要有一个健壮的、始终运行完整测试的CI/CD流水线。你的CI系统必须是那个“严格的老师”,每次代码合并到主分支(或者重要的发布分支)之前,都必须强制运行所有测试,不带任何

-short
参数。这是底线,也是确保代码质量的最后一道防线。

其次,团队内部需要建立清晰的规范和共识。哪些测试可以被标记为

short
为什么?这个判断标准是什么?这些都需要明确。例如,可以约定,只有那些需要真实外部服务(数据库、消息队列、第三方API)的集成测试,或者模拟非常耗时计算的性能测试,才允许使用
testing.Short()
。纯粹的单元测试,无论多慢,都不应该被
short
掉,因为它们是验证核心业务逻辑的基石。

再来,代码审查(Code Review)在这方面也扮演着重要角色。当有开发者提交包含

t.Skip
且依赖
testing.Short()
的测试时,审查者应该问一句:“这个测试为什么需要被跳过?它真的足够长吗?是不是可以优化?”有时候,一个被标记为“长”的测试,其耗时可能并不是因为逻辑复杂,而是因为测试代码本身写得不够高效,或者模拟数据的方式有问题。这时候,与其跳过,不如去优化测试本身。

最后,定期审查测试报告和覆盖率。如果发现某些关键模块的测试覆盖率在下降,或者一些集成测试长时间没有在CI中跑过,那就需要警惕了。这可能就是

testing.Short()
被过度使用的信号。记住,
testing.Short()
是为了提高开发效率,而不是降低测试质量。它是一个工具,而不是偷懒的借口。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

180

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

341

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

394

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

220

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

192

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

335

2025.06.17

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

12

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
golang socket 编程
golang socket 编程

共2课时 | 0.1万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

golang和swoole核心底层分析
golang和swoole核心底层分析

共3课时 | 0.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号