Tôi đang sử dụng CATCH v1.1 build 14 để kiểm tra đơn vị mã C++ của tôi.Kiểm tra đơn vị Catch.hpp: Cách tạo động các trường hợp thử nghiệm?
Là một phần của thử nghiệm, tôi muốn kiểm tra kết quả đầu ra của một số mô-đun trong mã của tôi. Không có một số mô-đun được thiết lập; nhiều mô-đun hơn có thể được thêm vào bất kỳ lúc nào. Tuy nhiên, mã để kiểm tra từng mô-đun là giống hệt nhau. Vì vậy, tôi nghĩ rằng nó sẽ là lý tưởng để đặt mã thử nghiệm trong một vòng lặp for
. Trong thực tế, sử dụng catch.hpp
, tôi đã xác minh rằng tôi có thể tự động tạo các Phần trong một Trường hợp thử nghiệm, trong đó mỗi Phần tương ứng với một mô-đun. Tôi có thể làm điều này bằng cách kèm theo các SECTION
vĩ mô trong một vòng lặp for, ví dụ:
#include "catch.hpp"
#include <vector>
#include <string>
#include "myHeader.h"
TEST_CASE("Module testing", "[module]") {
myNamespace::myManagerClass manager;
std::vector<std::string> modList;
size_t n;
modList = manager.getModules();
for (n = 0; n < modList.size(); n++) {
SECTION(modList[n].c_str()) {
REQUIRE(/*insert testing code here*/);
}
}
}
(Đây không phải là một ví dụ làm việc hoàn chỉnh, nhưng bạn sẽ có được ý tưởng.)
Đây là tiến thoái lưỡng nan của tôi. Tôi muốn kiểm tra các mô-đun một cách độc lập, như vậy nếu một mô-đun bị lỗi, nó sẽ tiếp tục thử nghiệm các mô-đun khác thay vì hủy bỏ thử nghiệm. Tuy nhiên, cách CATCH hoạt động, nó sẽ hủy bỏ toàn bộ Trường hợp kiểm tra nếu REQUIRE
không thành công. Vì lý do này, tôi muốn tạo một Trường hợp thử nghiệm riêng biệt cho mỗi mô-đun, không chỉ là một Phần riêng biệt. Tôi đã thử đưa for
vòng lặp của tôi ngoài TEST_CASE
vĩ mô, nhưng mã này không biên dịch (như tôi dự kiến):
#include "catch.hpp"
#include <vector>
#include <string>
#include "myHeader.h"
myNamespace::myManagerClass manager;
std::vector<std::string> modList;
size_t n;
modList = manager.getModules();
for (n = 0; n < modList.size(); n++) {
TEST_CASE("Module testing", "[module]") {
SECTION(modList[n].c_str()) {
REQUIRE(/*insert testing code here*/);
}
}
}
Nó có thể là có thể làm điều này bằng cách writing my ownmain()
, nhưng tôi không thể nhìn thấy làm thế nào để làm nó chính xác. (Tôi có đặt mã TEST_CASE
tôi trực tiếp vào main()
? Nếu tôi muốn giữ mã TEST_CASE
của tôi trong một tập tin khác nhau? Ngoài ra, sẽ có ảnh hưởng khác, Test Cases chuẩn hơn tôi?)
Tôi cũng có thể sử dụng CHECK
macro thay vì REQUIRE
các macro để tránh hủy bỏ Trường hợp kiểm tra khi mô-đun bị lỗi, nhưng sau đó tôi nhận được vấn đề ngược lại: Nó cố gắng tiếp tục thử nghiệm trên mô-đun nên đã không hoạt động sớm. Nếu tôi chỉ có thể đặt từng mô-đun trong Case Test riêng của mình, điều đó sẽ cho tôi một hành vi lý tưởng.
Có cách đơn giản để tự động tạo các trường hợp thử nghiệm trong CATCH không? Nếu vậy, bạn có thể cho tôi một ví dụ về làm thế nào để làm điều đó? Tôi đọc qua tài liệu CATCH và tìm kiếm trực tuyến, nhưng tôi không thể tìm thấy bất kỳ dấu hiệu nào về cách thực hiện điều này.
Tôi đang sử dụng đề xuất đầu tiên của bạn và điều đó giúp tôi đạt được hầu hết mọi cách. Lý tưởng nhất, tôi muốn tự động phát hiện các mô-đun trong thời gian chạy và tạo ra một trường hợp thử nghiệm cho mỗi, nhưng tôi bắt đầu nghĩ rằng nó không phải là có thể với Catch. Một số nền: Các mô-đun xác định các lớp dẫn xuất từ một lớp cơ sở trừu tượng mà tôi định nghĩa. Chúng tạo ra các kết quả đầu ra khác nhau, nhưng quy trình kiểm tra đầu ra là như nhau. Các nhà phát triển khác thêm các mô-đun riêng của họ, vì vậy sẽ rất tuyệt nếu họ có thể sử dụng chức năng kiểm tra của chúng tôi để kiểm tra các mô-đun của họ để tuân thủ. Có lẽ tôi đang làm sai, nhưng tôi không thấy một cách tốt hơn. –
Có nhiều cuộc thảo luận về điều này trên Google Group: https://groups.google.com/forum/#!searchin/catch-forum/section/catch-forum/mRBKqtTrITU/FoHEoMn3SN8J – JBRWilkinson