首页 > 其他分享 >[Go] Unit testing Go code

[Go] Unit testing Go code

时间:2024-02-06 22:22:25浏览次数:32  
标签:return nil err testing api Go Unit

  • Vanilla Go includes Testing
  • A test is a file with suffix_test.go
  • You define functions with prefix Test and with an special signature receiving a *testing.T arguement
  • The function inside calls methods of T
  • You can create subtests as goroutines
  • You use the CLI with go test
  • TableDrivenTest Design Pattern
  • Fuzzing since 1.19

Fuzzing: Automated testing that manipulates inputs to find bugs. Go fuzzing uses coverage guidance to find failures and is valuable in detecting security exploits and vunlnerabilities.

 

Code:

查看代码
package api

import (
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"strings"

	"project/data"
)

const apiUrl = "https://cex.io/api/ticker/%s/USD"

// add * to struct in return type is a pattern
// because if you want to return nil from the function
// without *, it doesn't compile
func GetRate(currency string) (*data.Rate, error) {

	if len(currency) < 3 {
		return nil, fmt.Errorf("3 characteres minimu; %d received", len(currency))
	}

	upCurrency := strings.ToUpper(currency)
	res, err := http.Get(fmt.Sprintf(apiUrl, upCurrency))
	if err != nil {
		return nil, err
	}

	var cexResp CEXResponse
	if res.StatusCode == http.StatusOK {
		// Wait all stream have been readed
		bodyBytes, err := io.ReadAll(res.Body)
		if err != nil {
			return nil, err
		}


		errJson := json.Unmarshal(bodyBytes, &cexResp)
		if errJson != nil {
			return nil, errJson
		}
	} else {
		return nil, fmt.Errorf("status code received: %v", res.StatusCode)
	}

	rate := data.Rate{Currency: upCurrency, Price: float32(cexResp.Ask)}
	return &rate, nil
}

 

Test:

package api_test

import (
	"testing"

	"project/api"
)

func TestApiCallWithEmptyCurrency(t *testing.T) {
	_, err := api.GetRate("")
	if err == nil {
		t.Error("error was not found")
	}
}

 

标签:return,nil,err,testing,api,Go,Unit
From: https://www.cnblogs.com/Answer1215/p/18010370

相关文章

  • [Go] Go routines with WaitGroup and async call
    So,let'ssaywehaveafunctiontofetchcryptocurrenciesprice:packagemainimport( "fmt" "sync" "project/api")funcmain(){gogetCurrencyData("BTC")gogetCurrencyData("BCH")......
  • 离散化(Discretization Algorithm)
    简介离散化——把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率,即:在不改变数据相对大小的条件下,对数据进行相应的缩小。离散化本质上可以看成是一种\(哈希\),其保证数据在哈希以后仍然保持原来的全/偏序关系。描述离散化用于处理一些个数不多,但是数......
  • 2月摸鱼计划04 Go语言依赖管理
    2.0依赖管理这一章我们主要讲解go的依赖管理,主要涉及go依赖管理的演进路线和gomodule实践依赖指各种开发包对于helloworld以及类似的单体函数只需要依赖原生SDK,而实际工程会相对复杂,我们不可能基于标准库0~1编码搭建,而更多的关注业务逻辑的实现,而其他的涉及框架、日志、driver......
  • Django
    Django一、MTV和MVC的区别首先介绍Django的设计模式,也就是MTV,在这之前我们先了解MVC模式。1、MVC设计模式MVC是Model-View-Controller的缩写Model代表数据存储层,是对数据表的定义和对数据的增删改查;View代表视图层,是系统前段显示部分,它负责显示什么和如何进行显示;Controll......
  • golang之设计模式
    [选项模式]packagemainimport"fmt"typeOptionFuncfunc(*DoSomethingOption)typeDoSomethingOptionstruct{aintbstringcbool}funcNewDoSomethingOption(cbool,opts...OptionFunc)*DoSomethingOption{s:=&DoSomethi......
  • 限制Unity帧率的方式
    1)限制Unity帧率的方式2)只在编辑器内,纹理不开启Read&Write情况下,如何获取纹理所有颜色值3)如何在FBX剔除Lit.shader依4)如何在iPhone12mini设备上禁止竖屏这是第373篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习......
  • mongodb大数据量分页查询优化
    业务背景mongodb大数据量分页查询主要耗时是查询总条数,所以有两种优化方式1.不查询总条数,查询最近N页数据[改动略多,执行耗时很短]2.增加页面时间范围必填条件[改动很小,执行耗时略长,与数据量有关][比如默认查询创建时间最近一个月的数据根据数据量做调整,创建时间有组合索引]这两种......
  • ACK One Argo工作流:实现动态 Fan-out/Fan-in 任务编排
    作者:庄宇什么是 Fan-outFan-in在工作流编排过程中,为了加快大任务处理的效率,可以使用Fan-outFan-in任务编排,将大任务分解成小任务,然后并行运行小任务,最后聚合结果。由上图,可以使用DAG(有向无环图)编排Fan-outFan-in任务,子任务的拆分方式分为静态和动态,分别对应静态DAG......
  • 【Unity】记一次卡顿优化(由3D资源面数过多引起)
    这个优化方法可能仅对我有效,我只是做一个记录条件:模型很大,并且shader中使用了Smoothness优化方法打开Mesh引用的模型修改模型Normal为calculate修改SmoothnessSource为fromAngle修改SmoothingAngle降到你可以接收的值,我设置的是20。在unity文档中说的是,通常SmoothingAn......
  • [ Go] GoRoutines and Channels
    AgoroutineistheGowayofsuingthreads,weopenagoroutinejustbyinvokinganyfunctionwithagoprefix.gofunctionCall()Goroutinescancommunicatethroughchannels,anspecialtypeofvariable,achannelcontainsavalueofanykind,aroutinec......