是否可以从非测试 go 文件中调用测试函数来开始执行测试?
例如,我有一个测试功能:
package API
import "testing"
func TestAPI(t *testing.T) {
...
}
Run Code Online (Sandbox Code Playgroud)
我需要从非测试 go 文件中调用它。
package main
import "../API"
API.TestAPI()
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗?
Go 中有一些很棒的测试模式。不幸的是,您尝试测试的方式行不通。
您的单元测试应该使用命令运行go test <pkg。永远不应该从您的代码本身内部调用测试。
通常,Go 中有两种主要的单元测试形式——黑盒单元测试和白盒单元测试。
白盒测试:从包本身测试未导出的功能。
黑盒测试:测试从包外部导出的函数,模拟其他包将如何与其交互。
如果我有一个包,example我想测试。有一个简单的导出函数,可以对提供的数字列表求和。该函数还使用了一个未导出的实用程序Sum函数。
例子.go
package example
func Sum(nums ...int) int {
sum := 0
for _, num := range nums {
sum = add(sum, num)
}
return sum
}
func add(a, b int) int {
return a + b
}
Run Code Online (Sandbox Code Playgroud)
example_test.go:黑盒测试
请注意,我正在测试example包,但测试位于example_test包中。添加_test使 Go 编译器满意并让它知道这是一个用于example. 在这里,我们只能访问导出的变量和函数,这让我们可以测试外部包在导入和使用我们的example包时会遇到的行为。
package example_test
import (
"testing"
"example"
)
func TestSum(t *testing.T) {
tests := []struct {
nums []int
sum int
}{
{nums: []int{1, 2, 3}, sum: 6},
{nums: []int{2, 3, 4}, sum: 9},
}
for _, test := range tests {
s := example.Sum(test.nums...)
if s != test.sum {
t.FailNow()
}
}
}
Run Code Online (Sandbox Code Playgroud)
example_internal_test.go:白盒测试
请注意,我正在测试example包,并且测试也位于example包中。这允许单元测试访问未导出的变量和函数。
package example
import "testing"
func TestAdd(t *testing.T) {
tests := []struct {
a int
b int
sum int
}{
{a: 1, b: 2, sum: 3},
{a: 3, b: 4, sum: 7},
}
for _, test := range tests {
s := add(test.a, test.b)
if s != test.sum {
t.FailNow()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我希望这能让你更好地理解 Go 的测试框架是如何设置和应该使用的。为简单起见,我没有在示例中使用任何外部库,尽管github.com/stretchr/testify是一个非常流行且功能强大的帮助单元测试的包。
| 归档时间: |
|
| 查看次数: |
3501 次 |
| 最近记录: |