2013-05-10 21 views
41

Tôi sử dụng Google C++ Testing Framework để kiểm tra đơn vị mã của tôi. Tôi sử dụng Eclipse CDT with C++ Unit testing module để phân tích đầu ra.Cách gửi thư tùy chỉnh trong Google C++ Testing Framework?

Trước đây tôi sử dụng CppUnit nó có macro gia đình CPPUNIT*_MESSAGE mà có thể được gọi là như thế này:

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE) 

Và cho phép gửi tin nhắn tùy chỉnh để kiểm tra đầu ra.

Có cách nào để bao gồm một số văn bản tùy chỉnh trong đầu ra thử nghiệm của google không?

(Tốt nhất cách mà có thể bao gồm thông điệp tới dữ liệu được đọc bởi các chương trình hiện có để kiểm tra đơn vị tự động sử dụng google thử nghiệm.)

Trả lời

75

Các macro gtest trả về một dòng cho outputting điệp chẩn đoán khi một thử nghiệm thất bại.

EXPECT_TRUE(false) << "diagnostic message"; 
+4

là tốt đẹp để bao gồm văn bản ngay cả khi thử nghiệm thành công .... –

+0

@ErikAronesty Bạn đã xem qua nguồn để xem liệu có cách nào dễ dàng để giao tiếp với dữ liệu đó không? –

37

Không có cách nào làm sạch nó trong phiên bản hiện tại của gtest. Tôi đã xem mã và đầu ra văn bản duy nhất (được bao bọc trong "Tin nhắn" gtest) được hiển thị nếu bạn thất bại một thử nghiệm.

Tuy nhiên, tại một số thời điểm, gtest bắt đầu printf 'vào màn hình và bạn có thể tận dụng mức trên để có được màu nền độc lập.

Đây là macro bị tấn công để thực hiện những gì bạn muốn. Điều này sử dụng màu văn bản nội bộ gtest. Tất nhiên không gian tên internal:: nên được tắt chuông cảnh báo, nhưng hey, nó hoạt động.

Cách sử dụng:

TEST(pa_acq,Foo) 
{ 
    // C style 
    PRINTF("Hello world \n"); 

    // or C++ style 

    TEST_COUT << "Hello world" << std::endl; 
} 

Output:

Example output

Code:

namespace testing 
{ 
namespace internal 
{ 
    enum GTestColor { 
     COLOR_DEFAULT, 
     COLOR_RED, 
     COLOR_GREEN, 
     COLOR_YELLOW 
    }; 

    extern void ColoredPrintf(GTestColor color, const char* fmt, ...); 
} 
} 
#define PRINTF(...) do { testing::internal::ColoredPrintf(testing::internal::COLOR_GREEN, "[   ] "); testing::internal::ColoredPrintf(testing::internal::COLOR_YELLOW, __VA_ARGS__); } while(0) 

// C++ stream interface 
class TestCout : public std::stringstream 
{ 
public: 
    ~TestCout() 
    { 
     PRINTF("%s",str().c_str()); 
    } 
}; 

#define TEST_COUT TestCout() 
+0

Cảm ơn, đây là giải pháp đúng, IMHO. Nhưng tôi có thể đề nghị thêm '\ n' vào PRINTF trong lớp không? đó là bởi vì chúng ta không thể nối các dòng với TEST_COUT như chúng ta làm với 'std :: cout', vì vậy nó vô dụng để cho phép người dùng thêm' \ n' của mình. Cảm ơn bạn anyway! – HappyCactus

2

Bạn nên xác định dưới đây:

static class LOGOUT { 
public: 
    LOGOUT() {} 
    std::ostream& info() { 
     std::cout << "[info  ] "; 
     return std::cout; 
    } 

} logout; 

sử dụng này:

logout.info() << "test: " << "log" << std::endl; 
0

Tham khảo câu trả lời Đánh dấu Lakata của, đây là cách của tôi:

Bước 1: tạo một tập tin tiêu đề, ví dụ: gtest_cout.h

Code:

#ifndef _GTEST_COUT_H_ 
#define _GTEST_COUT_H_ 

#include "gtest/gtest.h" 

namespace testing 
{ 
namespace internal 
{ 
enum GTestColor 
{ 
    COLOR_DEFAULT, COLOR_RED, COLOR_GREEN, COLOR_YELLOW 
}; 
extern void ColoredPrintf(GTestColor color, const char* fmt, ...); 
} 
} 

#define GOUT(STREAM) \ 
    do \ 
    { \ 
     std::stringstream ss; \ 
     ss << STREAM << std::endl; \ 
     testing::internal::ColoredPrintf(testing::internal::COLOR_GREEN, "[   ] "); \ 
     testing::internal::ColoredPrintf(testing::internal::COLOR_YELLOW, ss.str().c_str()); \ 
    } while (false); \ 

#endif /* _GTEST_COUT_H_ */ 

Bước 2: sử dụng GOUT trong gtest bạn

Cách sử dụng:

#include "gtest_cout.h" 

TEST(xxx, yyy) 
{ 
    GOUT("Hello world!"); 
} 
0

Có một khá đơn giản và hacky cách để làm việc đó (mà không cần lặn vào các lớp bên trong hoặc tạo lớp tùy chỉnh mới) .

Chỉ cần xác định một macro:

#define GTEST_COUT std::cerr << "[   ] [ INFO ]" 

và sử dụng GTEST_COUT (giống như cout) trong các thử nghiệm của bạn:

GTEST_COUT << "Hello World" << std::endl; 

Và bạn sẽ thấy kết quả như vậy:

enter image description here

Tín dụng chuyển đến @Martin Nowak cho phát hiện của mình.