Table des matières
Conseils de refactorisation pour les tests unitaires fonctionnels Go
1. Extraire la fonction d'assertion
2. 使用表驱动的测试
3. 编写 mocking 接口
4. 运行细粒度的测试
Maison développement back-end Golang Conseils de refactorisation pour les tests unitaires de la fonction Go

Conseils de refactorisation pour les tests unitaires de la fonction Go

May 04, 2024 pm 01:04 PM
git go 单元测试

Pour améliorer la maintenabilité et la lisibilité des tests unitaires des fonctions Go, nous pouvons : Extraire des fonctions d'assertion pour simplifier le code. Utilisez des tests basés sur des tables pour organiser les données de test. Écrivez des interfaces moqueuses pour tester l'interaction entre les fonctions et les composants. Exécutez des tests précis pour isoler et déboguer les problèmes. Appliquer des outils de couverture pour garantir l’exhaustivité des tests et guider les améliorations.

Go 函数单元测试的重构技巧

Conseils de refactorisation pour les tests unitaires fonctionnels Go

Lorsque nous avons un projet Go vaste et complexe, la maintenance et la lisibilité des tests unitaires fonctionnels peuvent devenir un grand défi. Pour relever ce défi, nous pouvons mettre en œuvre certaines techniques de refactoring pour améliorer la maintenabilité et la lisibilité de nos tests.

1. Extraire la fonction d'assertion

Si le code de test contient de nombreuses assertions identiques, vous pouvez extraire la fonction d'assertion pour simplifier le code. Par exemple, nous pouvons définir une fonction AssertEqual pour vérifier si deux valeurs sont égales : AssertEqual 函数来检查两个值是否相等:

import "testing"

func AssertEqual(t *testing.T, expected, actual interface{}) {
    if expected != actual {
        t.Errorf("Expected %v, got %v", expected, actual)
    }
}
Copier après la connexion

2. 使用表驱动的测试

表驱动的测试可以帮助组织和简化测试数据。它允许我们使用一个表来提供不同的输入和期望输出,然后对每个输入执行测试。例如,我们可以编写一个表驱动的测试来检查 Max 函数:

import (
    "testing"

    "github.com/stretchr/testify/assert"
)

func TestMax(t *testing.T) {
    tests := []struct {
        name    string
        input   []int
        expected int
    }{
        {"Empty slice", []int{}, 0},
        {"Single element", []int{1}, 1},
        {"Multiple elements", []int{1, 2, 3}, 3},
    }

    for _, tt := range tests {
        actual := Max(tt.input)
        assert.Equal(t, tt.expected, actual)
    }
}
Copier après la connexion

3. 编写 mocking 接口

mocking 接口允许我们测试函数在与其他组件交互时的行为。我们可以使用一个 mocking 框架(如 mockery)来生成 mock 对象,该对象实现了我们关心的接口,但我们可以控制其行为。例如,我们可以编写一个 mockDatabase 来测试一个使用数据库的函数:

package main

import (
    "database/sql"
    "fmt"
    "time"

    "github.com/stretchr/testify/mock"
)

// MockDatabase is a mock database for testing purposes.
type MockDatabase struct {
    mock.Mock
}

// Query implements the Query method of a mock database.
func (m *MockDatabase) Query(query string, args ...interface{}) (*sql.Rows, error) {
    ret := m.Called(query, args)
    return ret.Get(0).(*sql.Rows), ret.Error(1)
}

// GetUserByUsernameAndPassword implements the GetUserByUsernameAndPassword method of a mock database.
func (m *MockDatabase) GetUserByUsernameAndPassword(username, password string) (*User, error) {
    ret := m.Called(username, password)
    return ret.Get(0).(*User), ret.Error(1)
}

// User represents a user in the database.
type User struct {
    Username string
    Password string
    LastLogin time.Time
}

// main is the entry point for the program.
func main() {
    mockDB := &MockDatabase{}
    mockDB.On("GetUserByUsernameAndPassword", "john", "password").Return(&User{
        Username: "john",
        Password: "password",
        LastLogin: time.Now(),
    }, nil)

    user, err := GetUser(mockDB, "john", "password")
    if err != nil {
        fmt.Println("Error getting user:", err)
    } else {
        fmt.Println("Welcome back, ", user.Username)
    }
}
Copier après la connexion

4. 运行细粒度的测试

细粒度的测试专注于测试函数的小部分功能。通过运行细粒度的测试,我们可以更轻松地隔离和调试问题。例如,我们可以编写一个测试来检查 Max

import "testing"

func TestMaxElement(t *testing.T) {
    tests := []struct {
        name    string
        input   []int
        expected int
    }{
        {"Empty slice", []int{}, 0},
        {"Single element", []int{1}, 1},
        {"Multiple elements", []int{1, 2, 3}, 3},
    }

    for _, tt := range tests {
        actual := MaxElement(tt.input)
        assert.Equal(t, tt.expected, actual)
    }
}
Copier après la connexion
2. Utiliser les tests pilotés par table

Les tests pilotés par table peuvent aider à organiser et à simplifier les données de test. Cela nous permet d'utiliser un tableau pour fournir différentes entrées et sorties souhaitées, puis d'effectuer des tests sur chaque entrée. Par exemple, nous pouvons écrire un test piloté par table pour vérifier la fonction Max :

rrreee

3 Écrire une interface moqueuse

L'interface moqueuse nous permet de tester le comportement d'une fonction lors de l'interaction avec. d'autres composants. Nous pouvons utiliser un framework moqueur (tel que mockery) pour générer des objets simulés qui implémentent l'interface qui nous intéresse, mais dont nous pouvons contrôler le comportement. Par exemple, nous pouvons écrire une mockDatabase pour tester une fonction qui utilise une base de données :

rrreee

4 Exécutez des tests fins 🎜🎜Les tests fins se concentrent sur le test d'une petite partie des fonctionnalités de. la fonction. En exécutant des tests précis, nous pouvons plus facilement isoler et déboguer les problèmes. Par exemple, nous pouvons écrire un test pour vérifier si la fonction Max renvoie l'élément maximum : 🎜rrreee🎜 5. Utiliser les outils de couverture 🎜🎜Les outils de couverture peuvent nous aider à identifier quelles lignes de code sont couvertes par les tests . Cela nous aide à garantir que notre suite de tests est complète et peut nous guider dans la rédaction de tests supplémentaires pour couvrir le code manquant. 🎜🎜Conclusion🎜🎜En adoptant ces techniques de refactoring, nous pouvons améliorer la maintenabilité et la lisibilité des tests unitaires fonctionnels dans les projets Go. En extrayant des fonctions d'assertion, en utilisant des tests basés sur des tables, en écrivant des interfaces moqueuses, en exécutant des tests fins et en utilisant des outils de couverture, nous pouvons écrire un code de test plus fiable et plus maintenable. 🎜

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Que faire si le téléchargement git n'est pas actif Que faire si le téléchargement git n'est pas actif Apr 17, 2025 pm 04:54 PM

Résolve: lorsque la vitesse de téléchargement GIT est lente, vous pouvez prendre les étapes suivantes: Vérifiez la connexion réseau et essayez de changer la méthode de connexion. Optimiser la configuration GIT: augmenter la taille du tampon post (Git Config - Global Http.PostBuffer 524288000) et réduire la limite à basse vitesse (Git Config - Global Http.LowspeedLimit 1000). Utilisez un proxy GIT (comme Git-Proxy ou Git-LFS-Proxy). Essayez d'utiliser un client GIT différent (comme SourceTree ou GitHub Desktop). Vérifiez la protection contre les incendies

Comment télécharger des projets GIT vers local Comment télécharger des projets GIT vers local Apr 17, 2025 pm 04:36 PM

Pour télécharger des projets localement via GIT, suivez ces étapes: installer Git. Accédez au répertoire du projet. Clonage du référentiel distant à l'aide de la commande suivante: Git Clone https://github.com/username/repository-name.git

Comment mettre à jour le code dans GIT Comment mettre à jour le code dans GIT Apr 17, 2025 pm 04:45 PM

Étapes pour mettre à jour le code GIT: Consultez le code: Git Clone https://github.com/username/repo.git Obtenez les derniers modifications: Git Fetch Merge Modifications: Git Merge Origin / Master Push Changes (Facultatif): Git Push Origin Master

Comment supprimer un référentiel par git Comment supprimer un référentiel par git Apr 17, 2025 pm 04:03 PM

Pour supprimer un référentiel GIT, suivez ces étapes: Confirmez le référentiel que vous souhaitez supprimer. Suppression locale du référentiel: utilisez la commande RM -RF pour supprimer son dossier. Supprimer à distance un entrepôt: accédez à l'entrepôt, trouvez l'option "Supprimer l'entrepôt" et confirmez l'opération.

Comment utiliser Git Commit Comment utiliser Git Commit Apr 17, 2025 pm 03:57 PM

Git Commit est une commande qui enregistre le fichier qui passe à un référentiel GIT pour enregistrer un instantané de l'état actuel du projet. Comment l'utiliser est comme suit: Ajoutez des modifications à la zone de stockage temporaire Écrivez un message de soumission concis et informatif pour enregistrer et quitter le message de soumission pour compléter la soumission éventuellement: Ajoutez une signature pour le journal GIT Utilisez le contenu de soumission pour afficher le contenu de soumission

Comment résoudre le problème de recherche efficace dans les projets PHP? Typesense vous aide à y parvenir! Comment résoudre le problème de recherche efficace dans les projets PHP? Typesense vous aide à y parvenir! Apr 17, 2025 pm 08:15 PM

Lors du développement d'un site Web de commerce électronique, j'ai rencontré un problème difficile: comment atteindre des fonctions de recherche efficaces en grande quantité de données de produit? Les recherches traditionnelles de base de données sont inefficaces et ont une mauvaise expérience utilisateur. Après quelques recherches, j'ai découvert le moteur de recherche TypeSense et résolu ce problème grâce à son client PHP officiel TypeSense / TypeSen-PHP, ce qui a considérablement amélioré les performances de recherche.

Comment soumettre des dossiers vides dans git Comment soumettre des dossiers vides dans git Apr 17, 2025 pm 04:09 PM

Pour soumettre un dossier vide dans GIT, suivez simplement les étapes suivantes: 1. Créez un dossier vide; 2. Ajouter le dossier à la zone de stadification; 3. Soumettre les modifications et saisir un message de validation; 4. (Facultatif) Poussez les modifications au référentiel distant. Remarque: le nom d'un dossier vide ne peut pas commencer. Si le dossier existe déjà, vous devez utiliser Git Add --Force pour ajouter.

Comment fusionner le code dans git Comment fusionner le code dans git Apr 17, 2025 pm 04:39 PM

Processus de fusion du code GIT: tirez les dernières modifications pour éviter les conflits. Passez à la branche que vous souhaitez fusionner. Lancer une fusion, spécifiant la branche pour fusionner. Résoudre les conflits de fusion (le cas échéant). Stadification et engager la fusion, fournir un message de validation.

See all articles