Wie man Unit-Tests elegant mit go schreibt

藏色散人
Freigeben: 2020-09-07 09:16:50
nach vorne
1920 Leute haben es durchsucht

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()}
Nach dem Login kopieren

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")
Nach dem Login kopieren

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}
Nach dem Login kopieren
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)}
Nach dem Login kopieren

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)}
Nach dem Login kopieren

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)}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:learnku.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!