0

0

Golang测试如何跳过长时间用例 讲解Short模式与Skip方法

P粉602998670

P粉602998670

发布时间:2025-07-06 08:46:01

|

419人浏览过

|

来源于php中文网

原创

golang测试中跳过长时间运行的用例,可通过testing.short()和t.skip()实现。1. testing.short()用于根据go test -short标志决定是否跳过测试,若设置了-short标志,则调用t.skip()跳过耗时任务;2. t.skip()可在测试函数内部根据条件跳过测试,如环境变量未设置时跳过依赖外部资源的测试;3. 使用t.skipf()可格式化跳过信息,适合需要动态构建跳过原因的场景;4. 对于依赖外部资源的测试,可使用mock/stub、测试容器、集成测试环境或条件编译等方式处理;5. ci/cd中可在提交时运行go test -short快速验证,在夜间或发布构建中运行完整测试。

Golang测试如何跳过长时间用例 讲解Short模式与Skip方法

Golang测试中跳过长时间运行的用例,通常是为了加快测试速度,尤其是在持续集成环境中。你可以使用testing.Short()函数和t.Skip()方法来实现。testing.Short()允许你根据go test -short标志来控制是否运行某些测试。t.Skip()则允许你在测试函数内部,根据特定条件跳过测试。

Golang测试如何跳过长时间用例 讲解Short模式与Skip方法

解决方案

  1. 使用testing.Short(): 在你的测试用例中,首先检查是否设置了short标志。如果设置了,就跳过那些耗时的测试。

    Golang测试如何跳过长时间用例 讲解Short模式与Skip方法
    package yourpackage
    
    import (
        "testing"
        "time"
    )
    
    func TestLongRunningTask(t *testing.T) {
        if testing.Short() {
            t.Skip("skipping long running test in short mode")
        }
    
        // 模拟一个长时间运行的任务
        time.Sleep(5 * time.Second)
        // 一些断言
        if true != true {
            t.Errorf("Something went wrong")
        }
    }

    运行测试时,使用go test将运行所有测试,而使用go test -short将跳过TestLongRunningTask

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

  2. 使用t.Skip(): t.Skip()方法允许你在测试函数内部跳过测试,这在你有更复杂的条件来决定是否运行测试时非常有用。

    Golang测试如何跳过长时间用例 讲解Short模式与Skip方法
    package yourpackage
    
    import (
        "os"
        "testing"
    )
    
    func TestExternalResource(t *testing.T) {
        if os.Getenv("EXTERNAL_RESOURCE_AVAILABLE") == "" {
            t.Skip("skipping test because external resource is not available")
        }
    
        // 测试依赖于外部资源的代码
        // ...
    }

    在这个例子中,如果环境变量EXTERNAL_RESOURCE_AVAILABLE未设置,测试将被跳过。

如何在CI/CD环境中运用Short模式?

CI/CD环境通常需要快速反馈,但又需要全面测试。一个策略是:在每次提交时运行go test -short,快速验证代码的基本功能。然后,在夜间构建或发布构建中运行完整的go test,包含所有长时间运行的测试。 你可以在CI/CD配置中设置不同的测试命令,例如:

# .gitlab-ci.yml 示例
stages:
  - test

short_test:
  stage: test
  script:
    - go test -short ./...

full_test:
  stage: test
  script:
    - go test ./...
  only:
    - schedules # 只在定时任务中运行

t.Skip()t.Skipf()区别是什么?何时使用哪个?

t.Skip()t.Skipf()都用于跳过测试,但t.Skipf()允许你格式化一个跳过信息。选择哪个取决于你是否需要提供更详细的跳过原因。

  • t.Skip(args ...interface{}): 接受一个或多个interface{}类型的参数,这些参数会被连接成一个字符串作为跳过的原因。

    星火作家大神
    星火作家大神

    星火作家大神是一款面向作家的AI写作工具

    下载
    t.Skip("Skipping because of reason X")
  • t.Skipf(format string, args ...interface{}): 接受一个格式化字符串和一个或多个interface{}类型的参数,类似于fmt.Printf

    t.Skipf("Skipping because version is %s", version)

    如果你需要动态地构建跳过信息,比如包含变量的值,那么t.Skipf()是更好的选择。

如何处理依赖外部资源或服务的测试?

处理依赖外部资源或服务的测试是一个常见的挑战。除了使用环境变量和t.Skip()之外,还可以考虑以下策略:

  1. 使用Mock和Stub: 使用mock对象或stub来模拟外部资源的行为,这样你的测试就不再依赖于真实的外部资源。GoMock是一个流行的 mocking 框架。

    // 假设你有一个依赖外部服务的接口
    type ExternalService interface {
        GetData() (string, error)
    }
    
    // 使用GoMock生成一个mock对象
    //go:generate mockgen -destination=mock_external_service.go -package=yourpackage yourpackage ExternalService
    
    // 在测试中使用mock对象
    func TestWithMock(t *testing.T) {
        ctrl := gomock.NewController(t)
        defer ctrl.Finish()
    
        mockService := NewMockExternalService(ctrl)
        mockService.EXPECT().GetData().Return("mock data", nil)
    
        // 使用mockService进行测试
        // ...
    }
  2. 使用测试容器: 使用Docker等容器技术,在测试环境中启动一个轻量级的外部服务实例。Testcontainers是一个用于在测试中管理Docker容器的库。

  3. 使用集成测试环境: 设置一个专门的集成测试环境,其中包含所有必要的外部资源和服务。然后,只在这个环境中运行需要访问外部资源的测试。

  4. 条件编译: 使用go:build指令,根据不同的构建标签选择性地编译测试代码。

    //go:build integration
    
    package yourpackage
    
    import "testing"
    
    func TestIntegration(t *testing.T) {
        // 集成测试代码
    }

    使用go test -tags=integration来运行带有integration标签的测试。

选择哪种策略取决于你的具体需求和项目的复杂性。通常,mock和stub是单元测试的首选,而测试容器和集成测试环境更适合集成测试。

相关专题

更多
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、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

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开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

393

2024.05.21

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

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

197

2025.06.09

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

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

191

2025.06.10

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

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

233

2025.06.17

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML教程
HTML教程

共500课时 | 4.9万人学习

php初学者入门课程
php初学者入门课程

共10课时 | 0.6万人学习

RunnerGo从入门到精通
RunnerGo从入门到精通

共22课时 | 1.7万人学习

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

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