2010-09-27 17 views
31

googletest ढांचे का उपयोग करते समय stdout और stderr को कैप्चर करना संभव है?googletest के साथ stdout/stderr कैप्चर कैसे करें?

उदाहरण के लिए, मैं एक फ़ंक्शन को कॉल करना चाहता हूं जो कंसोल (stderr) में त्रुटियां लिखता है। अब, परीक्षण में फ़ंक्शन को कॉल करते समय, मैं यह कहना चाहता हूं कि वहां कोई आउटपुट दिखाई नहीं देता है।

या, शायद मैं त्रुटि व्यवहार का परीक्षण करना चाहता हूं और यह कहना चाहता हूं कि एक निश्चित स्ट्रिंग मुद्रित हो जाती है जब मैं (जानबूझकर) त्रुटि उत्पन्न करता हूं।

+4

देखने के एक डिजाइन बिंदु से, मैं कार्यान्वयन को संशोधित करने का सुझाव देते हैं ताकि लॉग फ़ाइलें का उपयोग करने जा कम दर्द हो:

void func() { ... std::cout << "message"; ... } int main (int argc, char **argv) { ... func(); ... } 

इस किया है। 'ओस्ट्रीम' इंटरफ़ेस का उपयोग करना उदाहरण के लिए आसान बना देगा। –

उत्तर

24

आउटपुट परीक्षण करते समय मैंने कटिंग कॉल को स्ट्रिंगस्ट्रीम पर रीडायरेक्ट करने के लिए पहले इस स्निपेट का उपयोग किया है। उम्मीद है कि यह कुछ विचारों को चकित कर सकता है। मैंने पहले कभी 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 परीक्षण का उपयोग करें।

2

ऐसा करने से बचें हमेशा एक अच्छा डिजाइन विचार है। क्या तुम सच में यह निम्न कार्य करना चाहते हैं तो:

#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 उपयोग करने के लिए बदल दूसरा तर्क आप एक पाइप जोड़ी के बजाय इस्तेमाल कर सकते हैं एक फ़ाइल के माध्यम से जा रहा बिना पर कब्जा करने के लिए 2. होने की dup2 करने के लिए।

+4

बेशक यह डुप्ली के बिना सिस्टम के लिए पोर्टेबल नहीं है ... – Flexo

49

Googletest इस के लिए काम करता है प्रदान करता है:

testing::internal::CaptureStdout(); 
std::cout << "My test" 
std::string output = testing::internal::GetCapturedStdout(); 
+0

शायद सबसे आसान संभव समाधान –

+0

यह केवल 'stdout' के लिए उपलब्ध है, न कि 'stderr'? मौत परीक्षण हैं जो 'stderr' पर कब्जा करते हैं, लेकिन कई मामलों में आप प्रक्रिया समाप्त होने के लिए परीक्षण नहीं कर रहे हैं। – meowsqueak

+1

परीक्षण :: आंतरिक :: कैप्चरस्टेरर() भी मौजूद है। उदाहरण के लिए यहां उपयोग किया जाता है: https://googletest.googlecode.com/svn/trunk/test/gtest-death-test_test.cc – Heinzi

1

बजाय ऐसा करते हैं, std::cout के प्रत्यक्ष उपयोग दूर करने के लिए निर्भरता इंजेक्शन का उपयोग करें। अपने टेस्ट कोड में वास्तविक std::cout के बजाय मॉक ऑब्जेक्ट के रूप में कक्षा std:ostringstream की नकली वस्तु का उपयोग करें।

बजाय इस की:

void func(std::ostream &out) { 
    ... 
    out << "message"; 
    ... 
} 

int main(int argc, char **argv) { 
    ... 
    func(std::cout); 
    ... 
} 
संबंधित मुद्दे