2010-01-10 53 views
14

Tôi đã gặp cppunit nhưng nó không trông siêu dễ sử dụng (có lẽ tôi không nhìn cứng, có thể vì C++ không hoạt động như Java/C#). Có các lựa chọn thay thế đơn giản, được sử dụng rộng rãi không?C++ Đơn vị kiểm tra thư viện

Thực tế, cppunit khung kiểm tra đơn vị chuẩn cho C++?

+0

Bạn có muốn hỗ trợ cho các đối tượng giả không? –

+1

Related: http://stackoverflow.com/questions/91384/unit-testing-for-c-code-tools-and-methodology http://stackoverflow.com/questions/13699/choosing-ac-unit-testing- tool-framework http://stackoverflow.com/questions/3150/how-to-set-up-unit-testing-for-visual-studio-c http://stackoverflow.com/questions/387272/unit-testing- in-c và có thể là những người khác –

+2

Bản sao của http://stackoverflow.com/questions/242926/comparison-of-c-unit-test-frameworks – dmckee

Trả lời

18

Không có tiêu chuẩn thư viện kiểm tra đơn vị cho C++. Có rất nhiều sự lựa chọn để lựa chọn; cppunit là một trong số họ.

Tại công ty của tôi, chúng tôi sử dụng Google Test cùng với đối tác của mình Google Mock để kiểm tra đơn vị và mô phỏng đối tượng. Tôi tìm thấy cả hai kết hợp dễ dàng hơn để sử dụng và mạnh hơn nhiều so với cppunit.

+0

+1 Tuyệt, tôi không biết những thứ này tồn tại. –

+0

Chỉ cần tò mò, làm google-thang "chơi tốt" với Eclipse và Hudson? – Mawg

+0

Có thể ghi đầu ra vào các tệp xml theo cùng một lược đồ như JUnit với cờ --gtest_output = "xml: _path_to_output_file_". Nó hoạt động tốt với hudson cho chúng tôi trên Windows, Mac và Ubuntu. Tôi không thể nói cho nhật thực, mặc dù chúng tôi không sử dụng nó. –

5

gtest, Khung kiểm tra của Google là phương án thay thế.

Đây là một ví dụ đơn giản từ documentation:

// Tests factorial of 0. 
TEST(FactorialTest, HandlesZeroInput) { 
    EXPECT_EQ(1, Factorial(0)); 
} 

// Tests factorial of positive numbers. 
TEST(FactorialTest, HandlesPositiveInput) { 
    EXPECT_EQ(1, Factorial(1)); 
    EXPECT_EQ(2, Factorial(2)); 
    EXPECT_EQ(6, Factorial(3)); 
    EXPECT_EQ(40320, Factorial(8)); 
} 

Nó cũng đóng độc đáo với gmock, khuôn khổ giả của Google cho C++

+0

Tôi đã đưa ra một ví dụ về cách bạn muốn viết tương đương với các bài kiểm tra này trong khuôn khổ của riêng tôi, CATCH, trong câu trả lời của tôi. – philsquared

1

CppUnit lẽ là thử nghiệm khuôn khổ đơn vị đầu tiên cho C++. Đó là một cổng trực tiếp của Junit, khung công tác Java nổi tiếng. Điều này làm cho việc chuyển đổi từ Junit dễ dàng hơn, nhưng với chi phí của một khung công tác hơi nặng, không tận dụng được khả năng của C++ như RAII. Đó là lý do tại sao các phiên bản nhẹ như CppUnitLite, NanoCppUnit đã được tạo ra. CppUnit2 được cho là sẽ cải thiện điều này, trong số các cải tiến khác.

Tut từng rất nhẹ, chỉ một tiêu đề, nhưng các phiên bản mới nhất đã giới thiệu một thư viện.

Theo như khung "tiêu chuẩn" có liên quan, không có khung nào và C++ 1X không xác định.

1

Tôi đã tạo một bộ thử nghiệm có tên là saru (http://github.com/squishyhumans/saru) cho mã riêng của mình. Mã được cấp phép BSD của nó. Tôi đã phát triển nó vì tôi không thích một số tính năng của các bộ thử nghiệm khác. Nó không được sử dụng rộng rãi, nhưng tôi đã sử dụng nó trên một số dự án thương mại trải rộng trên hai công ty.

  1. Tôi không thích tất cả các thử nghiệm của mình được biên dịch thành một nhị phân. Lý do của tôi cho điều này là nếu biên dịch thất bại tất cả các bài kiểm tra thất bại, nếu một thử nghiệm không hành vi không xác định đầu ra chương trình là không xác định.
  2. Tôi muốn kiểm soát những thử nghiệm nào chạy. Tôi muốn có thể nhóm các bài kiểm tra và chạy các tập con.
  3. Tôi muốn lỗi biên dịch của thử nghiệm được báo cáo là lỗi kiểm tra và không dừng tất cả các thử nghiệm đang chạy.
  4. Tôi muốn để có thể chạy thử nghiệm từ nhiều ngôn ngữ khác nhau
  5. Tôi muốn có một hệ thống đủ linh hoạt mà tôi có thể chạy thử nghiệm cụ thể theo valgrind (chưa có trong Saru :()

Vì vậy, Saru địa chỉ nhất các tính năng này. trọng tâm của nó là vào khả năng chạy một bộ các bài kiểm tra viết bằng các ngôn ngữ khác nhau. với kích cỡ thử nghiệm tối thiểu. đây là nhỏ nhất (không) C++ kiểm tra

//SARU : dummy dummy 
int main() { return (1==2)?0:1; } 

Tất cả Saru thực sự quan tâm abou t là giá trị trả về của nhị phân mà nó biên dịch. Sau đó, nó phân tích đầu ra để xác định những thử nghiệm nào không thành công và cứ như vậy. Nó có tiêu đề để làm việc với C++ một chút đẹp hơn so với ví dụ nhỏ trên:

//SARU : dummy dummy 
#include "MyStruct.h" 
#include "saru_cxx.h" 

class Fixture 
{ 
    MyStruct s_; 
    Fixture() : s_() {} 
    void test_A_is_B() 
    { 
    SARU_ASSERT_EQUAL(s_.A(), s_.B()); 
    } 

    void test_C_is_7() 
    { 
    SARU_ASSERT_EQUAL(7, s_.C()); 
    } 
}; 

int main() 
{ 
    saru::TestLogger logger; 
    SARU_TEST(Fixture:: test_A_is_B, logger); 
    SARU_TEST(Fixture:: test_C_is_7, logger); 
    logger.printSummary(); 
    return logger.allOK()?0:1; 
} 

Hoặc nếu bạn không thích cách tiêu đề của nó C++ làm việc nó sẽ có thể tích hợp với thư viện unittesting khác với khó khăn tối thiểu .

Nhưng nó cũng sẽ chạy thử nghiệm được viết bằng PHP & python. Vì vậy, bạn có thể thiết lập các bài kiểm tra chức năng đầy đủ với saru. Hoặc bạn có thể chạy một cái gì đó như lint trên mã của bạn như là một phần của bộ thử nghiệm.

16

Tôi vừa mới đẩy khung của riêng mình, CATCH, ra khỏi đó. Nó vẫn đang được phát triển nhưng tôi tin rằng nó đã vượt qua hầu hết các khung công tác khác. Những người khác nhau có các tiêu chí khác nhau nhưng tôi đã cố gắng bao quát nhiều nhất mà không có quá nhiều sự đánh đổi. Hãy xem mục nhập blog được liên kết của tôi cho một người nếm thử. top năm tính năng của tôi là:

  • header chỉ
  • đăng ký tự động chức năng và thử nghiệm phương pháp dựa
  • phân hủy biểu thức tiêu chuẩn C++ vào LHS và RHS (do đó bạn không cần một gia đình toàn bộ macro assert) .
  • Hỗ trợ cho phần lồng nhau trong một hàm cố định dựa
  • Tên bài kiểm tra sử dụng ngôn ngữ tự nhiên - tên hàm/phương pháp được tạo

Nó cũng có bindings-C Mục tiêu.

Như một ví dụ, đây là cách bạn muốn viết tương đương với ví dụ gtest rằng @dmeister trích dẫn:

TEST_CASE("Factorial/Handles zero input", "Tests factorial of 0.") 
{ 
    REQUIRE(Factorial(0) == 1); 
} 

TEST_CASE("Factorial/Handles positive input", "Tests factorial of positive numbers.") 
{ 
    REQUIRE(Factorial(1) == 1); 
    REQUIRE(Factorial(2) == 2); 
    REQUIRE(Factorial(3) == 6); 
    REQUIRE(Factorial(8) == 40320); 
}

Nếu một thử nghiệm thất bại, bạn vẫn nhận được các giá trị LHS và RHS đăng nhập independentaly.

+3

[doctest] (https://github.com/onqtam/doctest) là sự tái hiện của tôi về Catch với trọng tâm lớn về tốc độ biên dịch - kiểm tra [FAQ] (https://github.com/onqtam/doctest/blob/ master/doc/markdown/faq.md # how-is-doctest-different-from-catch) để xem những gì khác nhau giữa hai – onqtam

0

Dưới đây là một tối thiểu thư viện C++ kiểm tra đơn vị: https://github.com/vahidk/minimal-cpp-test

Nó có cú pháp rất giống với thư viện kiểm tra Google nhưng đó là một tiêu đề duy nhất thư viện và do đó dễ dàng hơn để cổng trên nền tảng.

Dưới đây là một thử nghiệm tối thiểu đơn vị:

#define DEFINE_TEST_MAIN  
#include "test.h" 
TEST(GroupName, TestName) { 
    EXPECT_EQ(1 + 2, 3); 
} 

Và một vật cố tối thiểu:

class ClassName : public cyrus:Test { 
public: 
    void Setup() override { 
    x = 5; 
    } 
    int x; 
} 

Test_F(ClassName, Test1) { 
    EXPECT_EQ(x, 5); 
} 

Hope this helps.