Я мав трохи досвіду тестування одиниць раніше, тому що я називаю (не пейоративно) класичний проект інженерної програми: MVC, з графічним інтерфейсом користувача, базою даних, бізнес-логікою в середньому шарі тощо. Зараз я ' я пишу наукову обчислювальну бібліотеку в C # (так, я знаю, що C # занадто повільна, використовуйте C, не вигадуйте колесо, і все це, але у нас є багато людей, які роблять наукові обчислення на моєму факультеті в C #, і нам це наче потрібно). Це невеликий проект, що стосується індустрії розробки програмного забезпечення, тому що я пишу його здебільшого сам, а час від часу за допомогою кількох колег. Крім того, я не плачу за це, а головне, це академічний проект. Я маю на увазі, я очікую, що вона матиме професійну якість якогось дня, тому що я планую працювати з відкритим кодом,
У будь-якому випадку проект стає масштабним (близько 18 000 рядків коду, що, на мою думку, є великим для проекту однієї людини), і його вихід із моїх рук. Я використовую git для контролю джерел, і я думаю, що у мене все гаразд, але я тестую, як стара школа, я маю на увазі, пишу повні консольні програми, які перевіряють велику частину системи, головним чином тому, що я не маю уявлення, як робити тестування одиниць за цим сценарієм, хоча я вважаю, що саме це я повинен робити. Проблема полягає в тому, що бібліотека містить в основному алгоритми, наприклад, алгоритми графіків, класифікатори, числові розв'язувачі, випадкові розподіли тощо. Я просто не знаю, як вказати крихітні тестові випадки для кожного з цих алгоритмів, і оскільки багато з них є стохастичний Я не знаю, як перевірити правильність. Наприклад, для класифікації є деякі такі показники, як точність і згадування, але ці показники краще для порівняння двох алгоритмів, ніж для оцінки одного алгоритму. Отже, як я можу тут визначити правильність?
Нарешті, існує також проблема продуктивності. Я знаю, це зовсім інший набір тестів, але продуктивність є однією з важливих особливостей наукового інструменту, а не задоволеність користувачів чи інші показники інженерії програмного забезпечення.
Однією з моїх найбільших проблем є структури даних. Єдиний тест, який я можу створити для kd-дерева, - це стрес-тест: вставити безліч випадкових векторів, а потім виконати безліч випадкових запитів і порівняти проти наївного лінійного пошуку. Те саме для продуктивності. А з чисельними оптимізаторами у мене є функції орієнтиру, які я можу перевірити, але знову ж таки, це стрес-тест. Я не думаю, що ці тести можна класифікувати як одиничні тести, а найголовніше - працювати постійно, оскільки більшість з них досить важкі. Але я також вважаю, що ці тести потрібно зробити, я не можу просто вставити два елементи, спливати корінь, і так, це працює для 0-1-n випадку.
Отже, що таке взагалі (підрозділ) тестування такого програмного забезпечення, якщо воно є? І як я можу організувати одиничні тести та важкі тести навколо циклу "побудова-фіксація-інтеграція"?