Làm cách nào để gửi thông báo tùy chỉnh trong Khung thử nghiệm C ++ của Google?


81

Tôi sử dụng Khung kiểm tra C ++ của Google để kiểm tra đơn vị mã của mình. Tôi sử dụng Eclipse CDT với mô-đun kiểm tra Đơn vị C ++ để phân tích đầu ra.

Trước đây tôi đã sử dụng CppUnit, nó có họ macro CPPUNIT * _MESSAGE có thể được gọi 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 để đưa một số văn bản tùy chỉnh vào đầu ra thử nghiệm của google không?

(Tốt hơn là cách có thể bao gồm thông báo 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 bằng cách sử dụng kiểm tra google.)

Câu trả lời:


156

Các macro gtest trả về một luồng để xuất thông báo chẩn đoán khi kiểm tra không thành công.

EXPECT_TRUE(false) << "diagnostic message";

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

2
Nếu bạn cần in văn bản bất kể kết quả như thế nào, bạn chỉ cần ghi nó vào stdout. Nhưng điều này thường dẫn đến các thử nghiệm rất ồn ào, khó thực hiện.
Audrius Meskauskas,

FAIL () << "thông báo chẩn đoán"; hoạt động theo cách tương tự, nhưng nó làm giảm đầu ra được tạo ra một vài dòng vì nó không cho bạn biết về giá trị thực tế, giá trị kỳ vọng, v.v., nó thực hiện cho tất cả các macro EXPECT_X (). Chỉ trong trường hợp bạn muốn giảm độ dài đầu ra một chút.
BallisticTomato

61

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

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

Đây là một macro bị tấn công để làm những gì bạn muốn. Điều này sử dụng màu văn bản nội bộ đẹp nhất. Tất nhiên internal::không gian tên sẽ phát ra tiếng chuông cảnh báo, nhưng này, nó hoạt động.

Sử dụng:

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

  // or C++ style

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

Đầu ra:

Ví dụ đầu ra

Mã:

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()

Cảm ơn, đây là giải pháp chính xác, IMHO. Nhưng tôi có thể đề xuất thêm một \ntrong PRINTF bên trong lớp không? đó là bởi vì chúng tôi không thể nối các dòng với TEST_COUT như chúng tôi làm với std::cout, vì vậy sẽ vô ích nếu để người dùng thêm dòng của họ \n. Cảm ơn bạn anyway!
HappyCactus

1
Rất tiếc, phương pháp này không còn hoạt động với các phiên bản hiện đại của Google Test - testing::internal::ColoredPrintfkhông còn khả dụng cho công chúng nữa :(
AntonK

15

Có một cách khá đơn giản và khó thực hiện (không cần đi sâu vào các lớp nội bộ hoặc tạo các 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:

nhập mô tả hình ảnh ở đây

Tín dụng được chuyển đến @Martin Nowak cho phát hiện của anh ấy.


5

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

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

Mã:

#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 GOUTtrong gtest của bạn

Sử dụng:

#include "gtest_cout.h"

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

ColoredPrintf đã được đặt tĩnh trong phiên bản gần đây, vì vậy bản hack này sẽ không hoạt động nữa.
schwart

3

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

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

} logout;

Sử dụng cái này:

logout.info() << "test: " << "log" << std::endl;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.