Как был бы Вы unittest средство выделения памяти?

Иногда это код, а не XML

Следующий код,

Document doc = dBuilder.parse(new InputSource(new StringReader("file.xml")));

также приведет к этой ошибке,

[ Fatal Error]: 1: 1: Содержимое не разрешено в proog.org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Содержимое не разрешено в прологе.

, потому что он пытается проанализировать строковый литерал, "file.xml" (а не содержимое файла file.xml) и не работает, потому что "file.xml" в виде строки не является корректным XML.

Fix: Remove StringReader():

Document doc = dBuilder.parse(new InputSource("file.xml"));

Точно так же грязные проблемы с буфером могут оставить остаточный мусор перед фактическим XML. Если вы тщательно проверили свой XML и все еще получаете эту ошибку, запишите точное содержимое, передаваемое парсеру; иногда то, что на самом деле происходит (пытается быть), является неожиданным.

7
задан zvrba 23 September 2008 в 06:36
поделиться

7 ответов

Очень тестируемый код имеет тенденцию быть структурированным по-другому, чем другой код.

Вы описываете несколько задач, которые Вы хотите, чтобы средство выделения сделало:

  • объединение свободных блоков
  • многократное использование свободных блоков на следующих выделениях
  • возврат избыточной свободной памяти к системе
  • утверждение, что политику выделения (например, первое соответствие) действительно уважают

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

Затем, я сказал бы, то, что в причине автоматизированное тестирование любого вида не лучше, чем никакое автоматизированное тестирование. Я определенно сфокусировался бы больше на проверке, что Ваши тесты делают что-то полезное, чем волнение при надлежащем использовании насмешек удостоверились ли Вы, что оно правильно изолируется и является ли это истинным модульным тестом. Это - все замечательные цели, которые, надо надеяться, сделают 99% тестов лучше. С другой стороны, используйте здравый смысл и Вашу лучшую техническую оценку, чтобы сделать задание.

Без примеров кода я не думаю, что могу быть более конкретным.

11
ответ дан 6 December 2019 в 07:30
поделиться

Если существует какая-либо логика там, она может быть протестирована на единицу.
Если Ваша логика включает принимающие решения и вызов API ОС/аппаратных средств/системы, фальшивка/насмешка зависимые от устройств вызовы и модульный тест Ваша логика, чтобы проверить, приняты ли правильные решения под данным набором предварительных условий. Следуйте за триадой Arrange-Act-Assert в своем модульном тесте.
Утверждения не являются никакой заменой для автоматизированных модульных тестов. Они не говорят Вам, которых привел к сбою сценарий, они не обеспечивают обратную связь во время разработки, они не могут использоваться, чтобы доказать, что все спецификации встречаются кодом среди прочего.

Ненеопределенное Обновление: Я не знаю точных вызовов метода.. Я думаю, что 'прокручу свое собственное' Скажем, Ваш код исследует существующие условия, принимает решение, и выполните вызовы к ОС как требуется. Позволяет говорят, что Ваши вызовы ОС (у Вас может быть намного больше):

void* AllocateMemory(int size); 
bool FreeMemory(void* handle);
int MemoryAvailable();

Сначала превратите это в интерфейс, I_OS_MemoryFacade. Создайте реализацию этого интерфейса для совершения фактических вызовов к ОС. Теперь заставьте свой код использовать этот интерфейс - Вы теперь отделили свой код/логику от устройства/ОС. Затем в Вашем модульном тесте, Вы используете ложную платформу (ее цель состоит в том, чтобы дать Вам ложную реализацию указанного интерфейса. Можно затем сказать ложную платформу, которые ожидают, что эти вызовы будут сделаны, с этими параметрическими усилителями и возвратят это, когда они будут сделаны. В конце теста можно попросить, чтобы ложная платформа проверила, были ли все надежды оправданы. (например, В этом тесте, AllocateMemory нужно назвать трижды с 10, 30, 50 как параметрические усилители, сопровождаемые 3 вызовами FreeMemory. Проверьте, возвращает ли MemoryAvailable начальное значение.)
Так как Ваш код зависит от интерфейса, он не знает различия между реальной реализацией и поддельной/ложной реализацией, которую Вы используете для тестирования. Google 'дразнит платформы' для получения дополнительной информации об этом.

10
ответ дан 6 December 2019 в 07:30
поделиться

Обе вещи имеют свое место. Используйте модульные тесты, чтобы проверить, что интерфейсы ведут себя как ожидалось и утверждения, чтобы проверить, что контракт уважают.

1
ответ дан 6 December 2019 в 07:30
поделиться

Можно также хотеть включать тестирование производительности, стресс-тестирование и т.д. Они не были бы модульными тестами, потому что это протестирует всю вещь, но они очень ценны в случае средства выделения памяти.

Поблочное тестирование не исключает эти виды тестов. Лучше иметь их обоих.

1
ответ дан 6 December 2019 в 07:30
поделиться

Лично я нахожу большинство модульных тестов как чужое требование, а не мои. Я думаю, что любой модульный тест должен быть записан точно так же, как нормальная программа кроме того, что он ничего не делает кроме тестирования библиотеки/алгоритма или любой части кода.

Мои модульные тесты обычно не используют инструменты как Кунит, CppUnit и подобное программное обеспечение. Я создаю свои собственные тесты. Например, недавно я должен был протестировать новую реализацию контейнера в обычных случаях для утечек памяти. Модульный тест не был достаточно полезен для обеспечения хорошего теста. Вместо этого я создал свое собственное средство выделения и заставил ему не удаться выделить память после определенного (корректируемого) количества выделений, чтобы видеть, имеет ли мое приложение утечки памяти в них, случаются (и оно имело :)).

Как это может быть сделано модульным тестом? С большим усилием заставить Ваш код вписаться в модульный тест "шаблон".

Таким образом, я настоятельно рекомендую не использовать модульный тест каждый раз просто, потому что это "модно", но только когда действительно легко интегрировать их с кодом, Вам нравится тестировать.

0
ответ дан 6 December 2019 в 07:30
поделиться

Я также думаю, что юнит-тесты переоценены. Они имеют свою полезность, но что действительно повышает качество программы, так это ее обзор. С другой стороны, мне действительно нравятся утверждения, но они не заменяют модульное тестирование.

Я не говорю о рецензировании, а просто перечитываю то, что вы написали, возможно, проходя через него с помощью отладчика и проверка того, что каждая строка выполняет то, что должна делать, будет соответствовать качеству программного обеспечения Sky Rocket.

Я бы порекомендовал модульные тесты «высокого уровня», которые проверяют функциональность, а не крошечный вызов метода. Последние, как правило, делают любое изменение кода чрезвычайно болезненным и дорогостоящим.

1
ответ дан 6 December 2019 в 07:30
поделиться

Модульное тестирование - это не только проверка работоспособности вашего кода. Это также очень хорошая методология проектирования. Чтобы тесты были полезными, как упоминалось ранее, код должен быть как можно более изолированным, например, использовать интерфейсы там, где это необходимо.

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

Просто помните, что модульное тестирование - это , а не интеграционное тестирование. У модульного тестирования есть свои ограничения, но в целом я думаю, что это очень хороший инструмент, который нужно знать, как правильно использовать.

0
ответ дан 6 December 2019 в 07:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: