加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

测试 – 如何测试golang命令行输出

发布时间:2020-12-16 09:26:16 所属栏目:大数据 来源:网络整理
导读:我想测试golang命令行应用程序的输出,但我不太确定如何使用go的测试库. 假设我有一个这样的程序: package mainimport ( "flag" "fmt")func main() { const ( cityDefault = "San Francisco" cityDoc = "the city you want the forecast for" ) var city str
我想测试golang命令行应用程序的输出,但我不太确定如何使用go的测试库.

假设我有一个这样的程序:

package main

import (
    "flag"
    "fmt"
)

func main() {
    const (
        cityDefault = "San Francisco"
        cityDoc     = "the city you want the forecast for"
    )
    var city string
    flag.StringVar(&city,"city",cityDefault,cityDoc)
    flag.StringVar(&city,"c",cityDoc)
    flag.Parse()

    fmt.Println(city)
}

我想测试这两个:

$./myapp -c "Los Angeles"
$./myapp -city "Los Angeles"

…输出失落的洛杉矶.所以,我想问题是,你如何进行集成测试golang命令行应用程序的输出?

解决方法

这是解析命令行参数的一个不好的例子,但它显示了我用来在我的应用程序中测试命令行参数的框架.

main.go

package main

import (
    "log"
    "os"
)

func main() {
    var city string
    parseFlags(&city,os.Args)

    log.Println(city)
}

func parseFlags(result *string,args []string) {
    cityDefault := "San Francisco"

    switch len(args) {
    case 3:
        *result = args[2]
    default:
        *result = cityDefault
    }
}

main_unit_test.go

package main

import (
    "log"
    "testing"
)

// TestParseFlags - test our command line flags
func TestParseFlags(t *testing.T) {
    var parseFlagsTests = []struct {
        flags    []string // input flags to the command line
        expected string   // expected
    }{
        {[]string{"/fake/loc/main"},"San Francisco"},{[]string{"/fake/loc/main","-c","Los Angeles"},"--city",}

    for _,tt := range parseFlagsTests {
        var output string
        parseFlags(&output,tt.flags)
        if output != tt.expected {
            t.Errorf("expected: %s,actual: %s",tt.expected,output)
        }
    }
}

我通常使用this package解析所有应用程序中的命令行参数.我将按如下方式构建我的代码(测试未显示,但它们通常遵循上面显示的测试要点):

main.go

package main

import (
    "log"
    "os"

    "myDir/cli"
)

func main() {
    // Grab the user inputed CLI flags
    cliFlags := cli.FlagsStruct{}
    cliErr := cli.StartCLI(&cliFlags,os.Args)
    if cliErr != nil {
        log.Println("Error grabbing command line args")
        log.Fatal(cliErr)
    }

    // Do stuff ...
}

/myDir/cli.go

package cli

import "github.com/urfave/cli"

// FlagsStruct - holds command line args
type FlagsStruct struct {
    MyFlag string
}

// StartCLI - gathers command line args
func StartCLI(cliFlags *FlagsStruct,args []string) error {
    app := cli.NewApp()
    app.Action = func(ctx *cli.Context) error {
        MyFlag := ctx.GlobalString("my-flag")

        // build the cli struct to send back to main
        cliFlags.MyFlag = MyFlag
        return nil
    }
    app.Authors = []cli.Author{
        {
            Email: "my@email.com",Name:  "Adam Hanna",},}
    app.Flags = []cli.Flag{
        cli.StringFlag{
            Name:  "my-flag,f",Usage: "My flag usage goes here",Value: "myDefault",}
    app.Name = "myAppName"
    app.Usage = "My App's Usage"
    app.Version = "0.0.1"
    return app.Run(args)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读