Maison > développement back-end > Golang > Problème lors de l'exécution du test de la fonction principale dans Go

Problème lors de l'exécution du test de la fonction principale dans Go

PHPz
Libérer: 2024-02-11 13:00:08
avant
553 Les gens l'ont consulté

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

L'éditeur PHP Xigua rencontre souvent des problèmes lors de l'exécution de la fonction principale de test lors du développement du langage Go. Cette situation peut empêcher le programme de fonctionner correctement ou produire des résultats inattendus. Afin de résoudre ce problème, nous devons soigneusement déterminer les causes possibles et prendre les mesures appropriées pour corriger le code. Cet article présentera quelques problèmes courants et des solutions pour aider les développeurs à mieux gérer de telles situations.

Contenu de la question

J'ai écrit ce test il y a quelques mois et il s'est exécuté avec succès sans aucune erreur et la fonction init() n'a jamais été exécutée car j'ai uniquement appelé la fonction de gestionnaire à partir du test mais maintenant elle échoue et a obtenu l'erreur suivante :

/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
Copier après la connexion

Je sais que le test appelle la fonction init(), mais pourquoi pas plus tôt. Est-ce qu'il me manque quelque chose à comprendre ici ?

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)
}
Copier après la connexion

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
}
Copier après la connexion

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))
    })

}
Copier après la connexion

La solution de contournement

nommée init(全部小写)的顶级函数总是,并且总是在测试之前执行。 init 现在失败的原因,即使以前没有,现在看来,是环境的变化;即在 CONFIG_ID a été définie auparavant, mais ne l'est plus maintenant, du moins pas dans le shell où les tests sont exécutés.

//m.sbmmt.com/link/905d8fc4ffb4275a428a84589810f8f4

Si vous utilisez -tags test 运行 go test 命令,则将遵守 init.go 文件顶部的构建约束,即 //go:build !test,并且该文件将从测试中省略建造。但默认情况下,没有“test”构建标签,因此如果没有 -tags test 参数,这些构建约束将被忽略,并且 init.go, le fichier sera inclus dans la version de test. p>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal