2009-05-18 7 views
23

Mam kilka testów jednostkowych C#, które wykonują niektóre operacje float/double i chciałbym je przetestować w jednostce. Assert.AreEqual jest niewystarczający z powodu błędów zaokrąglania.Operacje testowania jednostek w Visual Studio 2008 Pro

Przenieś konwersję jednostek jako przykład. 10,5 metrów do stóp ma współczynnik konwersji 3,281, więc otrzymuję 34,4505. Zastosowanie dokładniejszego współczynnika konwersji daje mi 34.4488189. Chcę przetestować to w, powiedzmy, 0,1 (więc 34.3488-34.5488 przejdzie test).

mogłem pewna ręcznie testować wartość z tolerancją w moim badanej jednostki, ale to bardzo powtarzalne i komunikat awaria nie byłoby bardzo opisowy (ponownie bez konieczności napisać własny komunikat o niepowodzeniu Assert):

Assert.IsTrue(Math.Abs(34.4488189 - value) < 0.1); 

W jaki sposób mogę przetestować moje operacje float w granicach pewnej tolerancji błędu? Nie mogę znaleźć żadnych klas Assert, które robią to, które pochodzą z VS. Czy tęsknię za tobą, czy też muszę przetoczyć własną?

Czy istnieją standardowe praktyki testowania zmiennoprzecinkowych/debugowych, o których należy pamiętać?

Odpowiedz

38

Assert.AreEqual w MSTest ma przeciążenia, które przyjmują delta (tolerancja błędu) Parametry:

public static void AreEqual (double expected, double actual, double delta) 

np

Assert.AreEqual(34.4488189, value, 0.1); 

albo na najmniejszej możliwej tolerancji:

Assert.AreEqual(34.4488189, value, double.Epsilon); 
+8

Hah! 18 przeciążeń dla AreEqual. Nic dziwnego, że tego nie złapałem. –

+0

ostrzeżenie, używając 'double.Epsilon' nie zrobi tego, co chcesz. Epsilon to najmniejsza wartość podwójnej precyzji. Dotyczy to tylko porównań wartości, które są rzędu 10^-324, co jest bardzo mało prawdopodobne.To, co chcesz zrobić, to porównać podwójne wartości do ostatniej cyfry, którą mogą reprezentować. Tak więc tolerancja może wynosić tysiąc, jeśli porównasz wartości w kwadrylionach. Słowo "buzz" to "ULP" (jednostki na ostatnim miejscu). zobacz http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm –

3

Można przyjrzeć ramach NUnit:

//Compare Float values 
Assert.AreEqual(float expected, float actual, float tolerance); 
Assert.AreEqual(float expected, float actual, float tolerance, string message); 

//Compare Double values 
Assert.AreEqual(double expected, double actual, double tolerance); 
Assert.AreEqual(double expected, double actual, double tolerance, string message) 

(Above zaczerpnięte z this artykułu)

Więcej wymienione here.

0

jestem na moim telefonie więc wybaczyć brak CODE/linki.

Tu jest pytanie o ulubione rozszerzenia C#, gdzie ludzie mają rozszerzony wbudowany typ, taki jak string. Można przedłużyć typu float z metody, która będzie działać tak:

Myfloat.IsInTolerance(34.8f, 0.1f) 

..which wróci prawda czy pływak Myfloat wynosiła 0,1 po obu stronach 34,8. To może sprawić, że będzie mniej pracochłonny.

0

Spójrz na ograniczenia NUnit Equality, są elastyczne! Mam nadzieję, że to pomoże!