Я пишу unit тест в C++. Мои конечные результаты в исходном коде, предназначенном для показа
printf("%d\n", ResultA);
и нет возврата ResultA
.
Я должен упомянуть, что ResultA
просто приходит после сравнения 3 значений, поэтому у меня нет функции, возвращающей результат ResultA
. Что-то вроде этого:
if a<b --> ResultA= 1
if a>b --> ResultA= 2
Интересно, как в моем модульном тесте я могу получить доступ к ResultA? потому что мне нужно иметь это значение и посмотреть, правильно ли оно указано.
Вы создаете функцию, которая производит значение и записывает для него единичный тест.
int MakeResultA()
{
return 5;
}
void SomeFunction()
{
int resultA = MakeResultA();
printf("%d\n", resultA);
}
BOOST_AUTO_TEST_CASE(MakeResultA)
{
BOOST_CHECK_EQUAL(MakeResultA, 5);
}
Если вы можете реорганизовать свой код, чтобы вы могли получить результат в качестве возвращаемого значения, как это было предложено доном, это, безусловно, лучшее решение. Ответ, который я здесь представляю, - это несколько неприятный взлом, и это не для слабонервных.
Можно определить собственную версию 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 где-нибудь, чтобы что-то распечатать.
Но если вы находитесь в очень плотном уголке, и, учитывая это только для единичного теста, а не для производственного кода, я думаю, это может вызвать у вас неприятности.
printf
и выполнить сравнение. Так в чем проблема?