为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 go 模块导入到 /*_test.go 文件中?

如何将 go 模块导入到 /*_test.go 文件中?

Go
慕运维8079593 2022-09-26 17:21:42
如何将我的函数导入到我的测试文件夹中?我在cmd目录中运行,它创建了一个go.mod文件,但是当我尝试在测试中导入它时,我无法访问函数。我在根项目目录中运行,错误是:go mod initmodule "cmd"go test ./testtest/services_test.go:4:2: "cmd" is not an importable package;myproject├── cmd     ├── main.go (package main)     ├── helper.go (package main)     └── services.go (package main)├── test     ├── helper_test.go (package_main)     └── services_test.go (package main)├── go.mod (module cmd)└── go.sum在 cmd/services.go 中package mainfunc doStuff() {   // TODO}在测试中/services_test.gopackage mainimport {    "cmd"    "testing"}func TestdoStuff (*testing.T) {    cmd.doStuff()}
查看完整描述

3 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

给定包的测试应位于该包中,以便它们可以看到该包的未导出变量、字段和方法,并且根本不需要导入该包。不要将它们放在单独的目录中。test

如有必要,您可以导入其他包来测试此包,但无法看到其他包中未导出的内容。在这方面,测试与任何其他文件没有什么不同。


查看完整回答
反对 回复 2022-09-26
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

正如其他答案中指出的那样,测试文件必须与测试文件位于同一目录中。可以查看教程创建 Go 模块,然后添加测试

以下是这些教程中的示例:

myproject

├── greetings

     ├── greetings.go (package greetings)

     ├── greetings_test.go (package greetings)

├── go.mod

└── go.sum

问候语文件:


package greetings


import "fmt"


// Hello returns a greeting for the named person.

func Hello(name string) string {

    // Return a greeting that embeds the name in a message.

    message := fmt.Sprintf("Hi, %v. Welcome!", name)

    return message

}

greetings_test.go 文件包含两个测试:


package greetings


import (

    "testing"

    "regexp"

)


// TestHelloName calls greetings.Hello with a name, checking

// for a valid return value.

func TestHelloName(t *testing.T) {

    name := "Gladys"

    want := regexp.MustCompile(`\b`+name+`\b`)

    msg, err := Hello("Gladys")

    if !want.MatchString(msg) || err != nil {

        t.Fatalf(`Hello("Gladys") = %q, %v, want match for %#q, nil`, msg, err, want)

    }

}


// TestHelloEmpty calls greetings.Hello with an empty string,

// checking for an error.

func TestHelloEmpty(t *testing.T) {

    msg, err := Hello("")

    if msg != "" || err == nil {

        t.Fatalf(`Hello("") = %q, %v, want "", error`, msg, err)

    }

}


查看完整回答
反对 回复 2022-09-26
?
收到一只叮咚

TA贡献1821条经验 获得超5个赞

的 已编译项目是二进制文件,该二进制文件是包的下游用户将与之交互的内容。因此,验证 行为的测试应该针对二进制文件本身进行测试,而不是针对用于实现该二进制文件的单个函数进行测试。package mainpackage main

可以通过以下方法编写此类测试:使用要运行的包(可能使用标志将二进制文件输出到测试的临时目录),然后使用包执行生成的二进制文件。os/execgo build cmd-oos/exec

或者,使用第三方测试包(如 github.com/rogpeppe/testscript)编写更简洁的脚本驱动测试。

或者,将任何帮助程序函数分解为内部,并测试这些包的导出函数


使用上述任何一种方法,给定包的测试仍与该包属于同一目录。这样,当用户运行时,他们可以确信它确实有效 - 如果测试位于不同的包中,他们显然不会知道为了测试包而运行。go test cmdcmdgo test testcmd


查看完整回答
反对 回复 2022-09-26
  • 3 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号