2013-10-09 2 views
1

У меня проблема при тестировании моей программы. Проблема проста, но я не уверен, почему это не работает.Xcode C++ Модульное тестирование с глобальной переменной

1 -> я построить всю свою программу
2 -> я построить мой UnitTest
3 -> тест работает.

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

Мой вопрос: Неправильно ли построить исполняемый файл, а затем запустить тест на нем? Или мне нужно скомпилировать весь мой код + модульный тест в одно и то же время, а затем запустить его? Или это просто отсутствие рамки SenTesting?

Я забыл упомянуть, что это строковая константа C++. Не знаю, если это что-то изменит.

* EDIT ***

Мое предположение было неправильно, но я до сих пор не понимают магию за пределами! Кажется, C++ magic hoydi hoo?

char cstring[] = "***"; 
std::string cppString = "***"; 
NSString* nstring = @"***"; 

- (void)testSync{ 
    STAssertNotNil(nstring, nil); // fine 
    STAssertNotNil((id)strlen(bbb), nil); // fine 
    STAssertNotNil((id)cppString.size(), nil); // failed 
} 

EDIT 2 **

На самом деле это нормально, что C++ не инициализирован в этой части кода. Если я выполняю nm на моем исполняемом файле, кажется, что мои C и Obj-C global помещены в dataSegment. Я думал, что моя строка C++ была в одном и том же случае, но она фактически помещается в сегмент bss. Это означает, что он неинициализирован. Дело в том, что компилятор C++ выполняет некоторую магию, а строка C++ инициализируется после вызова main() и действует, как если бы она была в dataSegment.

Я не знал, что testSuit не имеет вызова main(), поэтому объект C++ никогда не инициализируется. Существует некоторая методика, чтобы вызвать .ctor перед тестом testSuit. Но я слишком ленив, тоже объясняю, и это какая-то тема. Я только что заменил мою строку C++ на простой массив символов, и он отлично работает, поскольку моя ценность теперь POD.

Кстати, в глобальной переменной нет дьявола, если они только для чтения. ;)

ответ

0

ОК, здесь я вижу несколько недостатков.

Прежде всего, этот код дает ошибки в моей среде (Xcode 5) и по уважительным причинам (с поддержкой ARC). Я не знаю, как вы собрали эту вещь. Причина в том, что вы производите целое число (или длинное) для объекта, и это приведет к множеству ошибок, так как обычно это недействительная операция. Итак, реальный вопрос заключается не в том, почему третий «утверждающий» потерпел неудачу, а почему второй удалось.

Что касается второй части вашего вопроса, я должен признать, что я не полностью понимаю ваш вопрос, и вам, возможно, придется объяснить это более подробно.

В целом, модульное тестирование тестирует определенные части вашего кода. Таким образом, вы, как правило, не выполняете тесты по фактическому окончательному исполняемому файлу (это, как мне кажется, не называется модульным тестированием), и вам не нужно одновременно компилировать «весь ваш код на C++ + ваши модульные тесты».

Поскольку вы используете Xcode, я дам вам некоторые указания.

  • Запишите свое приложение (или, по крайней мере, его часть) и найдите аспекты/функции/объекты, над которыми вы хотите выполнить модульные тесты.
  • В отдельных файлах записывайте модульные тесты, которые создают эти объекты и проверяют их методы, вызывают их и сравнивают входы и выходы.
  • У вас должна быть вторая цель в вашем приложении, которая будет компилировать только исходный код модуля и соответствующий основной программный код.
  • Создайте эту цель или нажмите command-U и сообщите об успехах и сбоях.

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

Надеюсь, я помог, даже не до конца понимая вторую часть Ваше сообщение.

+0

Hi csotiriou. Я наконец нашел своеобразное решение, я просто забыл закрыть тему. Ниже я отправил ответ, если кто-то попадает в ту же ловушку. –

Смежные вопросы