Golang - 用于解析 yaml 文件并检查对象的单元测试

Posted

技术标签:

【中文标题】Golang - 用于解析 yaml 文件并检查对象的单元测试【英文标题】:Golang - Unit test for parse yaml file and check objects 【发布时间】:2018-08-17 07:54:45 【问题描述】:

我想测试 yaml 的解析并通过单元测试对其进行测试 我已经创建了具有适当类型的结构,但断言总是 错误的,我尝试使用以下代码,但不断失败

这是 有效 的 yaml 内容(可能副本已更改,但我能够正确解析)

ID: demo
version: 0.0.5

dep:
 - name: db
   path: mtb
   requires:
    - name: vi_db


 - name: srv
   path: srv1
   properties:
     LOG_LEVEL: "info"


   parameters:
     mem: 12G
   requires:
     - name: db
       properties:

这是我创建的测试

    func Test_parseFile(t *testing.T) 

        yamlfile, err := ioutil.ReadFile("./testdata/file.yaml")

        type Properties map[string]string
        type Parameters map[string]interface

        type Modules struct 
            Name string
            Path string `yaml:"path,omitempty"`
            Requires   []Requires `yaml:"requires,omitempty"`
            Properties Properties `yaml:"properties,omitempty"`
        

   type Requires struct 
      Name       string     `yaml:"name,omitempty"`
      Properties Properties `yaml:"properties,omitempty"`
    



    type args struct 
        contentFile []byte
    


     tests := []struct 
            name        string
            args        args
            wantOut     Properties
            wantNoTests bool
            wantErr     bool
        
            
                name: "test",
                args: args
                    contentFile: yamlfile,
                ,

                wantOut: Modules
                    Name: "srv",
                    Path: "srv1",

                    Properties
                        "LOG_LEVEL":       "info",
                        "DEBUG_LOG_LEVEL": "ALL",
                    ,
                    Parameters:
                        "mem":"12G",
                    ,
                    Requires: 
                        name: "db",
                        Properties
                            "CONFIG": '[tomcontext.xml:
                            "service_nameDB" : "~con-name"]'   
                        ,
                    ,
                ,

                wantNoTests: true,
                wantErr:     true,
            ,
        

这是断言代码

for _, tt := range tests 
        t.Run(tt.name, func(t *testing.T) 

            gotOut := ParseFile(tt.args.contentFile)


            if !reflect.DeepEqual(gotOut.Modules[1], tt.wantOut) 

                t.Errorf("parseFile() = %v, want %v", gotOut.Modules[2], tt.wantOut)
            

错误是:

parseFile() = map[], want map[LOG_LEVEL:info DEBUG_LOG_LEVEL:ALL]

我应该如何克服它来检查模块属性?

ParseFile 方法就是 err := yaml.Unmarshal([]byte(yamlFile), &yamlconent)

【问题讨论】:

我的回答解决了你的问题吗? 【参考方案1】:

我不完全确定问题是什么,但我设法让你的测试像这样工作:

package sandbox

import (
    "testing"

    "github.com/stretchr/testify/assert"
    "github.com/stretchr/testify/require"
    "gopkg.in/yaml.v2"
)

type Properties map[string]string
type Parameters map[string]interface

type Requires struct 
    Name       string     `yaml:"name,omitempty"`
    Properties Properties `yaml:"properties,omitempty"`


type Module struct 
    Name       string
    Path       string     `yaml:"path,omitempty"`
    Requires   []Requires `yaml:"requires,omitempty"`
    Properties Properties `yaml:"properties,omitempty"`
    Parameters Parameters `yaml:"parameters,omitempty"`


type File struct 
    Modules []Module


func Test_ParseFile(t *testing.T) 
    input := []byte(`ID: demo
version: 0.0.5

modules:
 - name: db
   path: mtb
   requires:
    - name: vi_db


 - name: srv
   path: srv1
   properties:
     LOG_LEVEL: "info"
     DEBUG_LOG_LEVEL : ALL
   parameters:
     mem: 12G
   requires:
     - name: db
       properties:
            CONFIG: '[tomcontext.xml:
              "service_nameDB" : "~con-name"]'`)

    tests := []struct 
        name    string
        wantOut Module
    
        
            name: "test",

            wantOut: Module
                Name: "srv",
                Path: "srv1",

                Properties: Properties
                    "LOG_LEVEL":       "info",
                    "DEBUG_LOG_LEVEL": "ALL",
                ,
                Parameters: Parameters
                    "mem": "12G",
                ,
                Requires: []Requires
                    
                        Name: "db",
                        Properties: Properties
                            "CONFIG": `[tomcontext.xml: "service_nameDB" : "~con-name"]`,
                        ,
                    ,
                ,
            ,
        ,
    

    for _, tt := range tests 
        t.Run(tt.name, func(t *testing.T) 
            actual, err := ParseFile(input)
            require.NoError(t, err)
            require.NotNil(t, actual)
            require.Len(t, actual.Modules, 2)
            assert.Equal(t, tt.wantOut, actual.Modules[1])
        )
    


func ParseFile(yamlFile []byte) (File, error) 
    var f File
    err := yaml.Unmarshal(yamlFile, &f)
    return f, err

请注意,我导入了 https://github.com/stretchr/testify 以使测试更容易一些。当然,您可以将其替换为原始的 reflect.DeepEquals 支票。 Testify 在这里很有用,因为它会打印一个有用的差异,以防不符合期望。

【讨论】:

以上是关于Golang - 用于解析 yaml 文件并检查对象的单元测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Golang 中使用动态键解析 YAML

golang yaml配置文件解析

Golang yaml与toml解析

Golang使用yaml第三方包无法正确解析配置参数

golang 配置文件解析神器--viper

Go 处理yaml类型的配置文件