Подтвердить что ты не робот

Как создать хорошее покрытие кода с плавающей точкой?

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

Есть ли что-то конкретное, что я могу сделать, помимо указания кодовых контрактов для руководства Pex, чтобы он обеспечивал хорошее покрытие в численно-интенсивном коде?

Попробуйте найти http://research.microsoft.com/en-us/projects/pex/pexconcepts.pdf ключевое слово 'float' для получения некоторой исходной информации.

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

... и также...

Символическое рассуждение. Pex использует автоматический решатель ограничений, чтобы определить, какие значения релевантны для теста и кода для теста. Однако способности решателя ограничений всегда ограничены. В частности, Z3 не может точно рассуждать о арифметике с плавающей запятой.

Альтернативно, знаете ли вы инструмент под .NET, который лучше подходит для задачи поиска числовых аномалий в .NET? Я знаю http://fscheck.codeplex.com/, но не выполняет символические рассуждения.

4b9b3361

Ответ 1

Это то, что вы хотите получить? Просто наличие теста, который запускает каждую ветвь в куске кода, вряд ли на самом деле означает, что это правильно - часто это больше касается угловых дел, и вы, как разработчик, лучше всего знаете, что такое эти угловые случаи. Похоже, что это работает, просто говоря "здесь интересная комбинация ввода", тогда как более чем вероятно, что вы хотите указать поведение системы, которую хотите увидеть, - если вы написали код неправильно, в первую очередь, то интересный входы могут быть совершенно несовместимы с правильным кодом.

Возможно, это не тот ответ, который вы ищете, но я бы сказал, что лучший способ сделать это - это вручную! Запишите спецификацию перед началом кодирования и включите ее в загрузку тестовых примеров, когда вы знаете/когда вы пишете API для своего класса/подсистемы.

Как начать заполнять API/писать код, который вы, скорее всего, заберете дополнительные биты и куски, которые вам нужно сделать + узнать, какие сложные бит - если у вас есть условные обозначения и т.д., то вы чувствуете, что кто-то рефакторинг вашего кода может привести к ошибке, а затем написать тестовый пример, который их охватывает. Я иногда намеренно пишу код неправильно в этих точках, получаю тест, который терпит неудачу, а затем исправляет его, чтобы убедиться, что тест проверяет правильный путь через код.

Затем попробуйте подумать о каких-либо нечетных значениях, которые вы, возможно, не указали - отрицательные входы, нули и т.д. Часто это будут случаи, которые являются недействительными, и вы не хотите, чтобы ухаживать за/должны думать - в этих случаях я вообще буду напишите некоторые тесты, чтобы сказать, что они должны бросать исключения - это в основном останавливает людей, злоупотребляющих кодом, в случаях, когда вы не имеете должным образом/с недопустимыми данными.

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