Визуальное тестирование Visual Studio 2008 не проходит - PullRequest
4 голосов
/ 23 апреля 2010

Я создал метод, который вычисляет среднее гармоническое на основе списка двойных. Но когда я запускаю тест, он продолжает давать сбой, даже если результат вывода одинаков.

Метод моей средней гармоники:

public static double GetHarmonicMean(List<double> parameters)
{
    var cumReciprocal = 0.0d;
    var countN = parameters.Count;

    foreach( var param in parameters)
    {
        cumReciprocal += 1.0d/param;
    }

    return 1.0d/(cumReciprocal/countN);
}

Мой метод испытаний:

[TestMethod()]
public void GetHarmonicMeanTest()
{
    var parameters = new List<double> { 1.5d, 2.3d, 2.9d, 1.9d, 5.6d };
    const double expected = 2.32432293165495; 
    var actual = OwnFunctions.GetHarmonicMean(parameters);
    Assert.AreEqual(expected, actual);
}

После запуска теста отображается следующее сообщение:

Assert.AreEqual не удалось. Ожидаемое: <+2,32432293165495>. Факт: <2.32432293165495>.

Для меня это оба одинаковые значения.

Может кто-нибудь объяснить это? Или я что-то не так делаю?

Ответы [ 3 ]

7 голосов
/ 23 апреля 2010

Двойная перегрузка для Assert.AreEqual принимает параметр «delta», чтобы учесть неточность значений типа double.Вы должны указать небольшое значение для этого параметра.

1 голос
/ 23 апреля 2010

Двойные значения округляются при их отображении, поэтому они отображают несколько цифр, не превышая предела их емкости (чтобы ошибка округления не отображалась).Хотя значения выглядят одинаково, на самом деле они не имеют одно и то же значение.

Вы можете рассчитать значение и затем отобразить его в формате туда и обратно:

value.ToString("r")

Когдатекстовое представление, созданное таким образом, анализируется, гарантированно генерируется то же двойное значение, которое его создавало.Вы можете вставить это в код, и он даст вам точное совпадение.

Однако, как правило, двойные значения не следует сравнивать для точного равенства, поскольку у вас редко бывает ситуация, подобная этой, где вы на самом деле хотите получить точноематч.Кроме того, тестирование на точное совпадение может быть не тем, что вы на самом деле хотите в этой ситуации, так как оно зависит от того, какая реализация осталась прежней.Если бы вы использовали другой алгоритм, он дал бы другие ошибки округления, давая немного другой результат.

1 голос
/ 23 апреля 2010

Было бы очень трудно убедить метод GetHarmonicMean вернуть точно 2.32432293165495. Двойной гораздо точнее, чем 14 знаков после запятой. Ваш результат может быть, например:

2.32432293165495 - your_result = 0.0000000000000000012345 ... - это определенно не ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...