Я думаю, что вы ошибаетесь в том, как следует использовать Pex: мы настоятельно рекомендуем пользователям записывать утверждения в своих параметризованных модульных тестах.
Если вы пишете утверждения, Пекс будет систематически пытаться сделать их недействительными - вот в чем заключается сила Пекс: чем больше вы пишете утверждений, тем больше он пытается найти для вас ошибки.
Если вы используете Pex для получения набора тестов с высоким охватом кода без написания утверждений, вы получите только то, что просили: покрытие кода и гарантированные исключения времени выполнения. Pex 'only' пытается охватить ветви (1 утверждение = 1 ветвь), если нет покрывающих ветвей (нет подтверждения), он не будет генерировать интересные тестовые случаи.
В общем, писать утверждения в параметризованных модульных тестах сложнее, потому что ... ну, они более общие. Давайте начнем с поведения округления: определенно существует граница, на которой вы разрешаете округление, это должно естественным образом перевести в параметризованный модульный тест:
[PexMethod]
public void RoundInBounds(double value)
{
var money = new Money(value);
// distance between value and amount should be at most 0.01/2
Assert.AreEqual(value, money.Amount, 0.005);
}
Существует также ряд шаблонов, которые можно использовать для их написания. Например, ваш класс «Деньги», вероятно, является идемпотентом: если вы возвращаете значение «Сумма» обратно в экземпляр «Деньги», вы получаете сумму назад. Это переводит элегантно в параметризованный модульный тест:
[PexMethod]
public void RoundIsIdempotent(double value)
{
var first = new Money(value).Amount;
var second = new Money(first).Amount;
Assert.AreEqual(first, second, 0.0001);
}
Обратите внимание, что параметризованные модульные тесты определенно принадлежат миру TDD. Сначала напишите параметризованный модульный тест, Pex найдет неисправную ошибку, исправит ошибку, Pex найдет следующую неисправную ошибку и т. Д ...
Делает ли это Pex полезным инструментом? Ты будешь судьей.