Maison  >  Article  >  développement back-end  >  Méthodes de tests unitaires pour les fonctions asynchrones dans Go

Méthodes de tests unitaires pour les fonctions asynchrones dans Go

WBOY
WBOYoriginal
2024-05-01 15:36:01371parcourir

Dans Go, les fonctions asynchrones peuvent être testées unitairement avec des tests de concurrence pour simuler une exécution simultanée et tester le comportement de la fonction asynchrone. Les étapes sont les suivantes : Créez un contexte de délai d'attente. Créez une chaîne pour recevoir les résultats. Appelez une fonction asynchrone et écrivez le résultat sur le canal. Lisez le résultat du canal et vérifiez la valeur attendue. Utilisez les instructions select pour gérer les délais d'attente ou les résultats reçus.

Go 中异步函数的单元测试方法

Méthodes de tests unitaires pour les fonctions asynchrones dans Go

Dans Go, les fonctions asynchrones (également appelées coroutines) peuvent être testées unitairement via des tests de concurrence. Les tests de concurrence nous permettent de simuler des exécutions simultanées pour tester le comportement des fonctions asynchrones.

Cas pratique

Supposons que nous ayons une fonction asynchrone appelée greetAsync() qui reçoit un nom et renvoie une chan string avec un message de bienvenue. Voici comment tester unitairement cette fonction à l'aide de tests de concurrence : greetAsync() 的异步函数,它接收一个名称并返回一个带有问候消息的 chan string。以下是如何使用并发测试对该函数进行单元测试:

package async

import (
    "context"
    "testing"
    "time"
)

func TestGreetAsync(t *testing.T) {
    tests := []struct {
        name string
        expected string
    }{
       {"Alice", "Hello Alice!"},
       {"Bob", "Hello Bob!"},
    }

    for _, test := range tests {
        t.Run(test.name, func(t *testing.T) {
            // 创建一个超时上下文
            ctx, cancel := context.WithTimeout(context.Background(), 5 * time.Second)
            defer cancel()
            
            // 创建一个通道来接收结果
            ch := make(chan string, 1)
            
            // 调用 greetAsync() 并将结果写入通道
            go greetAsync(ctx, test.name, ch)
            
            // 从通道中读取结果并检查预期值
            select {
            case r := <-ch:
                if r != test.expected {
                    t.Errorf("expected %q, got %q", test.expected, r)
                }
            case <-ctx.Done():
                t.Errorf("timeout waiting for response")
            }
        })
    }
}

func greetAsync(ctx context.Context, name string, ch chan string) {
    select {
    case <-ctx.Done():
        return // 上下文已超时,返回
    default: 
        // 上下文仍在有效期内,发送问候消息
        ch <- "Hello " + name + "!"
    }
}

在这个示例中,我们设置了一个超时上下文,使用 selectrrreee

Dans cet exemple, nous configurons un contexte de délai d'attente, utilisons select pour lire le résultat du canal ou du délai d'attente, et exécutons un délai d'attente dans les deux Faites des assertions pour vérifier le comportement attendu. 🎜

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!

Déclaration:
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