Heim >Backend-Entwicklung >Golang >Wie man Unit-Tests elegant mit go schreibt

Wie man Unit-Tests elegant mit go schreibt

藏色散人
藏色散人nach vorne
2020-09-07 09:16:501966Durchsuche

Hintergrund

Wie man Unit-Tests elegant mit go schreibt Ich bin gerade einem jungen Team beigetreten und hatte noch keine Zeit, Unit-Tests im Code zu schreiben. Der Leiter hofft, dass ich mich durch Unit mit der Geschäftslogik des Projekts vertraut machen kann Tests. Allerdings ist die Menge an Code wirklich zu groß und die effiziente Durchführung von Unit-Tests wird zum Hauptziel.

Implementierungsprinzip

Der Unit-Test verwendet das Test-Framework von testify, das sehr benutzerfreundlich ist. Informationen zu spezifischen grundlegenden Verwendungsmethoden finden Sie im chinesischen Testify-Blog und in offiziellen Dokumenten.

Anwendungen im Projekt

InitialisierungseinheitentestIn einem komplexen Webprojekt erfordert das Testen der Funktion eines bestimmten Moduls häufig die Initialisierung der von diesem Modul verwendeten Dienste Die Initialisierungsfunktion wird unter demselben Unit-Test-Paket platziert. Die Initialisierung von MySQL erfolgt beispielsweise wie folgt:

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()}

Wir speichern die entsprechenden Parameter unter einem anderen Inhaltspaket:
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")

für Unit-Tests

Das Folgende dauert Betrieb der Datenbank als Beispiel

Der Unit-Test besteht hauptsächlich aus drei Teilen:

Der erste Teil ist die feste Schreibmethode
type ActionLogRepo struct {
    basetest.BaseSuite}
Der zweite Teil ist die Initialisierung des Registers. Die Register-Funktion kann vier Parameter fun1, fun2, übergeben. fun3, fun4

fun1: Einmal am Anfang der Testdatei ausführen.

fun2: Vor jedem Unit-Test einmal ausführen.
fun3: Nach jedem Unit-Test einmal ausführen.
fun4: Die endgültige Ausführung in dieser Testdatei.

Je nach Anforderungen müssen wir vor Beginn aller Komponententests einen Datenbankinitialisierungsvorgang durchführen und die Datenbank am Ende schließen.

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

Der dritte Teil besteht darin, zuerst die entsprechenden Daten in der Datenbank zu erstellen, dann die Funktion aufzurufen, die einen Unit-Test erfordert, um die Daten zu bearbeiten, und dann das Ergebnis mit „assertieren“ zu überprüfen Testaufzeichnungen.
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)}

Die endgültige Struktur der Testdatei ist wie folgt:
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)}

Das obige ist der detaillierte Inhalt vonWie man Unit-Tests elegant mit go schreibt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen