Laden...
M
Benutzerbeschreibung

Forenbeiträge von martinO Ingesamt 164 Beiträge

06.10.2009 - 15:28 Uhr

Hallo JAck30lena

Was wäre, wenn die Methode GetGanzerName gelöscht wird? Dann wäre GetGanzerNameTest auch weg und somit die Unit Tests auch. Ich habe keine Erfahrung mit Unit Tests, aber wenn ich Ansatz 2 nehmen würde, dann würde ich alle 3 Methoden testen.

Hier ein Ausschnitt aus einem guten Tutorial http://downloads.ytechie.com/Practical_.NET_Unit_Testing.pdf:
Tests should be isolated - Tests should be focused on testing the smallest unit of functionality possible.

Ich finde den Punkt sehr logisch und sinnvoll. Was denkst du?

06.10.2009 - 15:11 Uhr

Hallo Peter

Vielen Dank für den Tipp mit den Eigenschaften, Properties. Wenn ich eine Klasse mit Konstruktor habe, werde ich zuerst diesen aufrufen und die Properties testen (bei WPF ist das gar nicht so trivial)

Das Beispiel soll als Beispiel dienen - es handelt sich um eine Klasse ohne Konstruktor. Wie teste ich nun die obige Methode (angenommen, wir haben genau die drei Methoden einer Klasse XYZ)?

06.10.2009 - 13:28 Uhr

Codeschnipp:

public string GetName()
{
  return "Pseudoname";
}

public string GetVorname()
{
  return "Pseudovorname";
}

public string GetGanzerName() 
{
  return GetName()  + ", " + GetVorname();
}

Dieses einfache Beispiel soll als Grundlage dienen. Es gibt 3 Ansätze, über die philosophiert werden kann (oder eben nicht, wenn ich etwas völlig falsch verstanden oder vergessen habe). Ich gehe davon aus, dass ich jede Codezeile 1x durchlaufen haben möchte in meinen Tests. Ich möchte die Methode GetGanzerName() testen.

  1. Ansatz: Weil ich ja sowieso 2 weitere Testmethoden habe, um die anderen beiden Methoden zu testen, die dann statische Textvergleiche machen, rufe ich diese Methoden auf.
    Zugehörige Testmethode:
[TestMethod()]
public void GetGanzerNameTest()
{
  string expected = Person.GetName() + ", " + Person.GetVorname();
  string actual = Person.GetGanzerName();
  Assert.AreEqual(expected, actual);
}
[TestMethod()]
public void GetNameTest()
{
  string expected = "Pseudoname";
  string actual = Person.GetName();
  Assert.AreEqual(expected, actual);
}
public void GetVornameTest()
{
  string expected = "Pseudovorname";
  string actual = Person.GetVorName();
  Assert.AreEqual(expected, actual);
}

Vorteil: Wenn mein Name ändert, muss ich nur die Methode GetNameTest ändern, um wieder alle Tests fehlerfrei durchlaufen zu können.
Nachteil: Ist das im Sinne von Unit Testing?

  1. Ansatz: Eigentlich möchte man die Testmethode frei von Methoden haben, die getestet werden.
[TestMethod()]
public void GetGanzerNameTest()
{
  string expected = "Pseudoname, Pseudovorname";
  string actual = Person.GetGanzerName();
  Assert.AreEqual(expected, actual);
}

Vorteil: kA - eher im Sinne von Unit Testing?
Nachteil: Habe ich mehrere (auch verschachtelte) Methodenaufrufe, die diese Methode aufrufen, mus ich die Änderung am Namen an vielen Stellen "manuell" ändern (search & replace)

  1. Ansatz: In der Testklasse werden Konstanten mit den Pseudonamen und -vornamen gespeichert und diese dann in der Testmethode verwendet.
private const string name = "Pseudoname";
private const string vorname = "Pseudovorname";
[TestMethod()]
public void GetGanzerNameTest()
{
  string expected = name + ", " + vorname;
  string actual = Person.GetGanzerName();
  Assert.AreEqual(expected, actual);
}

Welchen Ansatz verwendet ihr und warum?

05.10.2009 - 15:42 Uhr

Hallo talla

Vielen Dank für deine Infos - ich werde mir diese zu Herzen nehmen

05.10.2009 - 12:49 Uhr

Hallo talla

Merci für den Link (hab auch schon ein Tutorial von Sacha Barber durchgearbeitet). Das Cinch Framework ist wegen internen Regelungen keine Alternative.

Ich suche noch immer Beispiele, wie ich meine Methoden (siehe Beginn) testen kann.

05.10.2009 - 11:29 Uhr

Hallo Kaji

Logisch klopfklopf. Hätte mir auch auffallen dürfen...

Verwendet von euch jemand PEX im betrieblichen Umfeld? (also nicht nur zu hause um es mal ausprobiert zu haben)

05.10.2009 - 11:25 Uhr

@der-schlingel: Vielen Dank. Ist eine gute Einführung, um die Idee hinter Unit Tests besser zu verstehen. Auch die Mock-Frameworks wurden schön erklärt.
@Joetempes: Diesen Blogeintrag habe ich auch schon gelesen - ist auch eine schöne Einführung (sehr flüssig (einfach) geschrieben).

Gibt es ein gutes Buch über Unit Testing, welches mir weiterführende Beispiele (bitte, Beispiele - nicht nur die Theorie) erklärt? Wie teste ich einen Konstruktor? Wie teste C# Code in Bezug auf WPF?

(Cinch ist leider keine Alternative.)

05.10.2009 - 07:47 Uhr

http://www.imageprocessingplace.com/ Gonzales, Woods - Bekanntes Buch, welches Grundlagen erklärt - hat auch Algorithmen drin (nicht .NET spez., sind glaubs Matlab...)

http://www.imagingbook.com/index.php?id=14 Vielleicht findest du davon eine Online-Ausgabe. Wir haben es mal gebraucht, aber ich finde es nicht ganz so gut wie Gonzales, Woods

Bez. OCR kann ich dir keine Buchtipps abgeben. Evtl. kennst du OpenCV - vielleicht unterstützt das ja OCR

Gruss

02.10.2009 - 15:01 Uhr

Merci für die Antwort JAck30lena (die Summary Kommentare werden schon noch überarbeitet 😉 ).

Zur allgmeinen Info: Für das GUI Testing haben wir noch kein Framework evaluiert (hat jemand Erfahrungen mit Ranorex gemacht?) - die Fragen beziehen sich vielmehr auf White box-Tests.

Wie kann ich ein Konstruktor (WPF) testen? Aus dem Bauch heraus kann man diesen ja eigentlich nur mit einem GUI Testing - Tool prüfen, oder?

        public CustomDialog()
        {
            InitializeComponent();
        }
02.10.2009 - 13:53 Uhr

Hallo

Die Grundlagen von Unit Tests sind "allgemein" bekannt, typische Beispiele gibt es auch wie Sand am Meer.
Einfach zu testende Methode wäre z.B. eine Mini-Bankenapplikation (Konto erstellen, 200.- einzahlen, 100.- abheben => test auf Saldo = 100.-)

Nun bin ich jedoch auf der Suche nach "komplexeren" Beispiel, wie z.B. (siehe Anhang):

  • Konstruktor Testen (da kann man ja eigentlich nur testen, ob das Objekt nach der Initialisierung /= null ist, oder? Instanziert man Werte, müssen diese alle auch noch überprüft werden. Hab ich was vergessen?

  • Methode 1: Eigentlich muss ich dasselbe in der Testmethode auch schreiben, um die Resultate zu prüfen - und dann das Feld mit dem berechneten Wert vergleichen. Oder? Wie definiere ich selbst einen Event und gib dem Werte an die Methode mit? Ein typ. Beispiel eigentlich, dass hier der Test-Code ca 5x länger wird als die Methode selbst...

  • Wie teste ich Methode 2? TaskDialog ist static, Show auch

  • Methode 3: Da prüfe ich nach dem Aufruf, ob mein EventArg auch true ist? 1 Zeile Code, 5 Zeilen testcode?

  • Methode 4: Was gibts da zu prüfen? Da steh ich völlig auf dem Schlauch...

  • Methode 5: Wie teste ich eine solche Methode?

Ein hilfreiches Tutorial wäre mir auch recht - ich habe nur die einfachen Beispiele im Internet gefunden (die Taschenrechner und Bank-Beispiele).

Merci im Voraus

02.10.2009 - 13:20 Uhr

Hallo

Die Entwicklungsumgebung ist VS2010 Beta 1 mit Resharper5 (nightly built). Beide Unterstützen MSTest, mit VS2010 lassen sich auch private Methoden testen (MSDN bezeichnet dies als "accessor", Unit Tests for Private, Internal, and Friend Methods).

Die Hauptgründe, warum wir uns für MSTest entschieden haben (noch nicht zu 100%, aber ...) waren, dass das ganze Testing schon in VS2010 implementiert ist, Resharper MSTest auch unterstützt und man keine eigenen Klassen schreiben muss, um auf private Methoden zugreifen zu können.

Gleich mal vorweg:
Was spricht gegen den Entscheid, MSTest in Verbindung mit VS2010 zu verwenden?
Was gilt zu beachten?

Sucht man hier im Forum nach MSTest erscheinen 6 Resultate, bei NUnit 164. Was könnte der Grund für diese Verteilung sein?

Merci für die Antworten

Ein TDD-Neuling

02.10.2009 - 11:20 Uhr

Ich nutze auch GhostDoc - es erspart viel Tipparbeit, auch wenn die Kommentare zu 90% von Hand überarbeitet werden müssen (logisch).

Welche Tools verwendet ihr, um aus dem dokumentierten Code eine Doku zu erzeugen?
Sandcastle, VSdocman, ...?

02.10.2009 - 11:12 Uhr

Im aktuellen dotnetpro (www.dotnetpro.de, dnpCode: A0909Pex) ist ein Artikel über Pex drin.
So wie's scheint kann Pex sehr viel, aber auch sehr viel nicht.

Ich habe gelesen, dass Pex die Methoden untersucht und dann daraus die Testmethoden selbst generiert. Ist es nicht das Ziel von TDD, zuerst die leere Signatur der Methode zu schreiben, dann den Test zu schreiben und dann die Methode solange zu verändern, bis der Test nicht mehr fehl schlägt? Somit könnte Pex aber auch nicht mehr die Methode analysieren und es würde mir einen mehr oder weniger leeren Testfall erzeugen (Bsp: Ich habe eine Methode mit 1 Parameter, welche mir ein String zurückgibt, der in einer switch-Anweisung generiert wird - für alle möglichen Testfälle müsste Pex somit zuerst die gesamte Switch-Anweisung sehen...).

Wer von euch arbeitet mit Pex? Warum? Was sind die Vorteile gegenüber anderen Test Frameworks?
Oder die, die nicht mit Pex arbeiten: Warum nicht? Und welches Framework setzt ihr ein?

Merci im Voraus

ein TDD-Neuling

17.08.2009 - 15:30 Uhr

Hallo,
hat von euch jemand mal versucht, Elemente (Tabs, Groups, Buttons) zur Laufzeit dem Ribbon-Menü hinzuzufügen?
im XAML ein Menü zu definieren funktioniert (gibt auch einige Tutorials dafür im Web), Tabs können ebenso hinzugefügt werden und auch Buttons können einer bestehenden RibbonGroup hinzugefügt werden.
Was ich bisher noch nicht hingekriegt habe ist eine Gruppe einem Tab hinzuzufügen (eine bestehende Gruppe einem Tab entfernen und einem anderen anhängen funktioniert auch (Visibility))

Codeschnipsel:


            RibbonTab ribbonTab1 = new RibbonTab();
            ribbonTab1.Name = "tab1";
            ribbonTab1.Label = "Ribbon Tab 1";          

            ControlTemplate sizedef = new System.Windows.Controls.ControlTemplate();

            RibbonGroup ribbonGroup1 = new RibbonGroup();
            ribbonGroup1.Template = sizedef;
//ACHTUNG: Wird Template nicht gesetzt, erhalte ich eine NullReferenceException
            ribbonGroup1.Name = "group1";
            ribbonGroup1.Command = Clipboard.Command;
            
            ribbonGroup1.HasDialogLauncher = true;
            
            RibbonButton ribbonButton1 = new RibbonButton();
            ribbonButton1.Name = "button1";
            ribbonButton1.Tag = null;
            ribbonButton1.Command = ribbonCommand1;

            ribbonGroup1.ItemsPanel.Children.Add(ribbonButton1);

            ribbonTab1.Groups.Add(ribbonGroup1);

            this.ribbon.Tabs.Add(ribbonTab1);

Es wird ein neues Tab hinzugefügt, welches jedoch leer ist. Ich vermute, es ist weil das ControlTemplate leer ist (wüsste jedoch nicht, was ich ändern könnte).

Die MSDN Hilfe ist zu diesem Problem nicht wirklich zu gebrauchen und im Web wird bei WPF meist nur der handgeschriebene XAML-Code verwendet...