- Це питання не стосується фреймворків тестування блоків.
- Це питання не стосується написання модульних тестів.
- Це питання стосується того, куди слід поставити написаний код UT та як / коли / де його скласти та запустити.
В роботі ефективно з успадкованим кодом , Майкл Пір'я стверджує , що
хороші одиничні тести ... бігайте швидко
і це
Тест на одиницю, який займає 1/10 секунди, - це повільний одиничний тест.
Я думаю, що ці визначення мають сенс. Я також думаю, що вони означають, що ви повинні зберігати набір тестів для одиниць і набір тих тестів коду, які триватимуть довше окремо, але я думаю, що це ціна, яку ви платите лише за те, щоб викликати щось тестовий блок, якщо він працює (дуже) швидко .
Очевидно , що проблема в C ++ є те , що для «запуску» ваш модульний тест ( и ), ви повинні:
- Відредагуйте свій код (виробничий або одиничний тест, залежно від того, в якому "циклі" ви перебуваєте)
- Складіть
- Посилання
- Виконання ( ів ) запуску блоку
Редагувати (після дивного закритого голосування) : Перш ніж розібратися в деталях, я спробую підсумувати тут пункт:
Як можна ефективно організувати код тестування модулів C ++, щоб він був ефективним для редагування (тестового) коду та для запуску тестового коду?
Перша , то проблема, щоб вирішити , де поставити код тесту блоку таким чином , щоб:
- це "природно" редагувати та переглядати його в поєднанні з відповідним виробничим кодом.
- легко / швидко розпочати цикл компіляції для одиниці, що змінюється в даний час
Друга тоді, пов'язана, проблема в тому , що для компіляції , так що зворотний зв'язок миттєво.
Екстремальні варіанти:
- Кожен Unit-Test-Test-Unit живе в окремому файлі cpp, і цей файл cpp компілюється + пов'язується окремо (разом із файлом блоку вихідного коду, який він тестує), до одного виконуваного файлу, який потім виконує цей єдиний Unit Test.
- (+) Це мінімізує час запуску (компіляція + посилання!) Для одного тестового блоку.
- (+) Тест працює дуже швидко, тому що він тестує лише одну одиницю.
- (-) Виконання всього набору потрібно запустити мільярд процесів. Може бути проблемою управління.
- (-) Частота запуску процесу стане видимою
- Інша сторона повинна мати - все-таки - один cpp-файл на тест, але всі тестові файли cpp (разом з кодом, який вони перевіряють!) Пов'язані в один виконуваний файл (на модуль / на проект / вибір на ваш вибір).
- (+) Час компіляції все-таки буде добре, оскільки буде зібраний лише змінений код.
- (+) Виконати весь набір легко, оскільки для запуску достатньо лише однієї програми.
- (-) Набір посилань потребуватиме віків, оскільки кожна перекомпіляція будь-якого об'єкта призведе до повторного посилання.
- (-) (?) Пробіг триватиме більше часу, хоча якщо всі тести одиниці швидкі, час повинен бути нормальним.
Отже, як обробляються тести одиниць С ++ ? Якщо я виконую лише цей матеріал щовечора / щогодини, друга частина насправді не має значення, але перша частина, а саме як "з'єднати" код UT з виробничим кодом, щоб розробникам було "природно" тримати і те, і інше фокус завжди має значення, я думаю. (Якщо розробники мають фокус коду UT, вони захочуть запустити його, що поверне нас до другої частини.)
Історії та досвід реального світу високо оцінені!
Примітки:
- Це питання навмисно залишає не визначену систему платформи та make / project.
- Питання з тегами UT & C ++ - це чудове місце для початку, але, на жаль, занадто багато питань, а особливо відповідей, занадто сильно зосереджені на деталях або конкретних рамках.
- Деякий час тому я відповів на подібне запитання щодо структури для підсилювальних одиниць тестів. Я вважаю, що цієї структури не вистачає для "справжніх", швидких тестових одиниць. І я вважаю інше питання занадто вузьким, звідси це нове запитання.
:-(
Де ви гадаєте шукати відповіді на такі запитання, якщо ні на цьому форумі?
Pipeline<A,B>.connect(Pipeline<B,C>)
а компілювати, тоді як Pipeline<A,B>.connect(Pipeline<C,D>)
не повинен компілювати: Тип виходу першого етапу несумісний з типом вводу другого етапу.