Тестування блоку на код C ++ - Інструменти та методологія [закрито]


134

Я працюю над великою системою c ++, яка розробляється вже кілька років. У рамках зусиль, спрямованих на поліпшення якості існуючого коду, ми взяли участь у великому довгостроковому проекті рефакторингу.

Чи знаєте ви хороший інструмент, який може допомогти мені написати одиничні тести на C ++? Може щось схоже на Джуніт чи Нуніт?

Чи може хто-небудь дати добру пораду щодо методології написання одиничних тестів для модулів, написаних без одиничного тестування?


1
Ознайомтесь із цим запитанням: stackoverflow.com/questions/3150/…
Aardvark

Відповіді:


83

Застосування одиничних тестів до застарілого коду було саме причиною того, що було ефективно працювати з попереднім кодом . Майкл Пірс є автором - як згадується в інших відповідях, він брав участь у створенні як CppUnit, так і CppUnitLite .

alt текст


4
Додано мініатюру - проголосували. Книга допомагає більше, ніж будь-який інструмент.
Гішу

2
Я думаю, що CPPUnit може спростити писати тести. Ми використовуємо CPPUnit, але я не задоволений. Мені потрібно оновити два файли для кожного тесту, і, на мій погляд, тест повинен бути таким же простим, щоб написати: 'TEST ("ім'я тесту") {ASSERT (1 == 1);}' Книга з іншого боку є обов'язковий для всіх, не тільки тих, хто працює зі спадковим кодом, але і для тих, хто його створює;)
daramarak

9
З якого часу спадщина c ++ ?!
Нільс

9
Це не те, що C ++ є спадщиною - якщо я правильно пам'ятаю, ця книга визначає спадковий проект як проект, для якого не існує жодного або дуже мало тестових одиниць. Такі проекти, як правило, / важкі / для запису одиничних тестів, оскільки тестова розробка ніколи не впливала на кодову базу, так що їх тривіально писати.
Арафангіон

7
@Nils: Як згадує один із рецензентів книги Amazon, "застарілий код - це код без одиничних тестів", саме про це і йдеться у цьому питанні.
Девід Джонстоун

40

Нещодавно компанія Google випустила власну бібліотеку для тестування одиниць програм C ++, що називається Google Test.

Проект на Google Code


1
чи можна використовувати це за допомогою VC ++
yesraaj

Здається, цілком нормально, особливо так, як вони повинні додавати опис до кожного твердження. З нижньої сторони я особисто віддаю перевагу класу Unit Test замість макросів, які насправді не схожі на класи.
Wernight

3
Ще один приємний момент - глузуючі можливості: code.google.com/p/googlemock
Філіпп,

Мені здається, це набагато приємніше CPPUNIT, який вимагає тонни макросів і чарівних файлів, щоб тести працювали
Паульм

30

Перевірте відмінне порівняння декількох доступних номерів. Автор цієї статті пізніше розробив UnitTest ++ .

Що мені особливо подобається в цьому (окрім того, що він добре обробляє винятки тощо), це те, що навколо тестових випадків та визначення тестових приладів існує дуже обмежена кількість «адміністрації».


2
Хіба це не наша основна помилка? Він добре розуміє наявні проекти, але замість того, щоб вдосконалювати їх, він починає своє.
peterchen

@peterchen: так; але тоді UnitTest ++ настільки маленький і легкий, що він має значення, коли він є окремим проектом - дуже легко встати і працювати.
TimStaley

24

Boost має бібліотеку тестування, яка містить підтримку модульного тестування. Можливо, варто перевірити.


4
Я можу порекомендувати цей чудовий набір інструментів.
Роб

1
Так, стимул - це шлях. Ніяких накладних витрат, просто тестуйте і йдіть! Я насправді працював над власними рамками у відчаї, коли посилення прийшло мені на допомогу. Дякую за прискорення (за все!)
daramarak

Ви можете ознайомитися зі статтею, яку я написав вступ Тестування підсилювального
Wernight

21

Ноель Льопис Ігор Зсередини є автором вивчення дослідницьких джунглів фреймворку C ++ , всебічного (але вже датованого) оцінювання різних рамок тестування модулів C ++, а також книги про програмування ігор.

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

Я використовував домашні рішення, CxxTest (для якого потрібен Perl), і boost :: test. Коли я впровадив тут тестування одиниць на своїй теперішній роботі, він значною мірою зводився до UnitTest ++ vs boost :: test.

Мені дуже подобається більшість збільшених бібліотек, які я використовував, але IMHO, boost :: test трохи надто важкі. Особливо мені не сподобалося, що це вимагає від вас (AFAIK) впровадити основну програму тестового ременя за допомогою boost :: test macro. Я знаю, що це не "чистий" TDD, але іноді нам потрібен спосіб запустити тести за допомогою програми GUI, наприклад, коли в командному рядку передано спеціальний тестовий прапор, а boost :: test не може підтримувати цей тип сценарію.

UnitTest ++ була найпростішою тестовою основою для налаштування та використання, з якою я стикався в своєму (обмеженому) досвіді.


17

Я використовую відмінний Boost.Test бібліотеку у поєднанні з набагато менш відомою, але черепахою бібліотекою : макет об'єктної бібліотеки на основі прискорення.

Оскільки приклад коду говорить краще, ніж слова, уявіть, що ви хочете перевірити calculatorоб'єкт, який працює на viewінтерфейсі (тобто вступний приклад Черепахи):

// declares a 'mock_view' class implementing 'view'
MOCK_BASE_CLASS( mock_view, view )
{
    // implements the 'display' method from 'view' (taking 1 argument)
    MOCK_METHOD( display, 1 )                   
};

BOOST_AUTO_TEST_CASE( zero_plus_zero_is_zero )
{
    mock_view v;
    calculator c( v );

    // expects the 'display' method to be called once with a parameter value equal to 0
    MOCK_EXPECT( v, display ).once().with( 0 ); 

    c.add( 0, 0 );
}

Подивіться, як легко і багатослівно заявити очікування на макетний об’єкт? Очевидно, тест не виконаний, якщо очікування не виправдаються.


14

Я щойно висунув свій власний фреймворк, CATCH . Він ще розробляється, але я вважаю, що він вже перевершує більшість інших рамок. У різних людей є різні критерії, але я намагався охопити більшу частину землі без занадто багато компромісів. Погляньте на мій запис в блозі для дегустатора. Мої п’ять найкращих особливостей:

  • Тільки заголовка
  • Автоматична реєстрація тестів на основі функцій та методів
  • Розкладає стандартні вирази C ++ на LHS та RHS (тому вам не потрібно ціле сімейство макросів затвердження).
  • Підтримка вкладених секцій в межах функціонального пристосування
  • Створюються тести імен з використанням природних мов - назви функцій / методів

Він також має прив'язки Objective-C.


4
doctest - це моє повторне здійснення Catch з величезним фокусом на швидкості компіляції
перевірте




6

Зараз я шукаю блок тестування та макет-фреймворку, який можна використовувати в нашій компанії для довготривалої бази коду. Як відомо, ви знайдете перелік одиничних рамок тестування для c ++ довгий, тому я застосував деякі фільтри, щоб зменшити його до повної руки, на яку можна ознайомитися уважніше. Першим критерієм фільтра було те, що він повинен бути безкоштовним. Другим критерієм була проектна діяльність. Я також шукав глузуючі рамки, тому що вам потрібен, якщо ви хочете написати одиничні тести.

Я придумав такий список (приблизно), відсортований за діяльністю, найвища активність вгорі:

  • GoogleTest / GoogleMock: багато учасників та використовується самим Google. Можливо, це буде деякий час тут і отримувати оновлення. Що стосується моєї приватної бази кодів, я перейду до цього поєднання, сподіваючись стрибнути на найшвидший потяг.

  • BoostTest + Turtle: Не оновлюється так часто, але тестова рамка є частиною прискорення, тому її слід підтримувати. Черепаху з іншого боку підтримує в основному один хлопець, але він обурюється активністю, тому він не мертвий. Я майже весь свій досвід тестування використовував у цій комбінації, тому що ми вже використовували бібліотеку підвищення у своїй попередній роботі, і зараз я використовую її для свого приватного коду.

  • CppUTest: забезпечує тестування та глузування. Цей проект був активним з 2008 по 2015 рік і має досить багато активності останнім часом. Ця знахідка була трохи несподіваною, оскільки багато проектів із значно меншою активністю виникають частіше під час пошуку в Інтернеті (наприклад, CppUnit, який мав останнє оновлення у 2013 році). Я не заглиблювався в це, тому нічого не можу сказати про деталі. Редагувати (16.12.2015): нещодавно я спробував це, і виявив, що цей фреймворк є трохи незграбним та "стильним", особливо під час використання макет-класів. Крім того, здавалося, є менша різноманітність тверджень, ніж інші рамки. Я думаю, що його основна сила полягає в тому, що його можна використовувати з чистими проектами С.

  • QTest: Тестова бібліотека, яка постачається з рамкою Qt. Технічне обслуговування повинно бути гарантоване на деякий час, але я використовую його швидше як підтримуючу бібліотеку, оскільки тестова реєстрація IMO є більш незграбною, ніж в інших рамках. Наскільки я розумію, це змушує вас мати один тест-exe за тестовий прилад. Але функції тестових помічників можуть бути корисними при тестуванні коду Qt-Gui. Він не має глузувань.

  • Ловля: Він має недавню активність, але в основному розробляється одним хлопцем. Приємно в цій рамці - альтернативний підхід кріплення, який дозволяє писати код кріплення для багаторазового використання в самому тесті. Це також дозволяє встановити імена тестів як рядки, що приємно, коли ви схильні писати цілі речення як тестові імена. Я б хотів, щоб цей стиль був зірваний і введений у googleTest ;-)

Макетні рамки

Кількість макетних фреймворків набагато менша, ніж кількість тестових фреймворків, але ось ті, за якими я виявив свою недавню активність.

  • Hippomock : Активний з 2008 р. Зараз, але лише з низькою інтенсивністю.

  • FakeIt : Активний з 2013 року зараз, але більш-менш розвинений одним хлопцем.

Висновок

Якщо ваша база коду працює в довгостроковій перспективі, вибирайте між BoostTest + Turtle і GoogleTest + GoogleMock . Я думаю, що ці двоє матимуть довготривале обслуговування. Якщо у вас є лише короткочасна база коду, ви можете спробувати Catch, який має хороший синтаксис. Тоді вам потрібно буде додатково вибрати глузливий каркас. Якщо ви працюєте з Visual Studio, ви можете завантажити адаптери тест-бігуна для BoostTest і GoogleTest, що дозволить вам запускати тести з інтерфейсом інтерфейсу тестового бігу, який інтегрований у VS.


3

Дивіться також відповіді на тісно пов'язане питання "вибір інструменту / рамки для тестування одиниць c ++" тут


3

Також є TUT , Template-Unit-Test, рамка на основі шаблонів. Його синтаксис незручний (деякі називають це зловживанням шаблонами), але його головна перевага полягає в тому, що він міститься в одному файлі заголовка .

Ви знайдете приклад одиничного тесту, написаного TUT тут.


2
Я розмістив бібліотеку, що містить лише заголовок, що забезпечує функцію забезпечення макросів, що обгортає функцію забезпечення TUT, і тестовий код декларування, щоб спростити її та надати інформацію про номер файлу та рядка у разі відмов. Ось посилання на публікацію із прикладами різниці у виході та коді, а також посилання на проект на github: codecrafter.wordpress.com/2012/12/19/tutadapter1
Джош Хайцман

2

Я спробував CPPunit, і це не дуже зручно для користувачів.

Єдиною мені відомою альтернативою є використання C ++. NET для обгортання класів C ++ та тестування блоку з використанням однієї з фреймворків тестування .NET-одиниць (NUnit, MBUnit тощо)



1

Майкл Пір'я з ObjectMentor відіграв важливу роль у розвитку як CppUnit, так і CppUnitLite.

Зараз він рекомендує CppUnitLite



1

Погляньте на cfix ( http://www.cfix-testing.org ), він спеціалізується на розробці Windows C / C ++ і підтримує тестування як режиму користувача, так і тестування блоку ядра.


Дякую, що поділились. Нещодавно я почав використовувати cfix для тестування. Я шукав спосіб переглянути стек викликів як у випадку пройдених, так і невдалих тестових випадків. Чи є спосіб у cfix досягти цього?
пробуючиToLearn

1

Якщо ви переглядаєте Visual Studio 2008 SP1, я б дуже рекомендував використовувати MSTest для написання одиничних тестів. Потім я використовую макет Google для написання макетів. Інтеграція з IDE є ідеальною і дозволяє і не несе накладних витрат CPPunit з точки зору редагування трьох місць для додавання одного тесту.


1

Я думаю, що VisualAssert робить велику роботу в інтеграції VS. Це дозволяє запускати і налагоджувати тести з VS, і вам не потрібно створювати виконуваний файл, щоб запустити тести.


0

Перевірте фруктозу: http://sourceforge.net/projects/fructose/

Це дуже простий фреймворк, що містить лише файли заголовків і, таким чином, легко переноситься.


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