Home  >  Article  >  Backend Development  >  Can You Call a Test Function from Outside a Test File in Go?

Can You Call a Test Function from Outside a Test File in Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 06:32:02973browse

Can You Call a Test Function from Outside a Test File in Go?

Can You Invoke a Test Function from Outside a Testing File?

In Go, unit tests are typically run using go test, which identifies and executes test functions marked with the testing.T parameter. However, the question arises: can one invoke a test function from a non-test file to initiate test execution?

The Answer: A Framework Limitation

Unfortunately, the answer is no. Go's testing framework is designed to enforce a separation between test and non-test code. Test functions should only be called from within test files, and the units under test must be imported from the appropriate package.

Testing Patterns in Go

Go supports two primary testing patterns:

  • Black-box testing: Tests exported functions from outside the package, simulating how other packages would interact with them.
  • White-box testing: Tests unexported functions from within the package, providing access to internal implementation details.

Putting It into Practice

Consider an example package named example with an add utility function and an exported Sum function that utilizes the internal add function.

example.go: Package with Exported and Unexported Functions

<code class="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
}</code>

Black-Box Testing in example_test.go

<code class="go">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()
        }
    }
}</code>

White-Box Testing in example_internal_test.go

<code class="go">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()
        }
    }
}</code>

In conclusion, invoking a test function from outside a test file is not possible due to the designed separation between test and non-test code in Go. Unit tests should always be executed via the go test command, ensuring separation of concerns and preventing unintended code execution.

The above is the detailed content of Can You Call a Test Function from Outside a Test File in Go?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn