Maison >développement back-end >Golang >Comment écrire des tests unitaires avec élégance en utilisant go

Comment écrire des tests unitaires avec élégance en utilisant go

藏色散人
藏色散人avant
2020-09-07 09:16:501966parcourir
Ce qui suit est

Tutoriel Golang La colonne vous présentera comment utiliser GO pour écrire des tests unitaires élégants, j'espère que cela sera utile aux amis dans le besoin !

Comment écrire des tests unitaires avec élégance en utilisant go

Contexte

Je viens de rejoindre un jeune groupe et je n'ai pas encore eu le temps d'écrire les tests unitaires dans le code . Le leader souhaite que je réussisse le test unitaire pour me familiariser avec la logique métier du projet. Cependant, la quantité de code est vraiment trop importante et la réalisation efficace des tests unitaires devient l'objectif principal.

Principe de mise en œuvre

Le test unitaire utilise le cadre de test de testify, qui est très pratique à utiliser. Pour les méthodes d'utilisation de base spécifiques, veuillez vous référer au blog chinois de testify et au site officiel. documents.

Application dans le projet

Test unitaire d'initialisation

Dans un projet Web complexe, tester un certain module Les fonctions nécessitent souvent les services utilisés par ce module doivent être initialisés en premier. Nous mettons la fonction d'initialisation et les paramètres utilisés par la fonction d'initialisation sous le même package de tests unitaires. Par exemple, l'initialisation de MySQL est la suivante :

package unitTestfunc InitMySQL() error{
    return db.Init(constant.MySQLDSN,
    constant.MaxIdleConns,
    constant.MaxOpenConns, 
    time.Duration(constant.ConnMaxLifetime)*time.Second,
    constant.EnableSqlLog)//其他包中已经封装了初始化函数,在测试包的初始化函数中调用即可}func CloseDB() error{
    return db.Close()}

Nous. stocker les paramètres correspondants sous un autre package de contenu :

package constantconstant(
    MySQLDSN = "username:password@addresss/db?timeout=5000ms&readTimeout=5s&charset=utf8mb4"
    MaxIdleConns = 20
    MaxOpenConns = 20
    ConnMaxLifetime = 60
    EnableSqlLog = true
    MerchantID = 6666
    SheetID = "SZSWIMTEST"
    Operator = "XXXX@XXXX")

Effectuer des tests unitaires

Ce qui suit prend le fonctionnement de la base de données comme exemple

Les tests unitaires sont principalement se compose de trois parties :
La première partie est une méthode d'écriture fixe

type ActionLogRepo struct {
    basetest.BaseSuite}

La deuxième partie consiste à initialiser Register La fonction Register peut passer quatre paramètres fun1, fun2, fun3, fun4

fun1. : Le fichier de test est exécuté une fois au tout début.
fun2 : exécuté une fois avant chaque test unitaire.
fun3 : exécuté une fois après chaque test unitaire.
fun4 : L'exécution finale dans ce fichier de test.
Selon les exigences, nous devons effectuer une opération d'initialisation de la base de données avant le début de tous les tests unitaires et fermer la base de données à la fin.

func TestActionLogRepo(t *testing.T) {
    AgentSuite := new(ActionLogRepo)
    var err error
    AgentSuite.Register(
        func() {
            err = unitTest.InitMySQL()
        },
        nil,
        nil,
        func() {
            err = unitTest.CloseDB()
        })
    assert.Nil(t,err)
    suite.Run(t, AgentSuite)}

La troisième partie consiste à effectuer des tests unitaires. Nous créons d'abord les données correspondantes dans la base de données, puis appelons la fonction qui nécessite des tests unitaires pour opérer sur les données, puis utilisons assert pour vérifier le résultat. , N'oubliez pas de supprimer les enregistrements de tests unitaires.

func (suite *ActionLogRepo) TestActionLog() {
    repo := repository.NewRepository()//获取数据库
    actionLog := &model.ActionLogTab{XXXXXX}
    err := CreateActionLog(actionLog)//创建测试的数据记录
    assert.Nil(suite.T(),err)
    logs,count,err := FetchActionLogs(repo,repo.MerchantID,actionLog.SheetID,actionLog.SheetType,1,1)//需要测试的函数
    assert.Nil(suite.T(),err)
    assert.Equal(suite.T(),logs[0].OperationTime,actionLog.OperationTime)//验证函数的正确性

    err = repo.MerchantDB().Delete(actionLog).Error//删除掉测试的数据库记录
    assert.Nil(suite.T(),err)}

La structure finale du fichier de test est la suivante :

package testtype ActionLogRepo struct {
    basetest.BaseSuite}func TestActionLogRepo(t *testing.T) {
    AgentSuite := new(ActionLogRepo)
    var err error
    AgentSuite.Register(
        func() {
            err = unitTest.InitMySQL()
        },
        nil,
        nil,
        func() {
            err = unitTest.CloseDB()
        })
    assert.Nil(t,err)
    suite.Run(t, AgentSuite)}func (suite *ActionLogRepo) TestActionLog() {
    repo := repository.NewRepository()//获取数据库
    actionLog := &model.ActionLogTab{XXXXXX}
    err := CreateActionLog(actionLog)//创建测试的数据记录
    assert.Nil(suite.T(),err)
    logs,count,err := FetchActionLogs(repo,repo.MerchantID,actionLog.SheetID,actionLog.SheetType,1,1)//需要测试的函数
    assert.Nil(suite.T(),err)
    assert.Equal(suite.T(),logs[0].OperationTime,actionLog.OperationTime)//验证函数的正确性

    err = repo.MerchantDB().Delete(actionLog).Error//删除掉测试的数据库记录
    assert.Nil(suite.T(),err)}

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer