首页 > 其他分享 >Golang的测试、基准测试和持续集成

Golang的测试、基准测试和持续集成

时间:2023-09-28 20:31:44浏览次数:36  
标签:集成 CI 基准 testing Golang result 测试

在Golang中,内置的垃圾回收器处理内存管理,自动执行内存分配和释放。

20230926-012742.jpeg

单元测试是软件开发中至关重要的一个方面,它确保了代码的正确性并在开发过程中尽早发现错误。在Go中,编写有效的单元测试非常简单,并为开发人员提供了对其代码的信心。在本文中,我们将探讨在Go中编写单元测试的最佳实践,包括测试组织、测试技巧以及利用测试框架。

简介

单元测试是现代软件开发中的一项重要实践,它涉及在隔离环境中测试单个代码单元以验证其正确性。在Go中,标准测试包提供了强大的工具来创建全面的单元测试。

测试组织

以有结构的方式组织测试对于可维护性和可读性至关重要。通过遵循一致的命名约定和目录结构,我们可以轻松识别和运行测试。

示例目录结构

project/
├── main.go
├── main_test.go
├── package/
│   ├── file.go
│   └── file_test.go

编写测试函数

在Go中,测试函数以前缀Test开头,并以testing.T的指针作为参数。我们可以使用testing包提供的各种测试函数,比如用于子测试的t.Run和用于标记辅助函数的t.Helper

示例测试函数

package main

import "testing"

func add(a, b int) int {
	return a + b
}

func TestAdd(t *testing.T) {
	result := add(2, 3)
	if result != 5 {
		t.Errorf("Expected 5, got %d", result)
	}
}

测试技巧

除了基本的断言之外,Go还提供了有用的测试技巧,如表驱动测试、子测试和模拟。这些技巧可以实现全面的测试覆盖,并更好地理解测试失败。

表驱动测试

表驱动测试允许我们使用多个输入和预期输出运行相同的测试,从而轻松验证边界情况。

func TestAddTableDriven(t *testing.T) {
	tests := []struct {
		a, b, expected int
	}{
		{2, 3, 5},
		{0, 0, 0},
		{-1, 1, 0},
	}

	for _, test := range tests {
		result := add(test.a, test.b)
		if result != test.expected {
			t.Errorf("Expected %d, got %d", test.expected, result)
		}
	}
}

子测试

子测试允许将相关的测试分组在一起,提高了测试的可读性,并更容易识别失败的子测试。

func TestAddSubtests(t *testing.T) {
	t.Run("Positive Numbers", func(t *testing.T) {
		result := add(2, 3)
		if result != 5 {
			t.Errorf("Expected 5, got %d", result)
		}
	})

	t.Run("Negative Numbers", func(t *testing.T) {
		result := add(-2, -3)
		if result != -5 {
			t.Errorf("Expected -5, got %d", result)
		}
	})
}

模拟

在涉及外部依赖的复杂情况下,可以使用模拟来隔离被测试单元与实际依赖关系。

用于性能优化的基准测试

基准测试是优化Golang应用程序性能的重要实践。通过测量和分析不同代码段的执行时间,开发人员可以识别性能瓶颈并进行有根据的性能改进。在本文中,我们将探讨如何在Go中编写基准测试,并解释基准测试结果以实现最佳性能。

基准测试涉及测量特定代码段或函数的执行时间,以识别性能瓶颈和潜在的改进领域。

编写基准测试

在Go中,使用testing.B类型和testing.Benchmark函数编写基准测试。基准测试函数应以前缀Benchmark开头,并以testing.B的指针作为参数。

示例基准测试函数

package main

import "testing"

func fib(n int) int {
	if n <= 1 {
		return n
	}
	return fib(n-1) + fib(n-2)
}

func BenchmarkFib10(b *testing.B) {
	for i := 0; i < b.N; i++ {
		fib(10)
	}
}

运行基准测试

要运行基准测试,使用go test命令,带上-bench标志以及要运行的基准测试函数的正则表达式模式。

go test -bench=.

基准测试结果

基准测试结果提供了有关被基准测试代码的执行时间的宝贵信息。输出包括迭代次数(N)、总共耗时(Ns/op)和每次迭代的耗时(ns/op)。

基准测试技巧

  • 使用代表性数据运行基准测试,以获取准确的性能测量结果。
  • 在使用b.ResetTimer函数时要小心,它可能会使较小的基准测试结果偏离真实情况。
  • 使用-benchtime标志来控制每个基准测试运行的持续时间。

Golang项目的持续集成

持续集成(CI)是一种开发实践,涉及自动构建、测试和部署代码更改到共享存储库。对于Golang项目,实施CI可以加快开发周期,增加协作,提高代码质量。在本文中,我们将探讨如何使用流行的CI/CD平台为Golang项目设置CI,并介绍确保流畅高效的开发工作流的最佳实践。

持续集成(CI)是一种软件开发实践,允许开发人员频繁地自动将代码更改集成到共享存储库中。

为Golang项目设置CI

有几个流行的CI/CD平台支持Golang项目,例如Travis CI、CircleCI、Jenkins和GitLab CI/CD。这些平台提供了对Golang的内置支持,使得设置CI流程变得简单。

配置CI流程

针对Golang项目的典型CI流程包括构建代码、运行测试、生成构建产物以及部署到预发布或生产环境等步骤。

示例.travis.yml文件,用于Travis CI

language: go

go:
  - 1.x
  - 1.15.x
  - 1.16.x

script:
  - go test -v ./...

在CI中运行测试

在CI流程中运行测试确保代码更改不会引入回归问题,并保持整体代码质量。

处理依赖关系

使用诸如Go Modules或Dep之类的依赖管理工具来管理项目依赖关系。这可以确保在开发环境和CI流程中保持一致性。

CI最佳实践

  • 维护一个快速可靠的CI流程,为开发人员提供及时的反馈。
  • 使用特性分支和拉取请求来隔离更改,并在合并到主分支之前运行测试。
  • 定期监视CI流程的失败并及时解决。
  • 实施一个健壮的测试套件,覆盖各种场景和边缘情况。

结论

在本文中,我们深入探讨了在Go中编写有效的单元测试、性能优化基准测试以及为Golang项目设置持续集成的世界。单元测试是一项不可或缺的实践,它确保了代码的正确性,并有助于早期发现错误。通过遵循组织测试、利用表驱动测试、子测试和模拟等最佳实践,开发人员可以创建全面的测试套件,增强代码的可靠性。

另一方面,基准测试是优化Golang应用程序性能的强大工具。通过测量特定代码段的执行时间和解释基准测试结果,开发人员可以精确定位性能瓶颈,并做出明智的决策来提高应用程序的效率。

持续集成的实施在简化开发工作流程方面起到了关键作用。通过使用Travis CI、CircleCI、Jenkins或GitLab CI/CD等流行的CI/CD平台建立CI流水线,可以自动化构建、测试和部署代码更改的过程。定期监视CI流程以解决失败、维护强大的测试套件以及处理项目依赖关系,可以确保平稳高效的开发周期。

将这些实践结合起来,使Golang开发人员能够创建高质量、高性能和可靠的应用程序。将测试、基准测试和持续集成作为开发过程的重要组成部分,可以确保代码稳定性、更快的迭代、增强的协作,最终提供更出色的用户体验。在我们继续Golang开发的道路上,这些实践作为信心的支柱,帮助我们应对复杂的挑战,推动项目取得成功。

标签:集成,CI,基准,testing,Golang,result,测试
From: https://blog.51cto.com/slagga/7642702

相关文章

  • golang编码规范
     目录[-]golang编码规范gofmt注释命名控制结构函数(必须)错误处理panicimport缩写参数传递接受者 golang编码规范注:此文档参考官方指南EffectiveGolang和GolangCodeReviewComments进行整理,力图与官方及社区编码风格保持一致。gofmt大部分的格式问题可以通过gofmt解决,gofmt自动......
  • 有哪些可以替代postman的接口测试软件?
    作者:IT华妹陀链接:https://www.zhihu.com/question/525827377/answer/2884144067来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。个人认为这几个工具都可以参考下!1.Fiddler:Fiddler是一款功能强大的接口测试软件,它可以帮助用户抓取、修改和重放......
  • golang-select
    select的作用golang中的select就是用来监听和channel有关的IO操作,当IO操作发生时,触发相应的动作。select只能应用于channel的操作,既可以用于channel的数据接收,也可以用于channel的数据发送。如果select的多个分支都满足条件,则会随机的选取其中一个满足条件的分......
  • 卷发棒上架亚马逊美国销售需要做什么认证?UL859测试报告
    卷发棒上架亚马逊美国销售需要做什么认证?UL859测试报告卷发棒是一种美发DIY工具,目前美发沙龙和发廊的的美发师都会使用一套卷发棒工具。卷发棒可以造出各种卷发。如:大波浪卷发、下垂自然卷发、垂至肩头卷发、碎卷、麦穗烫、内翻式卷发、外翻式卷发。目前很多家庭会自己备有这样的产......
  • 100天精通Golang(基础入门篇)——第2天:学习Go语言的前世今生:一门强大的编程语言的崛起
    ......
  • 【fgolang代码分享】golang如何连接oracle进行业务开发
    在我们的开发场景下虽然大部分我们都使用mysql就可以满足我们日常的开发任务,但是总有一些开发场景是需要我们是用oracle数据库的,今天我给大家带来golang的俩种连接oracle的方式。oracle简介oracle也是出自甲骨文公司,和mysql同门,也是全球最大的信息管理软件及服务供应商,Oracle开......
  • golang之命令行工具Cobra
    github地址: https://github.com/spf13/cobra [安装]goget-ugithub.com/spf13/cobra@latest使用cobra_cli工具goinstallgithub.com/spf13/cobra-cli@latest [使用]#初始化工程cobra-cliinit#添加应用cobra-cliaddtimezone 示例://tim......
  • 软件测试自动化的成本效益分析
    随着软件测试技术的发展,人们已经从最初的手工测试转变为手工和自动化技术相结合的测试方法。目前,人们更多的是关心自动化测试框架、自动化测试工具以及脚本研究等技术方面,而在软件自动化测试方案的效益分析方面涉及较少。软件测试的目的是提高软件质量,避免软件缺陷导致的损失。与......
  • golang-channel
    什么是channel管道channel是goroutine与goroutine之间通信的重要桥梁channel是一个通道,用于端到端的数据传输,这有点像我们平常使用的消息队列,只不过channel的发送方和接受方是 goroutine 对象,属于内存级别的通信。这里涉及到了goroutine概念,goroutine是轻量级的......
  • 亚马逊筋膜枪UL1647测试报告申请
    筋膜枪,又称深层肌筋膜冲击仪,是一种通过高频冲击放松身体的软组织的软组织康复工具。[1]筋膜枪可理解为DMS(电动深层肌肉刺激器)的民用版本。使用时振动频率会发生变化,其基本功能与DMS相似。[2]筋膜枪的使用必须注意方法和方法。同时,筋膜枪的首次使用需要在专业人士的指导下使用。最好......