По моему опыту, вы должны использовать юнит-тестирование как проверку работоспособности и возможную проверку регрессии.Конечно, модульное тестирование должно быть как можно более тщательным, но иногда бывает очень утомительно, когда он полностью тестирует всю функциональность кода.
Модульные тесты не являются формальным доказательством.Они не могут и не будут предупреждать о будущих ошибках и проблемах с вашим кодом.Протестируйте общие случаи использования кода.Если вам нужна большая степень надежности, вам нужно будет создать большое хранилище регрессионных тестов.К счастью, для общих проблем есть несколько онлайн-баз данных для такого рода вещей. TPLP , например, это база данных проблем (и решений) для Доказателей Теорем.
Один метод, который иногда работает для меня ... обычно в математическом коде, есть "легкий, но медленный""методы" и "быстрые, но сложные в программировании" методы.При написании кода вы хотите использовать быстрый, но трудный для написания (так что вы ожидаете ошибок).Итак ... сделайте быстрый путь к тестируемой системе (SUT).Когда вы делаете модульный тест, создайте 1000 случайных задач и решайте их «простым, но медленным» методом.Затем запустите SUT и убедитесь, что ответы аналогичны.
Предполагая, конечно ..., что создание случайных проблем - это простая проблема, которую нужно решить.Иногда это так, иногда нет.Трудно сказать, не сказав нам о самом математическом коде.Теперь ... Это получает ВСЕ случаи?Нет. Но это получит "общие" случаи.И если на практике всплывает угловой случай, оберните его в модульном тесте и исправьте в следующей версии вашего кода.