Wie schreibt die Ausgabe in das [ClassInitialize()] ein Unit-Test-Klasse?
Schreibe ich einige unit-tests für die Persistenz-Schicht von meinem C#.NET -Anwendung. Vor und nach den tests eine test-Klasse ausführen, ich will ein paar Reinigung zu löschen, die evtl. eingefügten dummy-Werte, daher ist diese Reinigung geschieht in den Methoden gekennzeichnet, die mit den Attributen [ClassInitialize()]
und [ClassCleanup()]
.
(Ich weiß, dass ein besserer Weg wäre, um eine in-memory-Datenbank, aber es ist nicht wirklich machbar, so weit wie wir es hängen viele gespeicherte Prozeduren....)
Möchte ich Ausgabe einige Informationen über die Ergebnisse der Reinigung, aber ich kann nicht einen Weg finden, um die Ausgabe in der test-Ergebnisse mit VISUAL Studio 2010.
Dies ist, was ich Tue so weit :
///... lots of stuff before ...
//global for the test run
private static TestContext context;
//for each test
private IRepository repo;
#region Initialisation and cleanup
///<summary>
///Execute once before the test-suite
///</summary>
[ClassInitialize()]
public static void InitTestSuite(TestContext testContext)
{
context = testContext;
removeTestDataFromDb();
}
[ClassCleanup()]
public static void CleanupTestSuite()
{
removeTestDataFromDb();
}
private static void removeTestDataFromDb()
{
context.WriteLine("removeTestDataFromDb starting");
using (ISession session = NHibernateHelper.OpenSession())
{
IDbConnection cn = session.Connection;
IDbCommand cmd = cn.CreateCommand();
//remove anyt test data
cmd.CommandText = @"DELETE FROM SomeTable
WHERE somefield LIKE 'easyToFindTestData%Test'";
int res = cmd.ExecuteNonQuery();
context.WriteLine("removeTestDataFromDb done - affected {0} rows", res);
}
}
[TestInitialize()]
public void InitTest()
{
repo = new MyRepositoryImplementation();
}
[TestCleanup()]
public void CleanupTest()
{
//cleanup
repo = null;
}
#endregion
Ich versuche, Kontext.WriteLine() ...
Ich habe auch versucht nur mit Konsole.WriteLine() mit dem gleichen Ergebnis.
Wie schreibst du auf der standard-Ausgabe in die ClassInitialize
Teil und wo kann man den Zugang, die Ausgabe ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
[ClassInitialize]
und[ClassCleanup]
nur einmal für alle tests in dieser Klasse. Sie wäre besser, verwenden[TestInitialize]
und[TestCleanUp]
die vor und nach jedem test. Auch versuchen Sie, wickeln den kompletten test in einer Datenbank-Transaktion. Auf diese Weise können Sie einfach ein rollback für die operation, indem die Transaktion ein commit ausgeführt) und Ihre Datenbank bleibt in einem konsistenten Zustand (was ist wichtig für zuverlässige, automatisierte tests).Einen trick, den ich tun für integration-tests ist die Definition einer Basisklasse, die alle meine integration test Klassen können Erben aus. Die Basisklasse sorgt dafür, dass jeder test verlief in einer Transaktion, und dass diese Transaktion ein Rollback ausgeführt wird. Hier ist der code:
Glück.
TransactionScope
funktioniert gut mit NHibernate, weil NHibernate benutzt nur standard ADO.NET -verbindungen. Auch wenn Sie schreiben Sie in der Konsole [TestCleanup] Sie haben nicht dieses problem, aber bitte schreiben Sie nicht an die Konsole, nur rollback.System.Data
überprüfen, ob eine Transaktion Bereich registriert ist, für den aktuellen thread. Wenn das der Fall ist, verwenden Sie dieselbe Verbindung und Transaktion. TransactionScope gefördert werden können, um eine verteilte Transaktion, das ist, wo MSDTC ist für. Ich persönlich finde TransactionScope-ideal für automatisierte Integrationstests, aber ich denke, es ist ein design-Geruch, wenn es in der Produktion eingesetzt.Die trace-Ausgabe aus einer ClassInitialize und ClassCleanup erscheint in der Ergebnis-Zusammenfassung.
Können Sie zugreifen, indem Sie die folgenden
Sehen Sie die Ausgabe der Konsole auf jedem test, wenn Sie einen Doppelklick auf die test-Methode in der Test-Ergebnisse Bereich. Es ist auch in der .trx xml-Ergebnis-Datei.
Darüber hinaus, wenn Sie angeben, die "DEBUG-Konstante Definieren", können Sie die
System.Diagnostics.Debug.WriteLine("ClassInitialize Method invoked, yeah.");
.. das wird am Ende in den "Ausgabe" Bereich.