Maison développement back-end Golang Comment utiliser le langage Go pour les tests de résistance du code et les tests de charge

Comment utiliser le langage Go pour les tests de résistance du code et les tests de charge

Aug 02, 2023 pm 12:09 PM
并发编程 性能测试 负载测试 压测:压力测试 go语言:golang

Comment utiliser le langage Go pour les tests de contrainte de code et la pratique des tests de charge

Introduction :
Dans le processus de développement logiciel, les tests de performances du code sont un lien très important. Cela peut nous aider à comprendre comment le code fonctionne dans différentes conditions de charge et à identifier les problèmes de performances potentiels. En tant que langage de programmation haute performance, le langage Go fournit une multitude d'outils et de bibliothèques qui peuvent nous aider à effectuer des tests de contrainte de code et des tests de charge. Cet article présentera la pratique de l'utilisation du langage Go pour les tests de contrainte de code et les tests de charge, et fournira des exemples de code correspondants.

1. Tests de stress du code
Les tests de stress du code font référence aux tests de performances du code en simulant un grand nombre de requêtes simultanées pour évaluer les performances du code dans des scénarios à forte concurrence. Le langage Go fournit un package net/http/httptest intégré, qui rend l'écriture de scripts de tests de contrainte de code très simple. Ci-dessous, nous prenons un simple service HTTP comme exemple pour présenter comment utiliser le langage Go pour les tests de résistance du code. net/http/httptest包,使得编写代码压测脚本变得非常简单。下面我们以一个简单的HTTP服务为例,介绍如何使用Go语言进行代码压测。

  1. 创建一个HTTP服务
    首先,我们需要创建一个简单的HTTP服务,用于进行性能测试。以下是一个简单的HTTP服务的示例代码:
package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello, World!")
    })

    http.ListenAndServe(":8080", nil)
}
Copier après la connexion
  1. 编写压测脚本
    然后,我们编写一个Go脚本,用于模拟大量并发请求,对上述HTTP服务进行性能测试。以下是一个简单的压测脚本示例:
package main

import (
    "fmt"
    "net/http"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup

    start := time.Now()

    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()

            res, err := http.Get("http://localhost:8080")
            if err != nil {
                fmt.Println("Error:", err)
                return
            }
            defer res.Body.Close()
        }()
    }

    wg.Wait()

    elapsed := time.Since(start)
    fmt.Println("Elapsed time:", elapsed)
}
Copier après la connexion

在上述脚本中,我们使用sync.WaitGroup来等待所有并发请求执行完成。压测脚本会发送1000个并发请求到http://localhost:8080,并统计总耗时。值得注意的是,这只是一个简单的示例,实际的压测脚本可能会更加复杂,需根据具体需求进行调整。

  1. 运行代码压测
    最后,我们可以使用go run命令来运行上述压测脚本:
$ go run main.go
Copier après la connexion
Copier après la connexion

运行后,你将看到输出的总耗时。

二、负载测试
负载测试是指模拟实际用户行为,对整个系统进行性能测试,以评估系统在高负载下的性能表现。Go语言提供了一些很好的库,用于编写负载测试脚本。以下是一个基于go-vegeta/vegeta库的负载测试脚本示例。

  1. 安装vegeta库
    首先,我们需要安装vegeta库。可以通过以下命令来安装:
$ go get github.com/tsenart/vegeta
Copier après la connexion
  1. 编写负载测试脚本
    然后,我们编写一个Go脚本,使用vegeta库来进行负载测试。以下是一个简单的负载测试脚本示例:
package main

import (
    "fmt"
    "io"
    "log"
    "os"
    "os/signal"
    "syscall"
    "time"

    vegeta "github.com/tsenart/vegeta/lib"
)

func main() {
    rate := vegeta.Rate{Freq: 100, Per: time.Second}
    duration := 10 * time.Second
    targeter := vegeta.NewStaticTargeter(vegeta.Target{
        Method: "GET",
        URL:    "http://localhost:8080",
    })

    attacker := vegeta.NewAttacker()
    var metrics vegeta.Metrics
    sigs := make(chan os.Signal, 1)

    go func() {
        for range sigs {
            attacker.Stop()
        }
    }()
    signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

    for res := range attacker.Attack(targeter, rate, duration, "Big Bang!") {
        metrics.Add(res)
    }

    metrics.Close()

    fmt.Printf("99th percentile: %s
", metrics.Latencies.P99)
    fmt.Printf("Mean: %s
", metrics.Latencies.Mean)
    fmt.Printf("Requests/sec: %.2f
", metrics.Rate)
    fmt.Printf("Errors: %d
", metrics.Errors)
}
Copier après la connexion

在上述脚本中,我们定义了每秒钟发送100个请求,持续10秒的负载测试。负载测试会发送GET请求到http://localhost:8080,并收集各种统计数据,如99th percentile、平均延迟、请求/秒等等。

  1. 运行负载测试
    最后,我们可以使用go run
    1. Créer un service HTTP
    2. Tout d'abord, nous devons créer un service HTTP simple pour les tests de performances. Voici un exemple de code pour un service HTTP simple :

    $ go run main.go
    Copier après la connexion
    Copier après la connexion
    1. Écrivez un script de test de stress Ensuite, nous écrivons un script Go pour simuler un grand nombre de requêtes simultanées et effectuer le ci-dessus Test de performances du service HTTP. Voici un exemple simple de script de test de stress :


      rrreee

      Dans le script ci-dessus, nous utilisons sync.WaitGroup pour attendre que toutes les requêtes simultanées se terminent. Le script de test de stress enverra 1 000 requêtes simultanées à http://localhost:8080 et calculera la consommation totale de temps. Il convient de noter qu’il ne s’agit que d’un exemple simple. Le script de test de résistance réel peut être plus complexe et doit être ajusté en fonction des besoins spécifiques. 🎜
      1. Exécutez le test de stress du code🎜Enfin, nous pouvons utiliser la commande go run pour exécuter le script de test de stress ci-dessus : 🎜🎜rrreee🎜Après l'exécution, vous verra le temps total passé sur la sortie. 🎜🎜2. Test de charge🎜Le test de charge fait référence à la simulation du comportement réel de l'utilisateur et au test des performances de l'ensemble du système pour évaluer les performances du système sous une charge élevée. Le langage Go fournit d'excellentes bibliothèques pour écrire des scripts de tests de charge. Ce qui suit est un exemple de script de test de charge basé sur la bibliothèque go-vegeta/vegeta. 🎜
        1. Installer la bibliothèque Vegeta 🎜Tout d'abord, nous devons installer la bibliothèque Vegeta. Il peut être installé via la commande suivante : 🎜🎜rrreee
          1. Écrire un script de test de charge🎜 Ensuite, nous écrivons un script Go et utilisons la bibliothèque Vegeta pour effectuer des tests de charge. Voici un exemple de script de test de charge simple : 🎜🎜rrreee🎜 Dans le script ci-dessus, nous définissons un test de charge qui envoie 100 requêtes chaque seconde pendant 10 secondes. Le test de charge enverra une requête GET à http://localhost:8080 et collectera diverses statistiques, telles que le 99e centile, la latence moyenne, les requêtes/seconde, etc. 🎜
            1. Exécutez le test de charge🎜Enfin, nous pouvons utiliser la commande go run pour exécuter le script de test de charge ci-dessus : 🎜🎜rrreee🎜Après l'exécution, vous voir la sortie de diverses données statistiques. 🎜🎜Conclusion : 🎜Cet article présente la pratique de l'utilisation du langage Go pour les tests de contrainte de code et les tests de charge, et fournit des exemples de code correspondants. Les tests de contrainte du code et les tests de charge sont des aspects très importants du développement logiciel, qui peuvent nous aider à évaluer les performances du code dans des conditions de concurrence élevée et de charge élevée. J'espère que cet article pourra vous aider à mieux comprendre et appliquer le langage Go pour les tests de performances. 🎜

    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)

Conception sécurisée de structures de données en programmation simultanée C++ ? Conception sécurisée de structures de données en programmation simultanée C++ ? Jun 05, 2024 am 11:00 AM

Dans la programmation simultanée C++, la conception sécurisée des structures de données est cruciale : Section critique : utilisez un verrou mutex pour créer un bloc de code qui permet à un seul thread de s'exécuter en même temps. Verrouillage en lecture-écriture : permet à plusieurs threads de lire en même temps, mais à un seul thread d'écrire en même temps. Structures de données sans verrouillage : utilisez des opérations atomiques pour assurer la sécurité de la concurrence sans verrous. Cas pratique : File d'attente thread-safe : utilisez les sections critiques pour protéger les opérations de file d'attente et assurer la sécurité des threads.

La différence entre les tests de performances et les tests unitaires en langage Go La différence entre les tests de performances et les tests unitaires en langage Go May 08, 2024 pm 03:09 PM

Les tests de performances évaluent les performances d'une application sous différentes charges, tandis que les tests unitaires vérifient l'exactitude d'une seule unité de code. Les tests de performances se concentrent sur la mesure du temps de réponse et du débit, tandis que les tests unitaires se concentrent sur la sortie des fonctions et la couverture du code. Les tests de performances simulent des environnements réels avec une charge et une concurrence élevées, tandis que les tests unitaires s'exécutent dans des conditions de faible charge et en série. L'objectif des tests de performances est d'identifier les goulots d'étranglement des performances et d'optimiser l'application, tandis que l'objectif des tests unitaires est de garantir l'exactitude et la robustesse du code.

Programmation simultanée C++ : comment effectuer la planification des tâches et la gestion du pool de threads ? Programmation simultanée C++ : comment effectuer la planification des tâches et la gestion du pool de threads ? May 06, 2024 am 10:15 AM

La planification des tâches et la gestion du pool de threads sont les clés pour améliorer l’efficacité et l’évolutivité de la programmation simultanée C++. Planification des tâches : utilisez std::thread pour créer de nouveaux threads. Utilisez la méthode join() pour rejoindre le fil de discussion. Gestion du pool de threads : créez un objet ThreadPool et spécifiez le nombre de threads. Utilisez la méthode add_task() pour ajouter des tâches. Appelez la méthode join() ou stop() pour fermer le pool de threads.

Programmation simultanée C++ : comment éviter la famine des threads et l'inversion des priorités ? Programmation simultanée C++ : comment éviter la famine des threads et l'inversion des priorités ? May 06, 2024 pm 05:27 PM

Pour éviter la pénurie de threads, vous pouvez utiliser des verrous équitables pour garantir une allocation équitable des ressources ou définir des priorités de thread. Pour résoudre l'inversion de priorité, vous pouvez utiliser l'héritage de priorité, qui augmente temporairement la priorité du thread contenant la ressource ; ou utiliser la promotion de verrouillage, qui augmente la priorité du thread qui nécessite la ressource.

Explication détaillée des primitives de synchronisation dans la programmation simultanée C++ Explication détaillée des primitives de synchronisation dans la programmation simultanée C++ May 31, 2024 pm 10:01 PM

Dans la programmation multithread C++, le rôle des primitives de synchronisation est de garantir l'exactitude de l'accès de plusieurs threads aux ressources partagées. Elle comprend : Mutex (Mutex) : protège les ressources partagées et empêche l'accès simultané. Variable de condition (ConditionVariable) : thread Attendre une réponse spécifique ; conditions à remplir avant de poursuivre l’exécution de l’opération atomique : s’assurer que l’opération s’exécute de manière ininterrompue.

Programmation simultanée C++ : comment gérer la communication inter-thread ? Programmation simultanée C++ : comment gérer la communication inter-thread ? May 04, 2024 pm 12:45 PM

Les méthodes de communication inter-thread en C++ incluent : la mémoire partagée, les mécanismes de synchronisation (verrous mutex, variables de condition), les canaux et les files d'attente de messages. Par exemple, utilisez un verrou mutex pour protéger un compteur partagé : déclarez un verrou mutex (m) et une variable partagée (counter) ; chaque thread met à jour le compteur en verrouillant (lock_guard) ; pour éviter les conditions de course.

Programmation simultanée C++ : comment terminer et annuler un thread ? Programmation simultanée C++ : comment terminer et annuler un thread ? May 06, 2024 pm 02:12 PM

Les mécanismes de terminaison et d'annulation de thread en C++ incluent : Terminaison de thread : std::thread::join() bloque le thread actuel jusqu'à ce que le thread cible termine son exécution ; std::thread::detach() détache le thread cible de la gestion des threads. Annulation de thread : std::thread::request_termination() demande au thread cible de terminer l'exécution ; std::thread::get_id() obtient l'ID du thread cible et peut être utilisé avec std::terminate() pour terminer immédiatement la cible. fil de discussion. En combat réel, request_termination() permet au thread de décider du moment de la fin, et join() garantit que sur la ligne principale

Quels sont les frameworks et bibliothèques de programmation concurrente en C++ ? Quels sont leurs avantages et limites respectifs ? Quels sont les frameworks et bibliothèques de programmation concurrente en C++ ? Quels sont leurs avantages et limites respectifs ? May 07, 2024 pm 02:06 PM

Le cadre de programmation simultanée C++ propose les options suivantes : threads légers (std::thread) ; conteneurs et algorithmes de concurrence Boost sécurisés pour les threads ; OpenMP pour les multiprocesseurs à mémoire partagée ; bibliothèque d'opérations d'interaction simultanée C++ multiplateforme ; (cpp-Concur).

See all articles