Frage

Diese Frage über Unit-Tests löste eine andere Sache, die mich stört worden ist. Ich bin gegangen, hin und her auf drei Arten Unit-Tests zu tun, wenn eine Datenbank zu treffen.

  1. Erstellen Sie Mock-Objekte und stecken Sie sie in. Dies hat den Vorteil, dass keine Datenbank benötigen, aber es ist zeitraubend und ich bin nicht sicher, wie viel Rendite Ich erhalte. Ich habe in IOC bekommen und moq ein wenig, aber es scheint immer noch schmerzhaft.
  2. Erstellen Sie eine Setup-und Teardown-Datenbank Skripten bekannten Fällen zu erstellen, und Test für diejenigen. Auch hier kann zeitintensiv sein, aber immer noch einfacher als Mock erstellen die meiste Zeit Objekte. Und andere Menschen bei der Arbeit kann es immer noch laufen sie auf ihrem lokalen Host SQL Server unter der Annahme haben.
  3. Sie manuell die dev-Datenbank überprüfen und Unit-Tests ändern. Intensiv Handarbeit, aber wenn ich einen „Testsatz“ haben, das nicht ändert, es scheint zu funktionieren OK. Auf meinem Rechner zumindest :-).

Ich weiß Option 1 ist die „richtige“ Art und Weise Unit-Tests zu tun, aber die drei, das ist wahrscheinlich die Option, die ich am wenigsten benutzt habe (obwohl die neuesten Projekte mit IOC gewesen sein, so dass Tür für mich geöffnet ist ). Ich weiß, eine Menge davon hängt davon ab, was genau wird verspottet und was getestet wird, aber was soll ich hier fehlt?

Wenn Kontext hilft, bin ich in einem # Shop C, Anwendungen im Hause zu schreiben, nur wenige Entwickler.

War es hilfreich?

Lösung

Die erste sollte nicht so schwer sein, wenn Sie eine Datenzugriffsschicht, dass Exposes eine Handvoll IQueryable<T> Methoden nur haben. Es gibt einen schönen Trick, den Sie für gefälschte Daten verwenden können: Speichern Sie einfach die Entitätsobjekten in einem List<T> und Verwendung AsQueryable. Das finde ich einfacher als moq für die Datenteile.

In Bezug auf IOC, nehme ich die Position, dass es derzeit überstrapaziert ist (beachten Sie, dass meine Meinung nach der Minderheit der Programmierer in dieser Hinsicht darstellt). Sie können ein Tool wie Moles während zu mock Prüfung ohne Missbrauch mit Ihr Programm-Design. Ich glaube nicht, IOC verwenden, wenn der Entwurf für sie tatsächlich aufruft.

Andere Tipps

Ich würde auf jeden Fall auch weiterhin wahr Unit-Tests verwenden (Option 1). Ich mag Stephen Rat für diese.

Sie können auch Integrationstests mit einer aktuellen Datenbank (Option 2) notwendig verwenden, wie gut (Option 2) finden. Warum? Da ein Teil von dem, was Sie testen müssen (O / R-Mapping, die Kompatibilität mit dem aktuellen DB-Schema, etc.) werden durch echte Unit-Tests nicht abgedeckt.

Wie für Auf- und Abbau Logik, abgeleitet von dieser Regel genügt (mit .NET, NUnit und SqlServer für die Datenbank):

using System.Transactions;
using NUnit.Framework;
namespace Crown.Util.TestUtil
{
    [TestFixture]
    public class PersistenceTestFixture
    {
        public TransactionScope TxScope { get; private set; }

        [SetUp]
        public void SetUp()
        {
            TxScope = new TransactionScope();
        }

        [TearDown]
        public void TearDown()
        {
            if (TxScope != null)
            {
                TxScope.Dispose();
                TxScope = null;
            }
        }
    }
}

Einfach als Torte.

Es gibt eine ganze Reihe von Antwort. Das erste, was zu tun ist, klar zu artikulieren, was Sie testen. Ist es die Fassade einer API, die eine Datenbank hinter sich hat, DAO-Objekte, die Struktur Ihrer Datenbank?

, um diese bekommen wird Ihnen auch helfen, die beste Art und Weise zu testen Dinge entscheiden. Es ist auch von dem, was ich eine Alternative zu denen, sehen Sie Liste. Das ist in In-Memory-Datenbank wie hsql zu starten und Ihre Klassen und Tests dagegen laufen. Dies bedeutet, dass Sie die Datenbankstruktur zu Beginn erstellen können Sie testen. Weil es im Speicher ist Sie müssen sich keine Sorgen machen über einen Datenbankserver mit, es ist schnell, und Sie können es mit Daten speziell für Ihren Test laden.

Ich benutze Mocks ziemlich viel und während sie für Einheit groß sind eine Klasse zu testen, in einigen Fällen sind sie nicht. Sie können auch ganz leicht verpassen führen. Es ist nicht ungewöhnlich für etwas, das funktioniert mit Mocks, ganz zu schweigen, wenn integriert zu arbeiten. Die reasonnfor ist, dass Sie den Mock mit bestimmten Erwartungen und Antworten laden, die Sie von der Sache interpretiert wird zu Unrecht, dass der Schein darstellt.

Verstehen Sie mich nicht falsch, ich mag Mocks und sie ziemlich viel verwenden. Aber damit muss man nie davon ausgehen, dass da etwas Einheit getestet, es ist richtig. Es tut erhöht die Chancen, aber auf Integrationstests tatsächlich Sie 100% Sicherheit geben.

Was testen Sie wirklich, dass macht Sie das Gefühl, dass dies schwierig ist?

Wenn Sie Ihr Unternehmen und Service-Layer-Logik von Ihrem persistance Code entkoppeln, sollten Sie easilly Lage sein, den Code, den Sie Unit-Test wollen zu isolieren, ohne auf eine DB mit.

Eines der wichtigsten Prinzipien der Unit-Tests ist zu entkoppeln und Test in der Isolation. Wenn Sie ein klares Verständnis davon haben, wie das zu tun, ist Unit-Tests einfach. Wenn Sie dies nicht tun, Unit-Tests werden hart.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top