myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Code-Reviews » [Review]Erste Unit-Tests
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

[Review]Erste Unit-Tests

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
R3turnz R3turnz ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.01.2016
Beiträge: 125
Entwicklungsumgebung: Visual Studio 2015
Herkunft: Süddeutschland


R3turnz ist offline

[Review]Erste Unit-Tests

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,
ich habe nun angefangen mich mit Unit-Tests zu beschäftigen. Ich verwende xUnit und Autofixture. Hier sind meine ersten Tests:

C#-Code:
//WeatherTests.cs//
        private Weather _dummyWeather = new Weather();
        [Theory,InlineData(-1),InlineData(101)]
        public void Humidity_InvalidValues_ExceptionThrown(double invalidHumidity)
        {
            Assert.Throws<ArgumentException>(() => _dummyWeather.Humidity = invalidHumidity);
        }
        [Theory,AutoData]
        public void TempUnit_TemperatureConvertation_TemperatureCalculated(double temperature, TemperatureUnit targetUnit)
        {
            var unit = _dummyWeather.TempUnit;
            _dummyWeather.Temperature = temperature;
            _dummyWeather.MaxTemperature = temperature;
            _dummyWeather.MinTemperature = temperature;
            _dummyWeather.TempUnit = targetUnit;
            Assert.Equal(_dummyWeather.Temperature, TemperatureUnitHelper.ConvertTemperature(unit, targetUnit, temperature),1);
            Assert.Equal(_dummyWeather.MaxTemperature, TemperatureUnitHelper.ConvertTemperature(unit, targetUnit, temperature), 1);
            Assert.Equal(_dummyWeather.MinTemperature, TemperatureUnitHelper.ConvertTemperature(unit, targetUnit, temperature), 1);
        }
//TemperatureUnitHelperTest.cs//
        [Theory]
        [InlineData(-20,-4,253.15),InlineData(0,32,273.15),InlineData(20,68,293.15)]
        public void ConvertTemperature_CelsiusTemps_Calculated(double celsius, double expectedFahrenheit, double expectedKelvin)
        {
            Assert.Equal(expectedFahrenheit, TemperatureUnitHelper.ConvertTemperature(TemperatureUnit.Celsius, TemperatureUnit.Fahrenheit, celsius),2);
            Assert.Equal(expectedKelvin, TemperatureUnitHelper.ConvertTemperature(TemperatureUnit.Celsius, TemperatureUnit.Kelvin,celsius),2);
        }
        [Theory]
        [InlineData(250,-23.15, -9.67), InlineData(275, 1.85, 35.33),InlineData(300, 26.85, 80.33)]
        public void ConvertTemperature_KelvinTemps_Calculated(double kelvin, double expectedCelsius, double expectedFahrenheit)
...
        [Theory]
        [InlineData(-20, -28.89, 244.26),InlineData(0, -17.78, 255.37),InlineData(20, -6.67, 266.48)]
        public void ConvertTemperature_FahrenheitTemps_Calculated(double fahrenheit, double expectedCelsius, double expectedKelvin)

Das sind noch relativ simple Tests ohne Mocking etc. Gibt es trotzdem Verbesserungsmöglichkeiten?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von R3turnz am 30.10.2016 10:37.

30.10.2016 10:36 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.280
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Nimm FluentAssertions, womit die Tests viel übersichtlicher werden als mit Assert.Xy
30.10.2016 13:17 Beiträge des Benutzers | zu Buddylist hinzufügen
Deaktiviertes Profil Deaktiviertes Profil ist männlich
myCSharp.de-Mitglied

Dabei seit: 06.07.2014
Beiträge: 985


Deaktiviertes Profil ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Die _dummyWheather Instanz sollte vor dem Aufruf jeder Test-Methode neu erstellt werden, sonst hat man nachher irgendwelche SideEffects drin und der UnitTest ist für die Katz.

Die Test-Frameworks stellen dafür Attribute zur Verfügung, um Methoden zu kennzeichnen, die vor oder nach jeder Test-Methode aufgerufen werden.

Wenn du einen ungültigen Humidity-Wert setzt wirfst du dann tatsächlich nur eine ArgumentException? Ich hätte da eine ArgumentOutOfRangeException erwartet.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Deaktiviertes Profil am 30.10.2016 13:45.

30.10.2016 13:41 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.280
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Das hab ich ganz übersehen.
Allgemein sollte man nicht über verschiedene Tests irgendwelche Objekte teilen - ansonsten wäre auch der Name Unit für die Katz.

Siehe:  [Artikel] Unit-Tests: Einführung in das Unit-Testing mit VisualStudio
30.10.2016 13:52 Beiträge des Benutzers | zu Buddylist hinzufügen
R3turnz R3turnz ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.01.2016
Beiträge: 125
Entwicklungsumgebung: Visual Studio 2015
Herkunft: Süddeutschland

Themenstarter Thema begonnen von R3turnz

R3turnz ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich verwende wie oben erwähnt xUnit und hier wird der und nicht die mit Setup markierte Methode sondern der Konstruktor vor jedem Test ausgeführt (Siehe  Vergleich von Unit-Testing Frameworks)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von R3turnz am 30.10.2016 17:09.

30.10.2016 17:08 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.280
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Trotzdem macht es relativ wenig sinn :-) Dann evtl. sogar noch weniger.
Zudem erschwert es potentielles Mocking bei weiteren Tests...

Is nur nen Rat; und Du wolltest Feedback.
Und aus Erfahrung sag ich Dir, dass man nicht alle Features sinnvoll verwenden kann :-)
Ich verwende auch XUnit und vermeide jeglichen Constructor stuff.
Aber vielleicht gibts natürlich auch Leute, die damit positive Erfahrung gemacht haben könnten.
30.10.2016 17:27 Beiträge des Benutzers | zu Buddylist hinzufügen
R3turnz R3turnz ist männlich
myCSharp.de-Mitglied

Dabei seit: 03.01.2016
Beiträge: 125
Entwicklungsumgebung: Visual Studio 2015
Herkunft: Süddeutschland

Themenstarter Thema begonnen von R3turnz

R3turnz ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Okay, ich habe bisher noch nicht viel mit Mocking gemacht. Werde dann einfach entscheiden ob es für mich Sinn macht. Inwiefern setzt du dann soetwas um, da es kein Setup-Attribut gibt?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von R3turnz am 30.10.2016 17:49.

30.10.2016 17:45 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.280
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ich instanziiere einzeln. Nur für isolierte Elemente wie Testmodelle baue ich mir "Helper".
 https://github.com/SchwabenCode/FlexMapp...onMapperTest.cs
 https://github.com/SchwabenCode/QuickIO/...kIOPathTests.cs
30.10.2016 17:59 Beiträge des Benutzers | zu Buddylist hinzufügen
Palin Palin ist männlich
myCSharp.de-Mitglied

Dabei seit: 22.08.2011
Beiträge: 1.090
Entwicklungsumgebung: VB.net


Palin ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo R3turnz,

vielleicht Grundlegen erst mal, Unit Test ohne Mocks zu schreiben ist nicht schlecht. Laut Kennt Beck (TTD) sollte man wenn man Mocks benutzten muss. Erstmal prüfen ob nicht ein Fehler im designe Vorliegt. Es gibt aber durch aus gründe sie zu Verwenden, gerade im Umgang mit Legacy Code.

Der 1. Test (Humidity_InvalidValues_ExceptionThrown ) ist grundlegend Gut. Ok Humidity musste ich jetzt erst mal mit Leo über setzen. Luftfeuchtigkeit ist halt ein Wert der in % Angegeben wird. Hier kannst du vielleicht noch bei den Test einen Kommentar mit geben (z.B. Humidity ist ein Prozentwert). So das dann andere auch wissen wie so der Test fehlgeschlagen ist. Bei Humidity ist es vielleicht noch trivial, aber wenn die Anwendung etwas Komplexer ist, sollte deinen Kollegen mitgeteilt werden wie so der Test fehlgeschlagen ist. Es kann ja sein das sich die Anforderungen ändern und das es dann Korrekt ist, das der Test fehlschlägt und angepasst werden muss.

Dann ist es noch ein Positive Test, du erwartest das ein Exception geworfen wird, also Prüfst du ob eine Exeption geworfen wird. Hier fehlt eigentlich noch der Negativ Test (wird oft Vergessen), wird bei 0 und 100 keine Exception geschmissen.

Bei den anderen Test ist mir nicht klar wie so du gerade diese Testwerte gewählt hast, für mich wirken sie jetzt recht willkürlich. Bei Doubel Werten ist meist Interessant was bei was bei den Extremen Passiert (Min/Max Double) und aus was um 0 herum Passiert (-1,0,1) (Hier ändern viele Funktionen ihr Verhalten). Grundlegend muss man schauen wo was Interessantes passiert und schauen das man da passend die Test schreibt. Bei dir ist es z.B. der Absolute Nullpunkt (0K / -273,15C). Was passiert also bei den Werten -273,16C, -273,15C ,-273,14C)

MFG
Palin
31.10.2016 00:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Coffeebean Coffeebean ist männlich
myCSharp.de-Team

avatar-3295.gif


Dabei seit: 25.08.2011
Beiträge: 2.208
Entwicklungsumgebung: VS 2005-2017, VS Code
Herkunft: Deutschland/Schweiz


Coffeebean ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo R3turnz,

wundere mich, dass noch keine "Arrange - Act - Assert" in den Raum geworfen hat. Das vielleicht auch mal anschauen. Gerade was die angesprochene Eigenständigkeit von Unit-Tests angeht wäre der Fehler vielleicht gar nicht passiert.

Gruss

Coffeebean
31.10.2016 07:45 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 4 Jahre.
Der letzte Beitrag ist älter als 4 Jahre.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 23.11.2020 17:21