Heim  >  Artikel  >  Backend-Entwicklung  >  So verwalten Sie den Initialisierungscode für Testabhängigkeiten

So verwalten Sie den Initialisierungscode für Testabhängigkeiten

WBOY
WBOYnach vorne
2024-02-09 18:00:15628Durchsuche

So verwalten Sie den Initialisierungscode für Testabhängigkeiten

php-Editor Xinyi stellt Ihnen vor, wie Sie den Initialisierungscode von Testabhängigkeiten verwalten. Bei der Entwicklung von Software müssen Sie häufig verschiedene Testtools und Frameworks verwenden. Diese Tools und Frameworks erfordern möglicherweise Initialisierungscode zur Konfiguration und Vorbereitung. Die Art und Weise, wie Sie diesen Initialisierungscode verwalten, ist wichtig für die Wartbarkeit und Skalierbarkeit Ihrer Tests. Im Folgenden erfahren Sie ausführlich, wie Sie den Initialisierungscode von Testabhängigkeiten verwalten, um Softwaretests besser durchführen zu können.

Frageninhalt

Ich habe einen Protokollierungswrapper (implementiert mit Logrus unten) und verwende dieses Paket, um meine Anwendung zu protokollieren. Ich mache das, indem ich die Logger-Variable per Abhängigkeitsinjektion an jedes erforderliche Paket übergebe.

Hier muss ich beim Schreiben von Testfällen für jedes Paket etwas Code schreiben, um das Logger-Paket zu initialisieren. Wie können wir vermeiden, für jeden Testfall eines Pakets, das einen Logger verwendet, Initialisierungscode zu schreiben?

logger/log.go

type logger interface {
    info(args ...interface{})
    infof(format string, keyvals ...any)
    infowithfields(fields map[string]interface{}, msg ...interface{})

    debug(args ...interface{})
    debugf(format string, keyvals ...any)
    debugwithfields(fields map[string]interface{}, msg ...interface{})
}

app_test.go

func setupLogrusLogger() (*bytes.Buffer, Logger) {
    buf := &bytes.Buffer{}
    logrusLogger := log.New()
    logrusLogger.Out = buf
    logrusLogger.Formatter = &log.JSONFormatter{}
    return buf, NewLogrusLogger(logrusLogger)
}

func TestSomething(t *testing.T) {
  // buf can be used to inspect what gets logged if required
  buf, logger := setupLogrusLogger()
  Something(logger)
}

Hier muss ich für jedes Paket, das einen Logger verwendet, den Logger initialisieren, indem ich etwas wie setuplogruslogger definiere. Gibt es eine Möglichkeit zu vermeiden, dass ich dies für jedes Paket, für das ich Tests schreibe, separat schreibe? setuplogruslogger 的内容来初始化记录器。有什么方法可以避免为我正在为其编写测试的每个包单独编写此内容?

解决方法

导出依赖初始化函数并在非 _test.go

Problemumgehung

_test.goExportieren Sie die Abhängigkeitsinitialisierungsfunktion und deklarieren Sie sie in einer Nicht-

-Datei, damit andere Pakete sie importieren und wiederverwenden können. Wenn Sie die Testlogik vom normalen Code des Pakets trennen möchten, können Sie die Initialisierungsfunktion in das Paket verschieben, das die Testdienstprogramme bereitstellt.

Und solange Sie ein solches Testdienstprogrammpaket nur aus einer

-Datei (und nicht aus einer normalen Datei) importieren, gelangt der Testdienstprogrammcode nicht in die kompilierte Binärdatei des eigentlichen Programms. net/http/httptestBeispiele für solche Testdienstprogrammpakete finden Sie in der Standardbibliothek:

net/internal/socktestPaket httptest bietet Dienstprogramme für HTTP-Tests.

os/exec/internal/fdtestDas Socktest-Paket bietet Dienstprogramme zum Testen von Steckdosen. p>

testing/quickDas Paket fdtest bietet Testhilfen für die Arbeit mit Dateideskriptoren in allen Execs.

testing/fstestPackage Quick implementiert Hilfsfunktionen zur Unterstützung bei Black-Box-Tests.

testing/iotestDas Paket fstest implementiert die Unterstützung für Dateisystemtestimplementierungen und -benutzer.

🎜🎜 Das 🎜iotest-Paket implementiert Reader und Writer hauptsächlich zum Testen. 🎜

Das obige ist der detaillierte Inhalt vonSo verwalten Sie den Initialisierungscode für Testabhängigkeiten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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