Problem executing main function test in Go

PHPz
Release: 2024-02-11 13:00:08
forward
516 people have browsed it

在 Go 中执行 main 函数测试时出现问题

#When editor Xigua of php is developing the Go language, he often encounters problems when executing the main function for testing. This situation may cause the program to not function properly or produce unexpected results. In order to resolve this issue, we need to carefully troubleshoot the possible causes and take appropriate steps to fix the code. This article will introduce some common problems and solutions to help developers better deal with such situations.

Question content

I wrote this test a few months ago and it ran successfully without any errors and the init() function was never executed because I only called it from within the test handler function, but now it fails with the following error:

/usr/local/opt/go/libexec/bin/go tool test2json -t /private/var/folders/wt/fc27nzn51rdbvwvjzkl05hlc0000gs/T/GoLand/___TestHandleRequest_in_next_api_cmd_getAllRawTransportOrders.test -test.v -test.paniconexit0 -test.run ^\QTestHandleRequest\E$
{"level":"fatal","msg":"no configuration found:  not set","time":"2023-08-27T22:48:03+05:30"}

Process finished with the exit code 1
Copy after login

I know the test is calling the init() function, but why not earlier. Am I missing something to understand here?

init.go

//go:build !test
// +build !test

package main

import (
    "crypto/tls"
    "encoding/json"
    log "github.com/sirupsen/logrus"
    "os"

    "lib/storage/ssm"

    "next-api/aws/dynamodb"
    "next-api/cmd/utils"
    "next-api/config"
    "next-api/http"
)

func init() {
    // Log as JSON instead of the default ASCII formatter.
    log.SetFormatter(&log.JSONFormatter{})

    // Output to stdout instead of the default stderr
    // Can be any io.Writer, see below for File example
    log.SetOutput(os.Stdout)

    // Only log the warning severity or above.
    log.SetLevel(log.InfoLevel)

    var err error
    paramsRepo := ssm.NewRepository()

    configID, err := utils.GetEnv("CONFIG_ID")
    if err != nil {
        log.Fatal("no configuration found: ", err)
    }

    cfg, err = config.Load(configID, paramsRepo)
    if err != nil {
        log.Fatal("could not load config: ", err)
    }

    urls := http.URLs{}
    json.Unmarshal([]byte(cfg.MABES.URLs), &urls)

    // configure mTLS
    cert, err := tls.X509KeyPair([]byte(cfg.MABES.Certificate), []byte(cfg.MABES.PrivateKey))
    if err != nil {
        log.Fatal("could not create MABES certificate: ", err)
    }

    MABES, err = http.NewMABESClient(urls, http.WithTLS(cert))
    if err != nil {
        log.Fatal("could not create sofaClient client.", err)
    }

    NEXT = dynamodb.NewRepository(cfg.NEXT.Table)
}
Copy after login

main.go

package main

import (
    "encoding/json"
    "fmt"
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    log "github.com/sirupsen/logrus"
    gohttp "net/http"

    "next-api/api"
    "next-api/config"
    "next-api/errors"
    "next-api/http"
    "next-api/http/problem"
    "next-api/mabes"
    "next-api/next"
)

var (
    cfg   config.Config
    MABES mabes.Client
    NEXT  next.Repository
)

func main() {
    lambda.Start(handler)
}

func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    facilityID := request.PathParameters["facilityID"]
    if facilityID == "" {
        return events.APIGatewayProxyResponse{
            StatusCode: gohttp.StatusBadRequest,
            Headers:    http.Headers("application/problem+json"),
            Body:       problem.ServerError(fmt.Errorf("missing facilityID parameter")).ToJSONResponse(),
        }, nil
    }

    transportOrders, err := api.GetAllRawTransportOrders(facilityID, request.QueryStringParameters, MABES, NEXT)
    b, err := json.Marshal(transportOrders)
    if err != nil {
        log.Errorln(err)

        if errors.Is(errors.NEXTRead, err) {
            return events.APIGatewayProxyResponse{
                StatusCode: gohttp.StatusOK,
                Headers:    http.Headers("application/json"),
                Body:       fmt.Sprintf(`{"data":%s}`, string(b)),
            }, nil
        }

        return events.APIGatewayProxyResponse{
            StatusCode: gohttp.StatusInternalServerError,
            Headers:    http.Headers("application/problem+json"),
            Body:       problem.ServerError(err).ToJSONResponse(),
        }, nil
    }

    return events.APIGatewayProxyResponse{
        StatusCode: gohttp.StatusOK,
        Headers:    http.Headers("application/json"),
        Body:       fmt.Sprintf(`{"data":%s}`, string(b)),
    }, nil
}
Copy after login

main_test.go

package main

import (
    "github.com/aws/aws-lambda-go/events"
    "github.com/stretchr/testify/assert"
    "net/http"
    "strings"
    "testing"
    "time"

    "next-api/api"
    "next-api/mabes"
    "next-api/next"
)

func TestHandleRequest(t *testing.T) {
    t.Run("should return the TransportOrders", func(t *testing.T) {
        req := events.APIGatewayProxyRequest{
            PathParameters: map[string]string{
                "facility": "11",
            },
        }
        timeStamp, _ := time.Parse(time.RFC3339, time.Now().Format(time.RFC3339))
        sofa1 := next.SofaTransferModel{}
        sofa1.Phase = "1"
        sofa1.PartKey.PartCode = "abcd"
        sofa1.PartKey.DispatcherFacility = "11"
        sofa1.PartKey.UsageCode = "01"
        sofa1.Storage.Number = "00315"
        sofa1.Shipment.RequestedArrivalDate = timeStamp.String()
        transportOrders := make([]next.SofaTransferModel, 0)
        transportOrders = append(transportOrders, sofa1)

        getAllRawTransportOrdersCalls := 0
        api.GetAllRawTransportOrders = func(facilityID string, params map[string]string, MABES mabes.Client, NEXT next.Repository) (next.SofaTransferObjects, error) {
            getAllRawTransportOrdersCalls++
            return transportOrders, nil
        }

        // when
        res, err := handler(req)
        // then
        assert.Equal(t, 1, getAllRawTransportOrdersCalls)

        assert.NoError(t, err)
        assert.Equal(t, http.StatusOK, res.StatusCode)

        assert.True(t, strings.Contains(res.Body, transportOrders[0].PartKey.PartCode))
        assert.True(t, strings.Contains(res.Body, transportOrders[0].Storage.Number))
    })

}
Copy after login

Workaround

The top-level function named init (all lowercase) is always , and is always in Test before is executed. init The reason why init is failing now, even if it wasn't before, seems to be a change in environment; i.e. before

CONFIG_ID

was set, but now it is not set, at least not in the shell where the test is executed. set up.

https://www.php.cn/link/905d8fc4ffb4275a428a84589810f8f4

If you run the go test command with -tags test, the build constraints at the top of the init.go file will be respected, which is // go:build !test and the file will be omitted from the test build. But by default, there is no "test" build tag, so without the -tags test parameter, these build constraints will be ignored and the init.go### file will be included in the test build . ### p>

The above is the detailed content of Problem executing main function test in Go. For more information, please follow other related articles on the PHP Chinese website!

source:stackoverflow.com
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!