Параметры командной строки UnitTest ++ - PullRequest
0 голосов
/ 30 июня 2011

Я хочу использовать аргумент командной строки в одном из моих тестов. Я не смог найти ни одного примера в Интернете.

TEST(SomeTest)
{
    std::string file("this is some command line argument");
    CHECK(something);
}

int main(int argc, char** argv)
{
    return UnitTest::RunAllTests();
}

Есть идеи?

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Я думаю, что вы ищете возможность указать "вход теста", не делая новый тест для каждого.

Допустим, у вас есть 3 набора тестовых данных, для которых вы хотите запустить свою тестовую процедуру.Вы просто хотите запустить

./unittest_build SomeTest file1
./unittest_build SomeTest file2
./unittest_build SomeTest file3

, не запуская тесты в тестовую сборку.

Но вы также можете просто сделать это:

void runCheck(const std::string& filename) {
    std::string file(filename);
    // well, you're gonna do stuff here
    CHECK(something);
}

TEST(SomeTest)
{
    runCheck(std::string("your first testing datafile"));
    runCheck(std::string("your second testing datafile"));
    runCheck(std::string("your third testing datafile"));
    // this is what your test is. It tests these files. 
}

int main(int argc, char** argv)
{
    return UnitTest::RunAllTests();
}

Параметризация теста означает, что тест больше не является тестом.Теперь это функция, а не модульный тест.

0 голосов
/ 30 июня 2011

Ответ

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

Разъяснение

Представьте, что у вас есть модульный тест для аргумента конструктора std::string.

TEST(SomeTest)
{
    std::string file("this is some command line argument");
    CHECK(something);
}

Затем подключите его к main.

int main(int argc, char** argv)
{
    std::string file(argv[1]);

    // do stuff....

    return 0;
}

Поскольку с аргументом командной строки ничего не должно случиться, прежде чем он будет передан конструктору, вы уже эффективно протестировали его . Если, с другой стороны, ваш main - беспорядок, я бы предложил сначала сделать рефакторинг.

...