280 likes | 395 Views
dotNET User Group Berlin Brandenburg. NUnit - Unit Tests auf der .NET-Plattform. Übersicht. Was ist Unit Testing? NUnit Test Framework Beispiel Integration in Visual Studio .NET Probleme. Was ist Unit Testing? Vergleich. Load testing: Kapazitäts-/Stress-test, Tuning
E N D
dotNET User Group Berlin Brandenburg NUnit - Unit Tests auf der .NET-Plattform Referent: Daniel Faensen
Übersicht • Was ist Unit Testing? • NUnit Test Framework • Beispiel • Integration in Visual Studio .NET • Probleme
Was ist Unit Testing? Vergleich • Load testing:Kapazitäts-/Stress-test, Tuning • Unit testing:Komponente losgelöst vom restl. System;Teil der alltägl. Arbeit eines Programmierers • System testing: Integrationstest • „Black box“ functional testing:Funktionalität <--> Spezifikation? (Input/Output) • „White box“ structural testing:Code-Struktur und -Organisation • Regression testing:Vergleich zur Vorgängerversion (Black box-Variante)
Was ist Unit Testing? • XUnit • Gamma1/Beck2: Test Infected • Write Test First • XP • Refactoring (Fowler) • NUnit 1 GoF: Design Patterns 2 XP eXtreme Programming
Was ist Unit Testing? Testideen • Jedes Objekt: • Null pointer • Strings: • Leerer String • Collections: • Leere Collection • Genau ein Element • Maximale Größe • Duplikate • Suchen • Nicht gefunden • Ein Treffer • Mehrere Treffer • Zahlen • 0 • Kleinste Zahl • Etwas kleiner als die kleinste Zahl • Größte Zahl • Gerade größer als größte Zahl • Zahlenpaare • Zusammen > max
Was ist Unit Testing? Testideen • Bäume, Warteschlangen, Graphen • Leere Struktur • Minimale, nicht leere Struktur • Struktur mit Zyklen • Höhe > 1 (oder Höhe = max) • Gleichheit • Gleich aber nicht identisch • (apfel == birne) --> false • Unterschiedlich in Details
Übersicht • Was ist Unit Testing? • NUnit Test Framework • Beispiel • Integration in Visual Studio .NET • Probleme
NUnit Test Framework • Test Framework für .Net • Geschrieben in C# • Open Source (SourceForge, http://nunit.org) • Reflection / Custom Attributes • GUI oder Console • XML-Ausgabe
NUnit Test Framework Attribute Test Cases werden durch Attribute markiert • Früher: Reflection + Namenskonvention public void method()
NUnit Test Framework Assertion Tests verwenden Klasse NUnit.Framework.Assertion static public void Assert(string msg, bool condition) static public void AssertEquals(string msg, expected, actual) static public void AssertSame(string msg, expected, actual) static public void Fail(string msg) • Früher: Methoden in Superklasse TestCase
Übersicht • Was ist Unit Testing? • NUnit Test Framework • Beispiel • Integration in Visual Studio .NET • Probleme
Beispiel • Interface IMoney: Operationen auf Geldwerten verschiedener Währungen interface IMoney { ///<summary>Adds a money to this money.</summary> IMoney Add(IMoney m); ///<value>True if this money is zero.</value> bool IsZero { get; } ///<summary>Multiplies a money by the given factor.</summary> IMoney Multiply(int factor); ///<summary>Negates this money.</summary> IMoney Negate(); ///<summary>Subtracts a money from this money.</summary> IMoney Subtract(IMoney m); }
Beispiel • Class Money class IMoney : IMoney { private int fAmount; private String fCurrency; ///<summary>Constructs a money from the given amount and /// currency.</summary> public Money(int amount, String currency) { fAmount= amount; fCurrency= currency; } ///<summary>Adds a money to this money.</summary> IMoney Add(IMoney m) { ; } ... }
Beispiel • Erstellen eines Unit Tests namespace NUnit.Samples.Money { using NUnit.Framework; [TestFixture] public class MoneyTest { private Money f12CHF; private Money f14CHF; private Money f7USD; private Money f21USD; ... } Test-Kontext
Beispiel [TestFixture] public class MoneyTest { private Money f12CHF; private Money f14CHF; private Money f7USD; private Money f21USD; [SetUp] protected void SetUp() { f12CHF= new Money(12, "CHF"); f14CHF= new Money(14, "CHF"); f7USD= new Money( 7, "USD"); f21USD= new Money(21, "USD"); } ... • SetUp und TearDown: Einheitlicher Kontext • Aufruf vor bzw. nach jedem Test Case
Beispiel • Test Cases hinzufügen [TestFixture] public class MoneyTest { private Money f12CHF; private Money f14CHF; private Money f7USD; private Money f21USD; [Test] public void SimpleAdd() { // [12 CHF] + [14 CHF] == [26 CHF] Moneyexpected= new Money(26, "CHF"); Assertion.AssertEquals(expected, f12CHF.Add(f14CHF)); } ...
Beispiel • Kompilieren--> schlägt fehl (Klasse Money fehlt) • Money implementieren (nur Signaturen) • Kompilieren --> Erfolg • NUnit-Test --> schlägt fehl • Money vervollständigen/korrigieren • Kompilieren • NUnit-Test --> Erfolg • Nächster Test Case
Beispiel • Sehr ausführliches Beispiel in Kent Beck; Erich Gamma: Test Infected - Programmers Love Writing Tests(http://members.pingnet.ch/gamma/junit.htm)
Übersicht • Was ist Unit Testing? • NUnit Test Framework • Beispiel • Integration in Visual Studio .NET • Probleme
VS Integration • Create test project TestCases • Copy nunit-gui.exe to nunit-gui.dll • Add nunit-gui.dll andnunit.framework.dllto References • Add class TestRunner.cs • Set startup project and startup object • F5
VS Integration using System; using NUnit.Gui; namespace TestCases { public class TestRunner { [STAThread] static void Main() { NUnitForm form = new NUnitForm("TestCases"); System.Windows.Forms.Application.Run(form); } } } Assembly name
VS Integration Alternative • Neue Configuration „Test“ • Im Startup Project unter Config. Properties -> Debugging • Debug Mode: Program • Start Application: C:\Path\To\Nunit-gui.exe • Command Line Args: C:\Path\To\TestCases.dll
Übersicht • Was ist Unit Testing? • NUnit Test Framework • Beispiel • Integration in Visual Studio .NET • Probleme
Probleme • Benutzeroberflächen • Web-Anwendungen(NUnitASP) • Asynchrones Verhalten • Stochastisches Verhalten • Menschliches Verhalten(Entwicklungskultur)
dotNET User Group Berlin Brandenburg NUnit - Unit Tests auf der .NET-Plattform Referent: Daniel Faensen