Cho đến bây giờ, tôi đã sử dụng một thủ tục kiểm tra đơn vị ngẫu hứng - về cơ bản một tải toàn bộ các chương trình thử nghiệm đơn vị chạy tự động bởi một tập tin thực thi. Mặc dù rất nhiều trong số này rõ ràng kiểm tra kết quả của họ, nhiều gian lận hơn - họ kết xuất ra các tập tin văn bản được phiên bản. Bất kỳ thay đổi nào trong kết quả kiểm tra đều bị gắn cờ bởi subversion và tôi có thể dễ dàng xác định thay đổi đó là gì. Nhiều người trong số các bài kiểm tra đầu ra các tập tin dot hoặc một số hình thức khác cho phép tôi để có được một đại diện trực quan của đầu ra.Làm cách nào để điều chỉnh các thử nghiệm đơn vị của tôi thành cmake và ctest?
Sự cố là tôi đang chuyển sang sử dụng cmake. Đi với luồng cmake có nghĩa là sử dụng các bản dựng ngoài nguồn, có nghĩa là sự tiện lợi của việc kết xuất các kết quả trong một thư mục nguồn/chia sẻ được chia sẻ và phiên bản chúng cùng với nguồn không thực sự hoạt động. Là một sự thay thế, những gì tôi muốn như để làm là để cho công cụ kiểm tra đơn vị nơi để tìm tập tin kết quả mong đợi (trong cây nguồn) và làm cho nó để làm so sánh. Khi thất bại, nó sẽ cung cấp kết quả thực tế và danh sách khác.
Điều này có thể hay tôi nên thực hiện một cách tiếp cận hoàn toàn khác?
Rõ ràng, tôi có thể bỏ qua ctest và chỉ chỉnh sửa những gì tôi đã luôn thực hiện đối với các bản dựng ngoài nguồn. Tôi có thể phiên bản thư mục của tôi-nơi-tất cả-các-xây dựng-sống, ví dụ (với việc sử dụng tự do của 'bỏ qua' tất nhiên). Có lành không? Có lẽ không, vì mỗi bản dựng sẽ kết thúc với một bản sao riêng biệt của các kết quả mong đợi.
Ngoài ra, bất kỳ lời khuyên nào về cách được khuyến nghị để thực hiện kiểm tra đơn vị với nhận biết về cmake/ctest đã nhận được. Tôi lãng phí một chút thời gian công bằng với cmake, không phải vì nó xấu, nhưng bởi vì tôi không hiểu cách tốt nhất để làm việc với nó.
EDIT
Cuối cùng, tôi quyết định giữ nguyên cmake/bên ctest của kiểm tra đơn vị như đơn giản càng tốt. Để kiểm tra thực tế chống lại kết quả mong đợi, tôi thấy một ngôi nhà cho các chức năng sau đây trong thư viện của tôi ...
bool Check_Results (std::ostream &p_Stream ,
const char *p_Title ,
const char **p_Expected,
const std::ostringstream &p_Actual )
{
std::ostringstream l_Expected_Stream;
while (*p_Expected != 0)
{
l_Expected_Stream << (*p_Expected) << std::endl;
p_Expected++;
}
std::string l_Expected (l_Expected_Stream.str());
std::string l_Actual (p_Actual.str());
bool l_Pass = (l_Actual == l_Expected);
p_Stream << "Test: " << p_Title << " : ";
if (l_Pass)
{
p_Stream << "Pass" << std::endl;
}
else
{
p_Stream << "*** FAIL ***" << std::endl;
p_Stream << "===============================================================================" << std::endl;
p_Stream << "Expected Results For: " << p_Title << std::endl;
p_Stream << "-------------------------------------------------------------------------------" << std::endl;
p_Stream << l_Expected;
p_Stream << "===============================================================================" << std::endl;
p_Stream << "Actual Results For: " << p_Title << std::endl;
p_Stream << "-------------------------------------------------------------------------------" << std::endl;
p_Stream << l_Actual;
p_Stream << "===============================================================================" << std::endl;
}
return l_Pass;
}
Một thử nghiệm đơn vị điển hình bây giờ trông giống như ...
bool Test0001()
{
std::ostringstream l_Actual;
const char* l_Expected [] =
{
"Some",
"Expected",
"Results",
0
};
l_Actual << "Some" << std::endl
<< "Actual" << std::endl
<< "Results" << std::endl;
return Check_Results (std::cout, "0001 - not a sane test", l_Expected, l_Actual);
}
Nơi tôi cần một chức năng bán phá giá dữ liệu có thể sử dụng lại, nó có tham số kiểu std::ostream&
, do đó, nó có thể đổ vào luồng kết quả thực tế.
Thay vào đó, bạn nên thêm Chỉnh sửa làm câu trả lời vì câu trả lời cho câu hỏi của riêng bạn – Joakim