64

googletestフレームワークを使用しているときにstdoutとstderrをキャプチャすることは可能ですか?

たとえば、コンソール(stderr)にエラーを書き込む関数を呼び出したいと思います。ここで、テストで関数を呼び出すときに、出力が表示されないことを表明したいと思います。

または、エラーの動作をテストし、(意図的に)エラーを生成したときに特定の文字列が出力されることを表明したい場合があります。

4

7 に答える 7

108

Googletest はこのための関数を提供しています:

testing::internal::CaptureStdout();
std::cout << "My test";
std::string output = testing::internal::GetCapturedStdout();
于 2015-10-17T11:41:57.910 に答える
37

出力をテストするときに cout 呼び出しを文字列ストリームにリダイレクトするために、以前にこのスニペットを使用しました。うまくいけば、それはいくつかのアイデアを刺激するかもしれません. 私は以前にgoogletestを使用したことがありません。

// This can be an ofstream as well or any other ostream
std::stringstream buffer;

// Save cout's buffer here
std::streambuf *sbuf = std::cout.rdbuf();

// Redirect cout to our stringstream buffer or any other ostream
std::cout.rdbuf(buffer.rdbuf());

// Use cout as usual
std::cout << "Hello World";

// When done redirect cout to its old self
std::cout.rdbuf(sbuf);

元の出力にリダイレクトする前に、Google テストを使用してバッファ内の出力を確認してください。

于 2010-10-28T14:23:11.747 に答える
7

これを行わなくても済むようにすることは、常に優れた設計上のアイデアです。本当にやりたい場合は、次のように機能します。

#include <cstdio>
#include <cassert>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>

int main() {
   int fd = open("my_file.log", O_WRONLY|O_CREAT|O_TRUNC, 0660);
   assert(fd >= 0);
   int ret = dup2(fd, 1);
   assert(ret >= 0);
   printf("This is stdout now!\n");
   std::cout << "This is C++ iostream cout now!" << std::endl;
   close(fd);
}

stdout の代わりに stderr を使用するには、dup2 の 2 番目の引数を 2 に変更します。ファイルを介さずにキャプチャするには、代わりにパイプ ペアを使用できます。

于 2010-10-27T09:56:22.417 に答える