2017-01-11 2 views
1

Мне нужно изменить ранее написанный код на C++, а для программы - некоторые аргументы командной строки. Другие люди будут делать обзор и будет испытывать этот код, чтобы облегчить их, я написал это ...Назначение argv для целей тестирования

int main (int argc, char *argv[]) 
{ 
    // To do testing just uncomment the below line. 
#define TESTING 
#ifdef TESTING 
    argc = ARGUMENT_COUNT; 
    argv[1] = new char[strlen(INPUT_FILE) + 1 ]; 
    strcpy(argv[1], INPUT_FILE); 
    argv[2] = new char[strlen(MERGE_FILE) + 1 ]; 
    strcpy(argv[2], MERGE_FILE); 
    . 
    . 
    . 
#endif 

Мой вопрос: есть ли другой лучший способ справиться с этим типом тестирования, где командная строка и одна и та же переменная argv используется везде.

Примечание: У меня нет поддержки IDE. Я использую редактор vi на удаленном сервере.

+1

Обычно вы можете предоставить аргументы через вашу среду IDE. –

+1

Создать скрипт, который запускает вашу программу с указанными аргументами? –

+0

Нет IDE ... Я вхожу на удаленный сервер, чтобы делать кодирование. И я должен проверить только там. – NJMR

ответ

0

Стандарт C++ делает позволяет вам изменять argc и argv. Не забудьте выпустить память, которую вы выделили, с new[].

Но лучшей альтернативой было бы передавать аргументы через вашу IDE или через сценарий запуска, а не взламывать код таким образом.

Обратите внимание, что поведение вызова main от себя (даже косвенно, т.е. с помощью другой функции) в C не определено ++. Поэтому не создавайте такое решение.

Для тестирования я использую набор, доступный в Boost. См. Www.boost.org.

+0

Нет сторонних lib для целей безопасности ... :-) – NJMR

+0

Ну, я уверен, что вам разрешено изменять аргумент argc ** даже ** по языковому стандарту. Ничто не мешает вам изменить значение входного аргумента. Содержимое блока памяти, на которое указывает «argv», - это действительно «неизменный». –

+0

«Ну, я уверен, что вам разрешено изменять аргумент argc даже по языковому стандарту». Да это верно. – Bathsheba

2

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

Таким образом, осуществление производства и испытания четко разделены, нет необходимости использовать хак, чтобы обеспечить тестовые данные по пр

0

Если ARGV может быть константной, вы можете создать новый argv и заменить происхождение одного как это.


int main (int argc, const char *argv[]) 
{ 
    // To do testing just uncomment the below line. 
#define TESTING 
#ifdef TESTING 
    const char* args[]={ 
     "arg 1","arg 2","arg 3",nullptr 
    }; 
    argc = sizeof(args)/sizeof(char*); 
    argv = args; 
#endif 
} 

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

0

Во-первых, я бы использовал тестовую структуру, но если бы я должен был опрокинуть собственное тестирование, я бы, вероятно, выделил аргументы командной строки. Создайте класс, который анализирует и удерживает аргументы. Используйте инъекцию зависимостей для отправки либо argv, либо ваши данные тестирования в конструктор.