在Go中创建包的工作流程

AppTest:

我知道Go中的程序是从main功能开始的。但是我想知道为新程序包创建功能的工作流程是什么。

例如在python中,__main__当直接调用模块时,在模块中使用当模块从另一个文件导入时,__main__将被忽略。在开发新模块时,这很有用。

if __name__ == "__main__":
    # Run module code here if module called directly

对于Go,我使用了test.go文件package main以及main.go文件来测试正在创建的包中的功能。

// test.go
package main

import (
    "newpackage"
)

func main() {
    newpackage.MyNewFunc()
}

有没有更好的方法可以做到这一点,或者这是标准的工作流程?谢谢。

重:

您不会使用进行Go语言测试mainGo有其自己的测试框架。

首先,阅读“如何编写Go代码”,它将解释Go的程序包布局和测试工具。最好与他们一起使用,因为很多Go工具都希望使用这种布局。

创建软件包时,请将其放在中~/go/src我建议您使用您喜欢使用的存储库遵循约定,即使您不一定要上传这些内容。它可以改善组织;go get也将放入其他外部软件包~/go/src/

例如,~/go/src/github.com/schwern/newpackage/即使我不打算将此内容上传到Github ,我也要使用github.com/schwern在Go源代码树中充当我的“组织”。

将功能放在newpackage.go下面package newpackage

$ cat ~/go/src/github.com/schwern/newpackage/newpackage.go 
package newpackage

func MyNewFunc() string {
    return "Hello!"
}

然后测试就在newpackage_test.go旁边newpackage.go这些应该是Python所熟悉的,编写了一堆Test *函数。与Python不同,它不使用断言。

$ cat ~/go/src/github.com/schwern/newpackage/newpackage_test.go 
package newpackage_test

import(
    "testing"
    "github.com/schwern/newpackage"
)

func TestMyNewFunc( t *testing.T ) {
    want := "Hello!"
    have := newpackage.MyNewFunc()

    if have != want {
        t.Errorf("MyNewFunc(): have: '%v', want: '%v'", have, want )
    }
}

如果go test在包目录中运行,它将编译当前包及其依赖项,*_test.go在包目录中查找并编译所有文件,并执行其Test*功能。

$ pwd
/Users/schwern/go/src/github.com/schwern/newpackage
$ go test -v
=== RUN   TestMyNewFunc
--- PASS: TestMyNewFunc (0.00s)
PASS
ok      github.com/schwern/newpackage   0.013s

请注意,该测试与测试所用的包装不同。这使其成为黑盒测试,它只能看到导出的(即UpperCase)函数。您可以通过将测试放在相同的程序包中来进行Glassbox测试,最好在单独的文件中进行测试newpackage_internal_test.go

不幸的是,Go没有断言函数,上面的if和调用t.Errorf是等效的。并不是不断地手动滚动它们,而是提供了诸如stvp / assert之类的断言功能的库运行后,go get github.com/stvp/assert您可以写...

package newpackage_test

import(
    "testing"
    "github.com/schwern/newpackage"
    "github.com/stvp/assert"
)

func TestMyNewFunc( t *testing.T ) {
    assert.Equal( t, newpackage.MyNewFunc(), "Hello!" )
}

如果要使用的可执行文件,newpackage则应将其放在自己的程序包中。除非它是不可或缺的一部分newpackage

$ cat ~/go/src/github.com/schwern/newexec/main.go 
package main

import (
    "fmt"
    "github.com/schwern/newpackage"
)

func main() {
    fmt.Println(newpackage.MyNewFunc())
}

如果您想进行测试main,则testing软件包提供了特殊TestMain功能 ……尽管我承认我并不完全了解它。像任何其他语言一样,最好将尽可能多的功能放入库调用中并main成为精简包装。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章