2011-01-06 13 views
1

Ok, sie sind keine Unit-Tests, sondern End-to-End-Tests. Das Setup ist etwas involviert. Komponententests verwenden C#, ODBC-Verbindung. Jeder Komponententest versucht, sich selbst zu bereinigen, aber alle 20 Tests oder so (einmal pro C# -Klasse) müssten wir eine vollständige Datenbankwiederherstellung durchführen. Ich glaube nicht, dass ich es über eine ODBC-Verbindung tun, nach diesem Dokument:Huhn und Ei Problem (Datenbank wiederherstellen), wenn Sie versuchen, Unit-Test gegen SQl Server 2008 zu schreiben

http://www.sql-server-performance.com/articles/dba/Obtain_Exclusive_Access_to_Restore_SQL_Server_p1.aspx

Msg 6104, Ebene 16, Status 1, Zeile 1 nicht töten kann, um Ihren eigenen Prozess zu töten .

Allerdings würde ich gerne, so dass 199 Tests nicht wegen einer schlechten Säuberung Amok gehen. Gibt es eine andere Art und Weise? Vielleicht kann ich eine andere "Verbindung" wie COM-Automatisierung oder etwas dieser Art öffnen und dann alle Datenbankverbindungen von dort beenden? Wenn ja, wie kann ich das tun?

Können sich die Clients nach einer Wiederherstellung automatisch neu verbinden, oder müsste ich alle 20 Tests einmal abbauen?

Wenn Sie diese Frage verwirrend finden, lassen Sie mich bitte wissen, was Ihre Fragen sind. Vielen Dank!

+1

Nur ein Hinweis zur Terminologie - wenn Ihre Komponententests nicht nur eine einzelne Einheit testen, handelt es sich nicht um Komponententests. In diesem Fall würden Sie, weil Sie Einheiten und ihre Abhängigkeit von anderen Einheiten (Code/Klassen, die auf eine Datenbank angewiesen sind) gleichzeitig testen, dies als "Integrationstest" bezeichnen. –

Antwort

1

Wenn Sie sicherstellen können, dass Sie Ihre ODBC-Verbindungen ordnungsgemäß schließen können, können Sie ADO.NET für die Zwecke der C# Integrationstests direkt für die Wiederherstellung einer neuen Verbindung aus dem Pool verwenden.

Ich denke, wenn Sie Sie von Snapshots anstelle von vollständigen Backups wiederherstellen, könnten Sie viel schneller finden.

+0

Ich bin ein Neuling in diesem und mehr Details wäre sehr hilfreich. –

1

Natürlich können Sie von einer ODBC-Verbindung wiederherstellen. Sie können nicht wiederherstellen, wenn Sie Gebrauch-ing der databse sind Sie wiederherstellen möchten, ist aber trivial Kontext tempdb oder master zu ändern:

USE [tempdb]; 
RESTORE DATABASE foo FROM ...; 

Wenn es andere Verbindungen, die die Datenbank verwenden, würden sie Ihre sein eigene Verbindungen, so ist es nur eine Frage der Gewährleistung, dass Sie sie richtig schließen. Wenn Sie Verbindungspooling verwenden, bereinigen Sie den Pool. SqlClient verwendet SqlConnectionClearAllPools, verwendet ODBC OdbcConnection.ReleaseObjectPool zu einem irgendwie ähnlichen Effekt. Punkt ist, dass alles unter Ihrer Kontrolle ist.

BTW, einen Grund, warum Sie ODBC und nicht SqlClient verwenden?

+0

Ich bin einem großen Projekt beigetreten, aber ich denke, wir unterstützen Oracle und Sybase Verbindungen. Danke für die Information! Ich möchte vielleicht einige der bestehenden Verbindungen in einer nicht-anmutigen Art und Weise zerstören, da die große App aus mehreren verschiedenen Prozessen besteht und lange Zeit ohne jegliche Tests gemacht wurde. –