Параметры командной строки UnitTest++

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

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

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

Есть идеи?

2 ответа

Решение

Ответ

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

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

Скажем, у вас есть 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();
}

Параметризация теста означает, что тест уже не просто тест. Теперь это функция, а не юнит-тест.

Другие вопросы по тегам