"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo puede la reflexión agilizar las pruebas unitarias para funciones con firmas similares en GO?

¿Cómo puede la reflexión agilizar las pruebas unitarias para funciones con firmas similares en GO?

Publicado el 2025-03-22
Navegar:510

How Can Reflection Streamline Unit Testing for Functions with Similar Signatures in Go?

probando una colección de funciones con reflexión en go

problema

unidad probando un conjunto de funciones con firmas similares y valores de retorno puede convertirse en repetitivos y cumbersome. Los enfoques tradicionales implican escribir pruebas individuales para cada función, lo que puede conducir a la duplicación de código. La reflexión ofrece una solución para agilizar este proceso.

usando reflexión

para aprovechar la reflexión en sus pruebas:

  1. el valor del receptor: Usar valor para obtener un valor que representa el receptor de los fondos probado.
  2. LISCURAR FUNCIÓN por nombre: use value.methodByName para encontrar la función correspondiente a un nombre de función específico dentro del valor del receptor.
  3. Invoke la función: hacer las llamadas de la función usando value.call al pasar una porción vacía de valor para los parámetros (no se invoquen los parámetros (no sean los parámetros (no sean los parámetros. esperado).
  4. Recupere los valores de retorno: Capture los valores de retorno de la función como objetos de valor del método de llamada.
  5. verifique los valores de retorno: Utilice valor.isnil para determinar si el valor de error devuelto es NIL. Además, use verificaciones de valor básico para evaluar el valor de retorno del objeto.

Code de ejemplo

var funcNames = []string{"Func1", "Func2", "Func3"}

func TestFunc(t *testing.T) {
    stype := reflect.ValueOf(s)
    for _, fname := range funcNames {

        fmt.Println(fname)

        sfunc := stype.MethodByName(fname)
        ret := sfunc.Call([]reflect.Value{})

        val := ret[0].Int()

        if val  

nota: Si se especifica un nombre de función no válido, la prueba entrará en pánico. Para mitigar esto:

for _, fname := range funcNames {

    defer func() {
        if x := recover(); x != nil {
            t.Error("TestFunc paniced for", fname, ": ", x)
        }
    }()
    fmt.Println(fname)
}
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3