So sánh các khung kiểm tra đơn vị C ++ [đã đóng]


300

Tôi biết đã có một vài câu hỏi liên quan đến các đề xuất cho các khung kiểm tra đơn vị C ++, nhưng tất cả các câu trả lời không giúp ích gì vì chúng chỉ đề xuất một trong các khung nhưng không cung cấp bất kỳ thông tin nào về so sánh (tính năng).

Tôi nghĩ các khung thú vị nhất là CppUnit, Boost và khung thử nghiệm mới của Google. Có ai đã thực hiện bất kỳ so sánh chưa?



Tôi có khung kiểm tra dựa trên IOC của riêng mình mà tôi thích hơn vì nó không chỉ là bản sao của tất cả những gì người khác làm mà là giải quyết những gì tôi thấy tất cả các vấn đề của những người khác. Bạn viết các trường hợp kiểm tra bằng cách xuất phát từ một lớp, không phải bằng cách sử dụng macro. Macro chỉ được sử dụng để xác nhận vì chúng cung cấp cho bạn sự phản ánh. Tùy chỉnh đầu ra của thống kê thử nghiệm. Chạy từ kịch bản IOC để bạn chọn những gì bạn kiểm tra, tần suất và với các tham số.
CashCow

và thật tuyệt vời từ quan điểm phát triển khi tôi thêm bài kiểm tra của riêng mình, tôi có thể chạy nó mà không phải chạy cùng lúc với mọi người. Vì vậy, tôi biết rằng mã của tôi đang làm việc.
CashCow

Câu trả lời:


99

Xem câu hỏi này cho một số cuộc thảo luận.

Họ đề xuất các bài viết: Khám phá Khung thử nghiệm đơn vị C ++ Jungle , tác giả Noel Llopis. Và gần đây hơn: Khung đơn vị kiểm tra C ++

Tôi chưa tìm thấy một bài viết so sánh googletest với các khung khác.


Như tôi đã viết: tất cả các câu trả lời chỉ đề xuất một trong các khung nhưng không so sánh khung này với khung khác.
housemaister

Bạn cũng không hài lòng với bài viết?
Gishu

7
Một chỉ trích: bài báo, trong khi tốt, là từ năm 2004 và không bao gồm Google Test.
richq

2
Trong liên kết đầu tiên, bạn sẽ thấy hai so sánh. Ngoại trừ khuôn khổ mới từ google, hầu hết thông tin là (vẫn?) Vẫn có liên quan. (Và CppUnit không phải là thứ thú vị nhất, nó quá vụng về để sử dụng)
Luc Hermitte

1
sửa chữa các liên kết và mở rộng câu trả lời bằng một so sánh gần đây hơn
Sam Saffron

120

Một người chơi mới là Google Test (còn được gọi là Google C ++ Trial Framework ) khá đẹp.

#include <gtest/gtest.h>

TEST(MyTestSuitName, MyTestCaseName) {
    int actual = 1;
    EXPECT_GT(actual, 0);
    EXPECT_EQ(1, actual) << "Should be equal to one";
}

Những đặc điểm chính:

  • Di động
  • Khẳng định chết ngườikhông gây tử vong
  • Dễ dàng xác nhận tin nhắn thông tin :ASSERT_EQ(5, Foo(i)) << " where i = " << i;
  • Google Test tự động phát hiện các bài kiểm tra của bạn và không yêu cầu bạn liệt kê chúng để chạy chúng
  • Giúp bạn dễ dàng mở rộng vốn từ vựng khẳng định của mình
  • Xét nghiệm tử vong (xem hướng dẫn nâng cao)
  • SCOPED_TRACE cho các vòng lặp chương trình con
  • Bạn có thể quyết định chạy thử nghiệm
  • Tạo báo cáo thử nghiệm XML
  • Lịch thi đấu / Mock / Mẫu ...

3
Tôi thực sự thích sử dụng thử nghiệm google trên một số khung công tác khác, đặc biệt là với khả năng chế giễu của nó có thể được tìm thấy trong khung googlemock.
Mike

8
Tôi cung cấp tất cả các tính năng này (mặc dù một số tính năng chưa được công khai) và nhiều tính năng khác trong khung thử nghiệm mới của tôi, CATCH. Xem câu trả lời của tôi cho liên kết.
philsquared

2
kết hợp nó với khung Mocking của Google C ++ làm cho khung kiểm tra xUnit thực sự mạnh mẽ cho mã kiểm tra đơn vị C ++.
ratkok

5
@CashCow Chạy với bản dựng là một cái gì đó khác với phát hiện kiểm tra. Chạy với xây dựng phụ thuộc vào hệ thống xây dựng của bạn. Phát hiện kiểm tra có nghĩa là bạn không phải liệt kê tất cả các kiểm tra trong một lớp khác, chỉ cần tạo các phương thức kiểm tra và đó là phương pháp kiểm tra.
Wernight

Mặc dù vậy, tôi không thích việc lạm dụng macro của họ và thực tế là sử dụng các từ phổ biến như TEST có thể xung đột với thứ gì đó. GTEST sẽ tốt hơn, ít có khả năng đụng độ.
CashCow

112

Tôi vừa mới đẩy khuôn khổ 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 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 hầu hết các mặt bằng mà không có quá nhiều sự đánh đổi. Hãy xem mục blog được liên kết của tôi cho một người khai thác. Năm tính năng hàng đầu của tôi là:

  • Chỉ tiêu đề
  • Tự động đăng ký kiểm tra chức năng và phương pháp
  • Phân tách các biểu thức C ++ tiêu chuẩn thành LHS và RHS (vì vậy bạn không cần cả gia đình macro xác nhận).
  • Hỗ trợ cho các phần lồng nhau trong một vật cố dựa trên chức năng
  • Kiểm tra tên bằng ngôn ngữ tự nhiên - tên hàm / phương thức được tạo

Nó cũng có các ràng buộc Objective-C. Dự án được lưu trữ trên Github


Vui lòng xem xét thêm CHECK_FLASEREQUIRE_FLASEmacro.
Cileier Cormier

6
Khung tốt nhất theo ý kiến ​​của tôi.
CoffeDeveloper

3
doctest là sự tái hiện của tôi với Catch với sự tập trung rất lớn vào tốc độ biên dịch - kiểm tra Câu hỏi thường gặp để xem chúng khác nhau như thế nào
onqtam

@einpoklum Catch không bị bỏ rơi - người tạo đang làm việc trên phiên bản 2 của thư viện. doctest là một sự tái hiện của Catch 1 với một số quyết định thiết kế tiền thưởng
onqtam

2
Tôi thực sự thua lỗ khi so sánh tất cả các khung thử nghiệm (một trong số đó bây giờ tôi phải chọn). Bạn có thể viết câu trả lời của riêng bạn so sánh và đối chiếu doctest với Catch và các dịch vụ khác không?
einpoklum

53

Thư viện kiểm tra Boost là một lựa chọn rất tốt đặc biệt nếu bạn đang sử dụng Boost.

// TODO: Include your class to test here.
#define BOOST_TEST_MODULE MyTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(MyTestCase)
{
    // To simplify this example test, let's suppose we'll test 'float'.
    // Some test are stupid, but all should pass.
    float x = 9.5f;

    BOOST_CHECK(x != 0.0f);
    BOOST_CHECK_EQUAL((int)x, 9);
    BOOST_CHECK_CLOSE(x, 9.5f, 0.0001f); // Checks differ no more then 0.0001%
}

Nó hỗ trợ:

  • Đăng ký kiểm tra tự động hoặc thủ công
  • Nhiều khẳng định
  • Tự động so sánh các bộ sưu tập
  • Các định dạng đầu ra khác nhau (bao gồm cả XML )
  • Lịch thi đấu / Mẫu ...

PS: Tôi đã viết một bài viết về nó có thể giúp bạn bắt đầu: Khung kiểm tra đơn vị C ++: Hướng dẫn kiểm tra tăng cường


Tôi đã từng sử dụng thử nghiệm Boost và thích nó ngoại trừ việc nó dường như thay đổi đáng kể giữa các lần phát hành. Việc kiểm tra đơn vị bán hàng cho khách hàng của tôi là rất khó khăn mà không phải mất nhiều thời gian của tôi (và tiền của họ) để sửa các thử nghiệm khi API thay đổi, hơn là sửa mã mà nó có nghĩa là thử nghiệm. Cuối cùng, tôi đã bỏ nó và tự viết - đây là khoảng 5 năm trước.
Thành phần 10

5
Liên kết hướng dẫn bị hỏng
mloskot

2
@mloskot Nó hoạt động trở lại.
Chris Jester-Young

@mloskot Xin lỗi vì điều đó, xin vui lòng gửi cho tôi trực tiếp e-mail nếu bạn thấy nó bị hỏng. Thật dễ dàng để tìm thấy hơn một bình luận. :)
Wernight

@Wernight Yup, hoạt động trở lại. Thx
mloskot


16

Gần đây tôi đã phát hành xUnit ++ , cụ thể là một giải pháp thay thế cho Google Test và Thư viện thử nghiệm Boost (xem các so sánh ). Nếu bạn quen thuộc với xUnit.Net, bạn đã sẵn sàng cho xUnit ++.

#include "xUnit++/xUnit++.h"

FACT("Foo and Blah should always return the same value")
{
    Check.Equal("0", Foo()) << "Calling Foo() with no parameters should always return \"0\".";
    Assert.Equal(Foo(), Blah());
}

THEORY("Foo should return the same value it was given, converted to string", (int input, std::string expected),
    std::make_tuple(0, "0"),
    std::make_tuple(1, "1"),
    std::make_tuple(2, "2"))
{
    Assert.Equal(expected, Foo(input));
}

Những đặc điểm chính:

  • Cực kỳ nhanh: các bài kiểm tra chạy đồng thời .
  • Di động
  • Đăng ký kiểm tra tự động
  • Nhiều loại xác nhận (Boost không có gì trên xUnit ++)
  • So sánh các bộ sưu tập nguyên bản.
  • Các xác nhận có ba cấp độ:
    • lỗi nghiêm trọng
    • lỗi không nghiêm trọng
    • cảnh báo
  • Dễ dàng xác nhận đăng nhập:Assert.Equal(-1, foo(i)) << "Failed with i = " << i;
  • Kiểm tra đăng nhập:Log.Debug << "Starting test"; Log.Warn << "Here's a warning";
  • Đồ đạc
  • Kiểm tra dựa trên dữ liệu (Lý thuyết)
  • Chọn thử nghiệm nào để chạy dựa trên:
    • Khớp thuộc tính
    • Đặt tên cho chuỗi con
    • Phòng thử nghiệm

2
Câu hỏi là yêu cầu so sánh. IMO, điều quan trọng là phải trình bày những điểm khác biệt giữa khung của bạn và, ít nhất, hai cái phổ biến: googletest và Boost. Đặc biệt, nếu bạn quảng cáo xUnit ++ thay thế cho hai thứ đó. Sẽ là +1 nếu được cập nhật :)
mloskot

Đủ công bằng. :) Tôi đã có một bảng so sánh trên wiki , nhưng tôi sẽ cố gắng tóm tắt một vài sự khác biệt trực tiếp trong câu trả lời của mình.
moswald

1
Tôi quyết định chỉ liên kết bảng wiki trực tiếp, nó đang làm lộn xộn bản tóm tắt để liệt kê ra tất cả.
moswald

các liên kết làm việc cho tôi, cảm ơn! +1
mloskot

1
dự án của bạn đã bị ngừng? Cam kết cuối cùng bắt đầu từ 09/2015 ... Dù sao, câu trả lời tuyệt vời. Cảm ơn.
zertyz


4

CPUnit ( http://castait.sourceforge.net ) là một khung tương tự như Google Test, nhưng dựa trên ít macos hơn (khẳng định là các hàm) và trong đó các macro được tiền tố để tránh các lỗi macro thông thường. Các xét nghiệm trông giống như:

#include <cpunit>

namespace MyAssetTest {
    using namespace cpunit;

    CPUNIT_FUNC(MyAssetTest, test_stuff) {
        int some_value = 42;
        assert_equals("Wrong value!", 666, some_value);
    }

    // Fixtures go as follows:
    CPUNIT_SET_UP(MyAssetTest) {
        // Setting up suite here...
        // And the same goes for tear-down.
    }

}

Họ tự động đăng ký, vì vậy bạn không cần nhiều hơn thế. Sau đó, nó chỉ là biên dịch và chạy. Tôi thấy việc sử dụng khung công tác này rất giống như sử dụng JUnit, cho những người đã phải dành thời gian để lập trình Java. Rất đẹp!



2

API Sanity Checker - khung kiểm tra cho các thư viện C / C ++:

Trình tạo tự động các bài kiểm tra đơn vị cơ bản cho thư viện C / C ++ được chia sẻ. Nó có thể tạo dữ liệu đầu vào hợp lý (trong hầu hết, nhưng không phải tất cả, các trường hợp) cho các tham số và soạn các trường hợp kiểm tra đơn giản ("sanity" hoặc "nông") cho mọi chức năng trong API thông qua phân tích khai báo trong tiêu đề các tập tin.

Chất lượng của các thử nghiệm được tạo cho phép kiểm tra không có lỗi nghiêm trọng trong các trường hợp sử dụng đơn giản. Công cụ này có thể xây dựng và thực hiện các thử nghiệm được tạo và phát hiện sự cố (segfaults), hủy bỏ, tất cả các loại tín hiệu phát ra, mã trả về chương trình khác không và treo chương trình.

Các tính năng độc đáo so với CppUnit, Boost và Google Test:

  • Tự động tạo dữ liệu thử nghiệm và đối số đầu vào (ngay cả đối với các loại dữ liệu phức tạp)
  • Các loại chuyên dụng hiện đại và có thể tái sử dụng cao thay vì đồ đạc và mẫu
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.