是否可以从另一个文件调用测试 Func 来开始测试

Arv*_*ind 2 go

是否可以从非测试 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)

我可以这样做吗?

Nic*_*rin 7

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是一个非常流行且功能强大的帮助单元测试的