Раньше у меня был небольшой опыт модульного тестирования, в том, что я называю (не уничижительно), классический проект разработки программного обеспечения: MVC, с пользовательским интерфейсом, базой данных, бизнес-логикой на среднем уровне и т. Д. Теперь я пишу научную вычислительную библиотеку на C # (да, я знаю, что C # слишком медленный, использую C, не изобретайте колесо, и все такое, но у нас есть много людей, занимающихся научными вычислениями на моем факультете в C #, и нам это как-то нужно). Это небольшой проект с точки зрения индустрии разработки программного обеспечения, потому что я пишу его в основном самостоятельно, и время от времени с помощью нескольких коллег. Кроме того, мне не платят за это, и самое главное, это академический проект. Я имею в виду, я надеюсь, что это когда-нибудь будет иметь профессиональное качество, потому что я планирую пойти с открытым исходным кодом
В любом случае, проект становится большим (около 18 000 строк кода, который я считаю большим для проекта с одним человеком), и он выходит из моих рук. Я использую git для управления исходным кодом, и я думаю, что у меня все в порядке, но я тестирую, как в старой школе, я имею в виду, пишу полноценные консольные приложения, которые тестируют большую часть системы, главным образом потому, что я понятия не имею, как провести модульное тестирование в этом сценарии, хотя я чувствую, что это то, что я должен делать. Проблема в том, что библиотека содержит в основном алгоритмы, например, алгоритмы графов, классификаторы, числовые решатели, случайные распределения и т. Д. Я просто не знаю, как задать крошечные тестовые случаи для каждого из этих алгоритмов, и так как многие из них Стохастик Я не знаю, как проверить правильность. Для классификации, например, есть некоторые метрики, такие как точность и отзыв, но эти метрики лучше для сравнения двух алгоритмов, чем для оценки одного алгоритма. Итак, как я могу определить правильность здесь?
Наконец, есть и проблема производительности. Я знаю, что это совсем другой набор тестов, но производительность - это одна из важных характеристик научных инструментов, а не удовлетворенность пользователей или другие показатели разработки программного обеспечения.
Одна из моих самых больших проблем связана со структурами данных. Единственный тест, который я могу предложить для kd-дерева, это стресс-тест: вставьте много случайных векторов, а затем выполните много случайных запросов и сравните с наивным линейным поиском. То же самое для производительности. А с числовыми оптимизаторами у меня есть тестовые функции, которые я могу протестировать, но опять же, это стресс-тест. Я не думаю, что эти тесты могут быть классифицированы как модульные тесты и, что наиболее важно, выполняются непрерывно, поскольку большинство из них довольно тяжелые. Но я также думаю, что эти тесты должны быть выполнены, я не могу просто вставить два элемента, открыть корень, и да, это работает для случая 0-1-n.
Итак, каков (если таковой имеется) подход (модульное) тестирование для этого вида программного обеспечения? И как мне организовать модульные и тяжелые тесты вокруг цикла code-build-commit-integrate?