C программирование и TDD - PullRequest
29 голосов
/ 04 апреля 2010

Тестовая разработка ограничена OO? Или это возможно / полезно использовать в сочетании с процедурным языком? Я должен начать большой проект в C в ближайшие несколько недель, и я думаю о способах разработки.

Ответы [ 8 ]

39 голосов
/ 04 апреля 2010

TDD является парадигмой дизайна и поэтому не привязана к какой-либо конкретной парадигме программирования.

Проще говоря, вы пишете тест для своего кода, прежде чем писать свой код.

См. эту слайд-колоду о TDD с C (ката для игры в боулинг).

8 голосов
/ 04 апреля 2010

Разработка через тестирование означает, что вы разрабатываете код, сначала начиная с тестового шаблона, а затем наращивая функциональность, пока он не пройдет тест. Это в равной степени применимо к любой парадигме программирования: структурированной / процедурной, объектно-ориентированной, функциональной - все, что может принимать входные и выходные данные, может быть протестировано.

7 голосов
/ 19 июля 2013

Ознакомьтесь с книгой Джеймса Греннинга Разработка через тестирование для Embedded C . В нем он дает содержательные примеры того, как использовать две платформы TDD ( Unity и CppUTest ) для тестирования C.

6 голосов
/ 04 апреля 2010

Я не думаю, что TDD вообще ограничен OO.

Попробуйте фреймворки Unity & CMock.

пример из их вики:

void test_ShowSomeSillyExamples(void)
  {
    TEST_ASSERT_NOT_EQUAL(0, -1);
    TEST_ASSERT_EQUAL_INT(1, 1);
    TEST_ASSERT_EQUAL_HEX16(0x1234, 0x1234);
    TEST_ASSERT_EQUAL_STRING("These Are The Same", "These Are The Same");
    TEST_ASSERT_BITS(0x1111, 0x5555, 0x7175);
    TEST_ASSERT_INT_WITHIN(5, 100, 102);
  }

см .: http://sourceforge.net/apps/trac/embunity/wiki

Книга:

http://www.pragprog.com/titles/jgade/test-driven-development-for-embedded-c

Группа Yahoo об этом материале:

http://tech.groups.yahoo.com/group/AgileEmbedded/

Если бы вы делали TDD на C, вам нужно было бы писать свои тесты на C? Я бы, вероятно, написал рабочий код на C и тесты на C ++, используя gtest от Google.

5 голосов
/ 04 апреля 2010

Как уже отмечалось, TDD сам по себе не привязан к ООП. Однако на практике это связано с модульностью. Каждый юнит-тест должен тестировать только очень ограниченную часть программы, поэтому, если у вас много общего состояния, вам будет практически невозможно выполнить юнит-тестирование программы.

Определенно можно писать модульные программы на C, но это требует разных техник. TDD может вынудить вас написать модульную программу, но это также может остановить разработку, если вы не привыкли писать модульные C-программы.

3 голосов
/ 04 апреля 2010

TDD определяется Википедией следующим образом:

Разработка через тестирование (TDD) методика разработки программного обеспечения, которая опирается на повторение очень короткий цикл разработки: сначала разработчик пишет сбой автоматизированный тестовый пример, который определяет желаемый улучшение или новая функция, то производит код для прохождения этого теста и наконец, рефакторинг нового кода приемлемые стандарты.

Здесь нет абсолютно ничего такого, что делает его специфичным для ООП. Наоборот, TDD вполне подходит для всех видов программирования. В частности, определенно возможно использовать его в сочетании с процедурным языком, включая C.

1 голос
/ 04 апреля 2010

TDD означает, что вы используете модульное тестирование до того, как напишите код (Test First) и будете руководствоваться дизайном, который, конечно, подходит для C, но я представляю две проблемы, с которыми вы столкнетесь (я не пробовал)

  • Медленная компиляция, если это большой проект, TDD требует маленьких шагов в разработке и частом запуске кода, C / C ++ гораздо медленнее при компиляции, чем C #, Java и т. Д. И, конечно, даже медленнее, чем динамические языки:).

  • Тестирование изолированно, Поддельные подсистемы, поэтому вы тестируете каждую из них изолированно (потому что вы используете TDD, поэтому у вас будут системы, которые еще не внедрены, но у вас есть зависимость от них или вы не хотите, чтобы ваши тесты быть зараженным внешними эффекторами, такими как FileSystem, Sockets и т. д.), и, конечно, это зависит также от масштаба приложения и вашего дизайна, я не знаю, каковы стратегии, чтобы сделать это, я представляю прохождение указателей на функции ( Таким образом, вы передаете указатель на поддельную функцию в тестируемую функцию), но вы должны исследовать это.

Спасибо

1 голос
/ 04 апреля 2010

Есть рамки модульного тестирования для c. Поиск в Google для «c unit test» покажет некоторые. Я написал несколько проектов на C с TDD и определенно TDD не только для ОО-языков. Даже если это труднее сделать TDD в C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...