Модульный тест в C ++ Как получить доступ к моему результату в исходном коде, который только что показал printf [closed]

0

Я пишу unit тест в C++. Мои конечные результаты в исходном коде, предназначенном для показа

printf("%d\n", ResultA);

и нет возврата ResultA.

Я должен упомянуть, что ResultA просто приходит после сравнения 3 значений, поэтому у меня нет функции, возвращающей результат ResultA. Что-то вроде этого:

if a<b  --> ResultA= 1
if a>b  --> ResultA= 2

Интересно, как в моем модульном тесте я могу получить доступ к ResultA? потому что мне нужно иметь это значение и посмотреть, правильно ли оно указано.

  • 1
    Понятия не имею, что вы спрашиваете. Вы получаете доступ к значению, чтобы передать его в printf и выполнить сравнение. Так в чем проблема?
  • 0
    В модульном тесте мне нужно получить доступ к этому значению, но в моем коде я не возвращаю значение. Есть ли способ получить доступ к ResultA через printf в модульном тесте?
Показать ещё 2 комментария
Теги:
unit-testing

2 ответа

1

Вы создаете функцию, которая производит значение и записывает для него единичный тест.

int MakeResultA()
{
    return 5;
}

void SomeFunction()
{
    int resultA = MakeResultA();
    printf("%d\n", resultA);
}

BOOST_AUTO_TEST_CASE(MakeResultA)
{
    BOOST_CHECK_EQUAL(MakeResultA, 5);
}
0

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

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

Например, если код, который вы хотите проверить, выглядит следующим образом:

//code_to_test.cpp
#include <cstdio>

void myFunction() {
        printf("The result is: %d\n", 42);
}

то пример тестового жгута может выглядеть так:

// main.cpp
#include <iostream>
#include <cstdarg>

using namespace std;

void myFunction();

int captured;

int printf(const char *format, ...) {
        va_list ap;

        va_start(ap, format);
        captured = va_arg(ap, int);
        va_end(ap);

        cout << "Captured :" << captured << endl;

        return 1;
}


int main() {
        myFunction();
        return 0;
}

Скомпилируйте следующим образом:

g++ -c code_to_test.cpp
g++ main.cpp code_to_test.o

Вы получите следующее:

$ ./a.out
Captured :42

Он работает, потому что компоновщик видит, что есть функция printf, определенная в тестовом жгуте, и использует это вместо того, что находится в стандартной библиотеке C.

Излишне говорить, что этот подход чреват опасностями. Вам нужно обслуживать все комбинации аргументов, которые могут вызвать все вызовы printf в тестируемом коде, и, конечно же, вы не можете использовать printf где-нибудь, чтобы что-то распечатать.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню