Những khung thử nghiệm đơn vị cho các trò chơi dựa trên c ++? [đóng cửa]


13

Sự kết hợp của các công cụ kiểm tra mà bạn cảm thấy là tốt nhất? Dựa vào khung / thư viện bạn chọn, bạn có thể cân nhắc:


Lưu ý: Mặc dù đây có thể là một câu hỏi chung chung giống như câu hỏi trên SO, tôi cho rằng việc phát triển trò chơi thường bị ràng buộc với một luồng công việc cụ thể có ảnh hưởng đến sự lựa chọn để thử nghiệm. Để có góc nhìn ở cấp độ cao hơn, hãy xem câu hỏi Tự động kiểm tra trò chơi .


Mặc dù tôi không trực tiếp thấy bất cứ điều gì sai với câu hỏi này, tôi nghĩ rằng nó sẽ được hưởng lợi từ việc tạo Cộng đồng Wiki. Ví dụ: gamedev.stackexchange.com/questions/480/ từ
Jesse Dorsey

Tôi đã làm nó CW. Tuy nhiên, tôi nghĩ rằng các hướng dẫn về thời điểm đặt câu hỏi CW có vẻ hơi không rõ ràng đối với tôi khi là người mới, đặc biệt vì điều này được tranh luận nói chung ( meta.stackexchange.com/questions/55888 ). Có lẽ chúng ta có thể nói rõ chính sách gamedev liên quan đến vấn đề này trong FAQ?
jmp97

Câu trả lời:


7

Tôi thấy UnitTest ++ rất dễ làm việc. Tôi sẽ vẫn phải thử amop cùng với nó, được đề cập là một người bạn đồng hành tốt với UnitTest ++ cho chức năng đối tượng giả. Nếu không, Google Mock là một lựa chọn phổ biến. Ngoài ra, bạn có thể muốn đọc lên UnitTest ++ và Mock Object .

UnitTest ++ có thể được thiết lập với phương pháp Tích hợp liên tục của bạn, ví dụ như với Hudson

Bạn có thể muốn đọc bài viết đầy cảm hứng này nếu bạn không bị thuyết phục đơn vị thử nghiệm và các trò chơi kết hợp tốt với nhau.


UnitTest ++ là khung thử nghiệm duy nhất mà bạn cần, đặc biệt là nó dễ dàng sửa đổi và mở rộng. Nếu bạn thấy mình thực hiện bất kỳ chương trình Java nào sau đó, JUnit sẽ đánh bạn nhiều lần bằng một cây búa với sự bất lực hoàn toàn mà nó hiển thị.
dash-tom-bang

Đối với UnitTest ++, hãy truy cập github.com/unittest-cpp/unittest-cpp. Mọi thứ khác đã lỗi thời.
Markus

4

Một phiếu bầu khác cho UnitTest ++ . Rất dễ tích hợp, được biên dịch cho nền tảng nhúng mục tiêu của chúng tôi rất dễ dàng, đơn giản và dễ sử dụng. Chúng tôi cũng đã tích hợp nó với Hudson. Chúng tôi đã xem GoogleTest nhưng từ chối nó (tôi nghĩ rằng nó có vấn đề khi biên dịch cho nền tảng mục tiêu của chúng tôi) nhưng nó có một bộ tính năng tương tự và có thể phù hợp với bạn.

Ngoài ra, bạn có thể muốn xem xét một số loại khung kiểm tra khói. Theo kinh nghiệm của tôi, rất khó để có đủ phạm vi kiểm tra cho một trò chơi chỉ với các bài kiểm tra đơn vị. Đặc biệt là nếu bạn đang giới thiệu thử nghiệm đơn vị cho một cơ sở mã hiện có, và thậm chí là moreso cho một nhóm lớn. Kiểm tra khói sẽ kiểm tra những thứ cấp cao như "đảm bảo tất cả các cấp tải". Lý thuyết của tôi là nếu tôi có cả hai loại thử nghiệm thì đến một lúc nào đó chúng có thể gặp nhau ở giữa và đưa ra mức độ phù hợp. :)


2

Quay lại khi tôi đang làm việc trong C ++ (từ chối trách nhiệm: đây là khoảng năm 2005), tôi đã sử dụng một phiên bản sửa đổi một chút của TUT (Khung kiểm tra đơn vị mẫu) . Tôi thích nó vì nó rất nhẹ, giúp dễ dàng sửa đổi và có nghĩa là có rất ít "keo" cần thiết khi viết bài kiểm tra.

Đây là một sửa đổi rất đơn giản mà tôi đã thực hiện, làm cho nó thậm chí còn háo hức hơn / sạch hơn để viết bài kiểm tra:

static int BogusFunction() { return __COUNTER__; } // Increment the __COUNTER__ to the correct position for the begining of the tests
#define TEST template<> template<> void object::test<__COUNTER__>()
#define ENSURE(msg, cond) ensure(msg, cond, __FILE__, __LINE__)
#define ENSURE_EQUALS(msg, actual, expected) ensure_equals(msg, actual, expected, __FILE__, __LINE__)
#define ENSURE_DISTANCE(msg, actual, expected, distance) ensure_distance(msg, actual, expected, distance, __FILE__, __LINE__)
#define FAIL(msg) fail(msg, __FILE__, __LINE__)

Sự thay đổi khác mà tôi đã thực hiện là định dạng đầu ra của nó, để các lỗi thử nghiệm xuất hiện chính xác trong danh sách lỗi của Visual Studios (khi được chạy như một phần của bản dựng), có thể nhấp để đi đến tệp và dòng thử nghiệm thất bại.

(Khả năng thực hiện loại điều này có nghĩa là có thể được thực hiện để phù hợp với quy trình TDD / CI của bạn, thay vì buộc bạn phải phù hợp với nó.)

Đây là một thử nghiệm ví dụ (từ ngăn xếp lệnh từ trình soạn thảo của tôi):

TEST // Undoing a command
{
    cs.AddCommand(new TestCommand);
    cs.AddCommand(new TestCommand(od));

    ENSURE("Undo success", cs.Undo());
    ENSURE_EQUALS("Stack size", cs.size(), 2);
    ENSURE_EQUALS("Command's Undo() was called", od.undo, 1);
    ENSURE_EQUALS("Command's Redo() not called", od.redo, 0);

    ACommandStack::const_iterator it = cs.end();
    ENSURE("Command is redoable", cs.GetUndoPos() == --it);
}

(Trong đoạn mã trên, csodlà đồ đạc trên mỗi mô-đun và TestCommandlà một đối tượng giả.)



2

Tôi không phải là nhà phát triển trò chơi chuyên nghiệp, nhưng tôi là nhà phát triển nhúng chuyên nghiệp. Có lẽ không chính xác như trò chơi nhưng gần gũi. Tại nơi làm việc của tôi, chúng tôi đã sử dụng một vài.

Tôi thực sự thích thử nghiệm google . Nó có tất cả các tính năng tốt nhất của các khung kiểm tra đơn vị gần đây, trong khi vẫn giữ tất cả trong một giao diện được sắp xếp theo luồng tối thiểu.

Tiếp theo trong danh sách của tôi là Boost Test . Api của Google test hiện đại hơn một chút so với Boost.Test, nhưng Boost Test đã thực hiện một công việc tuyệt vời là thêm các tính năng mới và bỏ qua mô hình CppUnit tồi tệ.

Tôi cũng đã sử dụng CxxTest . Nó được thực hiện khá tốt nhưng bạn có thể nói rằng nó không hiện đại như Boost.Test hay Google Test. Đặc biệt, sự hỗ trợ của nó cho các bộ thử nghiệm và đồ đạc là một chút khó xử.

Tôi thích sử dụng các tính năng nâng cao, nhưng nếu bạn là người tối giản, bạn sẽ không bao giờ thấy sự khác biệt giữa ba tính năng này. Hầu hết các đồng nghiệp của tôi sẽ hài lòng với khung kiểm tra đơn vị hỗ trợ kiểm tra đăng ký tự động (theo cách khai báo) và có một loại macro CHECK_EQUALS (a, b).


1

Thư viện thử nghiệm yêu thích của tôi là QuickCheck http://en.wikipedia.org/wiki/QuickCheck . Có một phiên bản C ++ thử nghiệm, nhưng có vẻ quá nặng, nhưng ngay cả khi không có thư viện chuyên dụng, các nguyên tắc vẫn dễ sử dụng.

Tất cả các lớp của tôi có một phương thức genArbitrary có thể tạo ra một thể hiện ngẫu nhiên. Tôi sử dụng điều này để kiểm tra khói các quá trình không thể đảo ngược, như tải và dỡ hàng. Tôi có thể tạo ra hàng ngàn cảnh ngẫu nhiên và kiểm tra xem các thuộc tính khác nhau có giữ không (như cảnh tôi nối tiếp giống như cảnh tôi giải trừ).

Nó không thay thế các bài kiểm tra đơn vị truyền thống (nó làm giảm nhu cầu về nhiều bài kiểm tra đơn vị tiềm năng), nhưng đó là một cách tuyệt vời để phát hiện ra các lỗi và giúp kiểm tra căng thẳng chiến lược phân bổ bộ nhớ của tôi (cùng với Valgrind). Thật tuyệt vời khi xem hơn một triệu phân bổ được đưa ra Valgrind thuần :).

Tôi đã từng sử dụng CxxTest như một khai thác thử nghiệm, mà tôi thích. Bây giờ tất cả các bài kiểm tra của tôi là exes riêng biệt. Tôi vừa có một thư mục có tên Test, và bao giờ tập tin bắt đầu bằng Test_ sẽ trở thành một bài kiểm tra. Cho đến nay nó là một thực sự nhẹ dễ dàng để thực hiện các bài kiểm tra.


0

Với Java, có rất nhiều thư viện tốt ... Không phải là trường hợp của C ++.

Đối với người dùng C ++, có một công cụ chuỗi từ Kitware rất thú vị:

  • CMake: làm công cụ
  • CDash: công cụ tích hợp liên tục

Kitware viết mã C ++ cho Khoa học Máy tính.

Đối với các dự án cá nhân, tôi sử dụng thư viện thử nghiệm đơn vị Boost (trên nền tảng Máy tính để bàn). Để tích hợp liên tục, tôi sử dụng Hudson:

  • cài đặt dễ dàng trên Tomcat
  • kịch bản

0

Tôi sẽ thứ hai khung TUT (Kiểm tra đơn vị mẫu) ; nó siêu nhẹ và cực kỳ linh hoạt, chưa kể rất dễ cài đặt và sử dụng ngoài hộp (một tiêu đề duy nhất bao gồm, một chút mã chính / thiết lập và 24 dòng mã kiểm tra sau khi bạn có bài kiểm tra đơn vị). Tôi đã kết hợp nó với binfmtc (chạy các chương trình C ++ dưới dạng tập lệnh) để tạo mẫu nhanh / mẫu TDD / học tập thành công lớn, bao gồm cả phát triển phần mềm nhúng. Do có khả năng xuất ra XML, nó cũng phù hợp với Jenkins (CI) và Sonar trong các dự án kế tiếp của tôi.

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.