es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo comprobar si se llama a sync.WaitGroup.Done() en una prueba unitaria.

Digamos que tengo una función llamada “if” que se ejecuta de forma asíncrona como una rutina de go:

func f(wg * sync.WaitGroup){
    defer wg.Done ()
    // Haz algo
}

func principal(){
    var wg sync.WaitGroup
    wg.Add(1)
    go f (& amp; wg)
    wg.Wait () // Esperar hasta que se complete "f"
    // ...
}

¿Cómo crearía una prueba de unidad para “f” que asegure que se llama a “wg.Done ()”?

Una opción es llamar a “wg.Done ()” en la prueba directamente después de que se llame a “f”. Si “f” no llama a “wg.Done ()”, la prueba provocará un error en tiempo de ejecución que no es agradable.
Otra opción sería crear una interfaz para “sync.WaitGroup”, pero eso parece un poco raro.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para probar si wg.Done () se llama en la función f, podemos usar un sync.Mutex para proteger una bandera booleana que indica si se llamó a wg.Done (). En la prueba, podemos esperar a que wg.Wait () devuelva, luego verificar el valor de la bandera para asegurarnos de que se estableció en verdadero. Aquí hay un ejemplo de prueba:

    func TestF (t * testing.T) {
    var wg sync.WaitGroup
    wg.Add (1)
    
    var hecho bool
    var lock sync.Mutex
    
    go func () {
    f (& wg)
    lock.Lock ()
    defer lock.Unlock ()
    hecho = verdadero
    } ()
    
    wg.Wait ()
    
    lock.Lock ()
    defer lock.Unlock ()
    
    if! hecho {
    t.Error ("wg.Done () no se llamó")
    }
    }
    

    En esta prueba, creamos un sync.Mutex llamado lock para proteger la variable booleana hecho. Iniciamos una goroutine que llama a f y establece la bandera hecho en verdadero cuando f ha terminado. En la rutina de prueba principal, llamamos a wg.Wait () para esperar a que f termine y luego verificamos si la bandera hecho se estableció en verdadero. Si no, fallamos la prueba con un mensaje de error.

    Esta prueba garantiza que wg.Done () se llama en la función f y que sync.WaitGroup está sincronizando adecuadamente las goroutines.

Comments are closed.