Maison > développement back-end > Golang > Comment puis-je obtenir l'effet du Monkey Patching dans Go pour les tests et l'analyse comparative ?

Comment puis-je obtenir l'effet du Monkey Patching dans Go pour les tests et l'analyse comparative ?

Linda Hamilton
Libérer: 2024-12-11 12:26:11
original
724 Les gens l'ont consulté

How Can I Achieve the Effect of Monkey Patching in Go for Testing and Benchmarking?

Monkey Patching dans Go

Dans le langage de programmation Go, la moquerie peut être difficile lorsqu'il s'agit de code qui n'est pas structuré autour d'interfaces. Lorsque les structures sont directement interconnectées et que l'injection de dépendances n'est pas présente, cela entrave la capacité de tester et de comparer efficacement sans modifier le code sous-jacent.

Une technique qui peut venir à l'esprit des langages de script comme Python est le patch singe, où les objets peuvent être modifiés au moment de l'exécution. Bien que Go ne dispose pas d'un mécanisme équivalent pour la modification directe d'objets, il existe des approches alternatives pour obtenir des résultats similaires.

Une stratégie courante consiste à créer votre propre interface en tant que wrapper autour des structures que vous souhaitez moquer. Cela vous permet d'implémenter le comportement souhaité dans les méthodes d'interface, tout en préservant la fonctionnalité d'origine dans la structure sous-jacente. Par exemple :

type MyInterface interface {
    DoSomething(i int) error
    DoSomethingElse() ([]int, error)
}

type Concrete struct {
    client *somepackage.Client
}

func (c *Concrete) DoSomething(i int) error {
    return c.client.DoSomething(i)
}

func (c *Concrete) DoSomethingElse() ([]int, error) {
    return c.client.DoSomethingElse()
}
Copier après la connexion

En implémentant MyInterface, vous pouvez désormais créer des implémentations simulées pour vos tests :

// MockMyInterface implements MyInterface for testing purposes
type MockMyInterface struct {
    mockedDoSomethingError error
    mockedDoSomethingElseResult []int
}

func (m *MockMyInterface) DoSomething(i int) error {
    return m.mockedDoSomethingError
}

func (m *MockMyInterface) DoSomethingElse() ([]int, error) {
    return m.mockedDoSomethingElseResult, nil
}
Copier après la connexion

Une autre approche, suggérée par @elithrar dans les commentaires, consiste à intégrer le tapez que vous souhaitez vous moquer dans votre propre structure. Cela vous permet de vous moquer sélectivement uniquement des méthodes qui le nécessitent :

type Concrete struct {
    *somepackage.Client
}
Copier après la connexion

En intégrant le client, vous pouvez appeler directement des méthodes comme DoSomethingNotNeedingMocking sans les ajouter à l'interface ni créer de simulations pour elles.

Ces techniques offrent des alternatives viables aux correctifs singe pour tester et évaluer le code qui n'est pas structuré autour d'interfaces.

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:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal