2012-04-20 30 views
10

Tôi đã nhận được một số trường hợp kiểm tra tăng cường được đặt hàng trong một số bộ thử nghiệm. Một số trường hợp thử nghiệm có một, một số nhiều hơn một kiểm tra.Làm cách nào để yêu cầu Boost.Test dừng lại trong trường hợp kiểm tra lỗi đầu tiên?

Tuy nhiên, khi thực hiện tất cả các thử nghiệm, tất cả chúng đều được thực hiện - bất kể số lần thất bại hoặc vượt qua. Tôi biết, rằng tôi có thể ngừng thực hiện một trường hợp thử nghiệm với một vài kiểm tra bằng cách sử dụng BOOST_REQUIRE thay vì BOOST_CHECK. Nhưng điều đó không muốn tôi muốn.

Làm cách nào tôi có thể yêu cầu Boost dừng toàn bộ quá trình thực thi sau khi trường hợp thử nghiệm đầu tiên không thành công? Tôi thích giải pháp được biên dịch hơn (ví dụ: được thực hiện với lịch thi đấu toàn cục) qua giải pháp thời gian chạy (tức là tham số thời gian chạy).

+1

BOOST_REQUIRE_THROW sẽ ném một ngoại lệ do đó việc thực hiện toàn bộ bộ thử nghiệm phải được dừng lại. – TemplateRex

+0

Cảm ơn @rhalbersma. Tôi sẽ thử xem. Tại sao bạn không trả lời câu hỏi đó? –

+1

Ehm, vì sau khi đọc kỹ hướng dẫn sử dụng Boost.Test, đề xuất không chính xác. BOOST_REQUIRE_THROW là một thử nghiệm đơn vị để kiểm tra xem một ngoại lệ có được ném hay không. Nó không tự ném. – TemplateRex

Trả lời

4

BOOST_REQUIRE sẽ dừng trường hợp thử nghiệm hiện tại trong bộ thử nghiệm nhưng tiếp tục với những người khác.

Tôi không thực sự nhìn thấy những gì bạn muốn khi bạn yêu cầu "giải pháp được biên dịch" nhưng đây là một mẹo hữu ích. Tôi sử dụng một boolean để kiểm tra tính ổn định của toàn bộ bộ thử. Nếu nó không ổn định, tức là một BOOST_REQUIRE đã được kích hoạt rồi tôi dừng toàn bộ sự việc.

Hy vọng nó có thể giúp bạn.

//#include <...> 

//FIXTURES ZONE 
struct fixture 
{ 
    fixture():x(0.0),y(0.0){} 
    double x; 
    double y; 
}; 

//HELPERS ZONE 
static bool test_suite_stable = true; 

void in_strategy(bool & stable) 
{ 
    if(stable) 
     { 
      stable = false; 
     } 
    else 
     { 
      exit(); 
     } 
} 

void out_strategy(bool & stable) 
{ 
    if(!stable) 
     { 
      stable = true; 
     } 
} 

BOOST_AUTO_TEST_SUITE(my_test_suite) 

//TEST CASES ZONE 
BOOST_FIXTURE_TEST_CASE(my_test_case, fixture) 
{ 
    in_strategy(test_suite_stable); 
    //... 
    //BOOST_REQUIRE() -> triggered 
    out_strategy(test_suite_stable); 
} 

BOOST_FIXTURE_TEST_CASE(another_test_case, fixture) 
{ 
    in_strategy(test_suite_stable); //-> exit() since last triggered so stable = false 
    //... 
    //BOOST_REQUIRE() 
    out_strategy(test_suite_stable); 
} 

BOOST_TEST_SUITE_END() 

Benoit.

+0

Cảm ơn cho hack này :) Nhưng gọi in_/out_strategy trong mỗi trường hợp thử nghiệm là một chút đối với nguyên tắc DRY. Không phải là có khả năng trên toàn cầu (hoặc mỗi bộ thử nghiệm) xác định 'trước' và' sau' đồ đạc chạy cho mọi trường hợp thử nghiệm? Ngoài ra, người ta phải xác định lại BOOST_AUTO_TEST_CASE hoặc giống nhau. –

+0

@Torbjoern - đặt cuộc gọi chiến lược vào/ra trong ctor/dtor của lịch thi đấu. Lịch thi đấu được tạo và hủy cho * mỗi trường hợp thử nghiệm một cách riêng biệt. Quanteek - có thể muốn bao gồm điều đó trong câu trả lời của bạn? –

1

Tại sao không chỉ sử dụng khẳng định? Không chỉ bạn hủy bỏ ngay lập tức toàn bộ chương trình, bạn cũng sẽ có thể nhìn thấy ngăn xếp nếu cần thiết.

Các vấn đề liên quan