首页 > 其他分享 >Go语言精进之路读书笔记第43条——使用testdata管理测试依赖的外部数据文件

Go语言精进之路读书笔记第43条——使用testdata管理测试依赖的外部数据文件

时间:2024-03-03 11:00:10浏览次数:15  
标签:golden err 读书笔记 tt 43 want Go got testdata

43.1 testdata目录

Go语言规定:Go工具链将忽略名为testdata的目录。

  • 开发者可以在名为testdata的目录下存放和管理测试代码依赖的数据文件,数据文件可作为输入也可作为输出
  • go test命令在执行时会将被测试程序包源码所在目录设置为其工作目录,可以这样使用f, err := os.Open("testdata/data-001.txt")
  • 不同操作系统对路径分隔符定义有差别,这样使用增加测试代码的可移植性f, err := os.Open(filepath.Join("testdata", "data-001.txt"))

43.2 golden文件惯用法

golden文件模式:将预期数据采集到文件的过程与测试代码融合到一起

  • 测试代码会先将最新的预期结果写入testdata目录下的golden文件中,然后将该结果与从golden文件中读出的结果作比较
func TestAttendeeMarshal(t *testing.T) {
    tests := []struct {
        fileName string
        a        Attendee
    }{
        {
            fileName: "attendee1.xml",
            a: Attendee{
                Name:  "robpike",
                Age:   60,
                Phone: "13912345678",
            },
        },
    }

    for _, tt := range tests {
        got, err := xml.MarshalIndent(&tt.a, "", "  ")
        if err != nil {
            t.Fatalf("want nil, got %v", err)
        }

        want, err := ioutil.ReadFile(filepath.Join("testdata", tt.fileName))
        if err != nil {
            t.Fatalf("open file %s failed: %v", tt.fileName, err)
        }

        if !bytes.Equal(got, want) {
            t.Errorf("want %s, got %s", string(want), string(got))
        }
    }
}

改造后

var update = flag.Bool("update", false, "update .golden files")

func TestAttendeeMarshal(t *testing.T) {
    tests := []struct {
        fileName string
        a        Attendee
    }{
        {
            fileName: "attendee1.golden",
            a: Attendee{
                Name:  "robpike",
                Age:   60,
                Phone: "13912345678",
            },
        },
    }

    for _, tt := range tests {
        got, err := xml.MarshalIndent(&tt.a, "", "  ")
        if err != nil {
            t.Fatalf("want nil, got %v", err)
        }

        golden := filepath.Join("testdata", tt.fileName)
        if *update {
            ioutil.WriteFile(golden, got, 0644)
        }

        want, err := ioutil.ReadFile(golden)
        if err != nil {
            t.Fatalf("open file %s failed: %v", tt.fileName, err)
        }

        if !bytes.Equal(got, want) {
            t.Errorf("want %s, got %s", string(want), string(got))
        }
    }
}

标签:golden,err,读书笔记,tt,43,want,Go,got,testdata
From: https://www.cnblogs.com/brynchen/p/18049687

相关文章

  • go1.22 新特性(日常使用相关)
    for循环循环共享变量问题Go在1.22版本之前,for循环迭代器的变量是一个单一变量,使用不当,会导致意想不到的行为,可能会造成共享循环变量的问题。如依旧要使用旧版本,可以主动配置GOEXPERIMENT=loopvarpackagemainimport( "fmt" "time")funcmain(){ nums:=[]int{1......
  • 一文搞懂 Go 1.21 的日志标准库 - slog
    一文搞懂Go1.21的日志标准库-slog原创 rubys_ awk 2024-01-3120:20 广东 1人听过在过去多年里,我们在Go中写日志的时候,通常都是使用 Zerolog 或者 Zap 这两个包。在本文中,我们将重点探讨Go最近引入的 log/slog 包,该包旨在将高性能、结构化和分级日志......
  • AtCoder Beginner Contest 343
    基本情况前四题秒了,但是都有不够优雅的地方F知道是线段树,但是写不出来,极其绝望C-343C-343(atcoder.jp)更简洁的回文判断MyCodeboolcheck_p(i64x){std::strings(std::to_string(x));intn=sz(s);for(inti=0;i<n/2;i++){if......
  • C - 343
    C-343https://atcoder.jp/contests/abc343/tasks/abc343_c 思路先找出最大三次方数,次数小于或者等于n,参考:在三次方根的可能范围内,使用二分查找法,定位最大的三次方根https://www.cnblogs.com/Ghost-Knight/p/17970849 从此最大的三次方根开始,向下枚举,枚举过程中对......
  • ABC343
    T1:WrongAnswer模拟代码实现a,b=map(int,input().split())c=a+bifc==0:print(1)else:print(0)T2:AdjacencyMatrix模拟代码实现n=int(input())a=[list(map(int,input().split()))foriinrange(n)]foriinrange(n):print(*[j+1f......
  • AtCoder Beginner Contest 343:起航
    AtCoderBeginnerContest343:起航2024/3/2/22:53有点儿晚了,简单总结一下。前4题都很基础,一点点小思维,其中C题边界又盲目追求刚刚好,WA了一次,总结经验,程序实际设计应该略微大于数据范围。EFG开始就做不动了,只剩了20多分钟,先通读然后看E题,E题读了半天发现大概是体积交并反......
  • AtCoder Beginner Contest 343
    B-AdjacencyMatrix难度:⭐题目大意给定一个无向图的邻接矩阵,问每个节点都和哪些节点相练;解题思路没啥好说的;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#defineendl'\n'......
  • vscode+gitee+picgo实现稳定图床
    目录:目录目录:1.为什么使用vscode+gitee+picgo实现完美图床2.安装VSCode2.1安装VSCode软件及相关插件3.安装picgo4.准备Gitee图床5.配置相关设置尾声1.为什么使用vscode+gitee+picgo实现完美图床为什么要选择VSCode+PicGo+Gitee主要是平时写文章的平台,要么是收会员费......
  • go语言实现扫雷
    源码如下packagemainimport( "archive/zip" "bytes" "encoding/base64" "fmt" "image" "image/color" "image/png" "log" "math/rand" "strings" "ti......
  • AtCoder Beginner Contest 343(小白来了)
    A-WrongAnswer思路:给你两个数(A,B0~9)输出非A+B(0~9)解法:许多(A+B)^1等等Code:#include<iostream>usingnamespacestd;intmain(){intA,B;cin>>A>>B;cout<<!(A+B);return0;}B-AdjacencyMatrix思路......