2017-07-11 1 views
0

Ich habe einen gRPC-Dienst mit MySQL und muss Datensätze nach jedem Testfall löschen. Ich versuche, jeden Testfall mit einer Transaktion zu verbinden. Es funktioniert, wenn es keine Transaktion in meinem RPC-Code gibt, aber fehlschlägt, wenn es gibt. Und es wird seinen Fehler wie:Wie go-Code zu testen, der Datenbanken (MySQL) verwendet?

can't start transaction 
... 
sql: Transaction has already been committed or rolled back 

Dann versuche ich truncate zu verwenden, um die Aufzeichnungen zu löschen, aber einige der Testfälle nicht zufällig.

Mein Code ist wie (I gorm verwenden):

func foo(db *gorm.DB) { 
    tx := db.Begin() 
    // query and insert 
    tx.Commit() 
} 
// Use transaction to do database cleanup 
func TestFooVersion1() { 
    testDB := initDB() 
    tx = testDB.Begin() // setup 
    foo(testDB) 
    tx.Rollback() // teardown 
} 
// Use truncate to do database cleanup 
func TestFooVersion2() { 
    testDB := initDB() 
    foo(testDB) 
    truncateTables(testDB) // teardown 
} 
func truncateTables(db *gorm.DB) { 
    // exec "TRUNCATE TABLE table;" for every table 
} 

Was ein richtiger Weg ist, den Code mit DB (MySQL) zu testen? (Ich mag nicht wie Go-sqlmock)

Antwort

0

Es ist schwer zu sagen, ohne Code zu sehen, aber auf der Grundlage des Fehlers klingt es wie Sie eine Verbindung zwischen mehreren Tests teilen, und jeder versucht, eine zu starten Transaktion. Stellen Sie sicher, dass jeder Test seine eigene Verbindung öffnet, eine eigene Transaktion startet und nach Abschluss die Verbindung fest- oder zurücksetzt und die Verbindung schließt.

+0

Ich habe einen Beispielcode hinzugefügt. Das Problem ist, dass die Transaktion nicht funktioniert, wenn ich eine Transaktion im getesteten Code verwende (wie die "foo" -Funktion). –

0

Vielleicht können Sie Integrationstests mit Docker durchführen. Testen Sie direkt zu einem erstellten Container, der über eine aktive mysql verfügt.

Sie können die Testsuite von aussagen verwenden. Führen Sie bei jedem Test den Andock-Container aus und testen Sie ihn mit einem Live-MySQL.

+0

Ich habe eine MySQL zum Testen verwenden. Aber es funktioniert nicht. Übrigens habe ich einen Beispielcode hinzugefügt, um mein Problem zu erklären. –

+0

Ich sehe. Ihre Lösung besteht darin, für jeden Testfall einen neuen Andock-Container zu starten. Recht? –

+0

Ja ... Es wird direkt mit einer Live-Mysql testen –

Verwandte Themen