如何在go(golang)中测试未导出的(私有)函数?

时间:2014-07-08 01:30:24

标签: unit-testing go

我有兴趣在go中创建“未导出(私有)函数”的单元测试。然而,它基本上很难在测试包中形成单元测试,因为我必须使它们“公开”。最终,它们打破了他们私密性的全部意义。关键是这些辅助函数有助于模块化,现在它们是模块化的,能够为它们创建单元测试而不会让除了测试包之外的所有人都可以使用它们会很好,很好它们不是应该被访问的函数或者除测试套件或实际包装本身以外的任何人使用。

有什么建议吗?是否可以导出到自己的软件包和一个额外的软件包或其他类似的东西?

4 个答案:

答案 0 :(得分:42)

在包中创建一个测试文件

library_test.go

package mypkg

func TestPrivateStruct(t *testing.T){
  pf := private{ "Private Field" }
  ....
}

library.go

package mypkg

type private struct {
  privateField string
}

go test mypkg -v将使用您的私有结构运行您的测试

答案 1 :(得分:5)

首先,通过使用内部测试的包名称(例如 mypkg )并使用相同的包名称" _test&,您可以将两种类型的测试放在与包相同的位置#34;附加"外部"测试(例如 mypkg_test )。两种类型的测试必须在名称以" _test.go"。

结尾的文件中

但是,单元测试的重点是测试"外部接口" (即公共职能)到您的包裹。那就是单元测试应该始终是"白盒"测试(见White Box Testing)。这样你就可以重构你的代码而你的测试不会中断。

当然,有时您需要检查内部一致性,这是通过"外部接口"无法实现的。为此,我发现断言非常宝贵。另一种可能性是增加公共诊断"名称表明它们不能正常使用的函数。

答案 2 :(得分:3)

如果您想使用pkg_test名称作为测试的程序包名称,并且仍在测试未导出的字段,那么一个简单的技巧就是在包名称为pkg的程序包中创建export_test.go文件,然后在其中导出未导出的字段

文件code.go

package pkg 

func getFunc(){}

export_test.go文件

package pkg 
var GetFunc = getFunc

文件code_test.go

package pkg_test
func TestGetFunc(t *testing.T) {
    testFunc:=pkg.GetFunc

    //check your test scenario here

}

请注意,所有这些文件都在同一文件夹中

该解决方案的灵感来自here

答案 3 :(得分:0)

Go 1.5 开始,您可以将内部包用于包内的共享函数,而不必将它们暴露给外部调用者。

只需在您的包内创建一个名为 internal 的包,将您的共享函数移动到 internal 包内的文件中,并将它们公开为公共函数。然后,您可以像往常一样为这些函数创建测试文件,使用包的 internal_test

例如:

project/
└── domain/
    ├── logic.go
    ├── logic_test.go
    ├── wisdom.go
    ├── wisdom_test.go
    └── internal/
        ├── shared.go
        └── shared_test.go  

只有 domain 包中的代码才能查看和访问 internal 包中公开的函数。如需更深入的说明,请参阅 proposal 或查看 go source code