Тестування наборів для числових додатків на C ++?


13

Останнім часом я підштовхував свою групу до включення додаткового тестування під час написання коду. Було кілька основних помилок, на які пішло набагато більше часу, ніж, мабуть, говорити було потрібно, тому що у нас не було хорошого режиму тестування.

Однак я підозрюю, що наявність відповідних інструментів для автоматизації (або сприяння оптимізації) процесу, безумовно, буде корисною. З іншого боку, я не знаю різних варіантів набору тестів на C ++, і як вирішити між ними?

Чи є вказівки на те, на що звернути увагу - чи є спеціально орієнтовані на числові програми?

Відповіді:


11

Проблема тестування числових кодів полягає в тому, що (i) ви не завжди можете знати точний вихід, і зможете зберегти результат обчислень тепер для порівняння з пізнішими - тобто робити тести регресії та (ii) що результати можуть відрізнятися невеликими кількостями на різних машинах через різну окружність.

Щоб побачити, як це працює.II, подивіться тут: http://www.dealii.org/developer/development/testsuite.html#regression_tests


Хороші моменти щодо обмежень одиничного тестування. Регресійне тестування - це добре (звичайно, краще, ніж взагалі не тестувати, оскільки вихід невідомий; він може давати попереджувальні знаки про помилки). Що стосується питання машинного заокруглення, чи пом'якшує це те, що перетворюється на вибір хорошої толерантності за допомогою проб і помилок?
Джефф Оксберрі

2
Це постійний біль. За більш ніж 10 років тестування ми ніколи не придумували дійсно гарної стратегії боротьби з нею. Використання numdiff замість diff може допомогти, але в кінцевому підсумку вам потрібно призначити одну машину, для якої ви зберігаєте "0,3987" замість "0,3988", яку ви отримуєте на іншій машині, коли правильне число 0,39875. Де б ви не встановили поріг, ви завжди будете відрізати одне число іншого в неправильному місці.
Вольфганг Бангерт

@WolfgangBangerth. Існують певні прапорці компілятора, які роблять поведінку з плаваючою комою більш детермінованою. Напр. / Fp: сувора | точна та / Qimf-арка-узгодженість: правда (компілятор Intel) або -fnounsafe-math-оптимізація, -ffloat-store (GCC) може зробити ваш код більш стійким і відтворюваним на всіх платформах ціною продуктивності . З деяким налаштуванням це забезпечує спеціальну "відтворювану" збірку, яку можна використовувати спеціально для тестування.
Андре

@Andre - о так, ми все це спробували. Ще важко :-)
Вольфганг Бангерт

10

Нещодавно я використовував googletest для тестування декількох числових бібліотек, над якими працюю, і був дуже задоволений цим. Ви можете написати досить прості тести дуже швидко, або ви можете написати складні тести, які потребують ініціалізації даних тощо. Він також пропонує (як я впевнений, що багато інших) способи легко порівняти з плаваючою точкою, а не по побиттю.


Приємна річ у googletest полягає в тому, що вони дозволяють легко включити його вихідний код у додаток, тому вам не потрібно робити це залежністю.
Джефф Оксберрі

4

Якщо ви будуєте свій код за допомогою CMake, то очевидним вибором буде механізм ctest . Це дозволяє протестувати свій код вручну за допомогою команди ctest, а також підтримує широке нічне тестування через CDash .


1

Для нашої бібліотеки з обчислювальної біології C ++ ( Chaste ) ми використовуємо http://cxxtest.com/ . Це досить простий у використанні, працює добре, він надає кілька макросів для тестування із assert()заявами стилів. Для наукових обчислень це, як правило, прості прямі порівняння з TS_ASSERT_EQUALS(a,b)чисельними порівняннями TS_ASSERT_DELTA(a,b,tolerance).

Додаткові макроси можна легко записати за допомогою цих основних для порівняння власних векторів / матриць на вибір. Корисно також можна перевірити, що ваш код видає відповідні попередження та повідомлення про помилки в певних ситуаціях. Ви можете переглянути деякі приклади в testпапках нашого вихідного коду тут: https://chaste.cs.ox.ac.uk/trac/browser/trunk

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.