2011-12-14 10 views
18

Tôi biết cách phát triển thử nghiệm tham số loại và kiểm tra tham số giá trị riêng biệt. Những gì tôi đang cố gắng tìm ra là nếu nó có thể kết hợp cả hai. Nói cách khác, hãy tạo một thử nghiệm chung có bất kỳ loại và phạm vi giá trị nào cho loại đó.Google Test: Có cách nào để kết hợp thử nghiệm vừa là tham số loại và tham số giá trị không?

+0

Tôi đã tự hỏi tương tự ... – memecs

Trả lời

17

Không có bất kỳ kết hợp sẵn sàng để mặc nào của các thử nghiệm loại tham số và các thử nghiệm tham số giá trị. Các nhà phát triển googletest đã asked the question and they said No.

Tuy nhiên, có một cách thường xuyên và đơn giản (theo đề nghị của Zhanyong Wan trong các cuộc thảo luận liên quan), trong đó bạn có thể thủ công bạn sở hữu type-parameterised trường hợp thử nghiệm mà kiểm tra một số điều kiện để một quy định phạm vi giá trị của loại tham số. Dưới đây là một ví dụ tiểu học nơi điều kiện chỉ là là lớn hơn 0:

#include <vector> 
#include "gtest/gtest.h" 

template<class T> 
struct foo_test : public ::testing::Test { 
    static std::vector<T> _range_; 
}; 

TYPED_TEST_CASE_P(foo_test); 

TYPED_TEST_P(foo_test, IsGreaterThanZero) { 
    for (TypeParam value : foo_test<TypeParam>::_range_) { 
     EXPECT_GT(value,0); 
    } 
} 

REGISTER_TYPED_TEST_CASE_P(foo_test,IsGreaterThanZero); 

typedef ::testing::Types<char, int, float> MyTypes; 
INSTANTIATE_TYPED_TEST_CASE_P(My, foo_test, MyTypes); 

template<> std::vector<char> foo_test<char>::_range_{'1','2','3'}; 
template<> std::vector<int> foo_test<int>::_range_{1,2,3}; 
template<> std::vector<float> foo_test<float>::_range_{1.1,2.2,0.0}; 

int main(int argc, char **argv) { 
    ::testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

Khi biên soạn và chạy sản lượng đó là:

[==========] Running 3 tests from 3 test cases. 
[----------] Global test environment set-up. 
[----------] 1 test from My/foo_test/0, where TypeParam = char 
[ RUN  ] My/foo_test/0.IsGreaterThanZero 
[  OK ] My/foo_test/0.IsGreaterThanZero (0 ms) 
[----------] 1 test from My/foo_test/0 (0 ms total) 

[----------] 1 test from My/foo_test/1, where TypeParam = int 
[ RUN  ] My/foo_test/1.IsGreaterThanZero 
[  OK ] My/foo_test/1.IsGreaterThanZero (0 ms) 
[----------] 1 test from My/foo_test/1 (0 ms total) 

[----------] 1 test from My/foo_test/2, where TypeParam = float 
[ RUN  ] My/foo_test/2.IsGreaterThanZero 
/home/imk/develop/SO/gtest/main.cpp:14: Failure 
Expected: (value) > (0), actual: 0 vs 0 
[ FAILED ] My/foo_test/2.IsGreaterThanZero, where TypeParam = float (0 ms) 
[----------] 1 test from My/foo_test/2 (1 ms total) 

[----------] Global test environment tear-down 
[==========] 3 tests from 3 test cases ran. (1 ms total) 
[ PASSED ] 2 tests. 
[ FAILED ] 1 test, listed below: 
[ FAILED ] My/foo_test/2.IsGreaterThanZero, where TypeParam = float 

1 FAILED TEST 

Kết quả có granularity thô hơn sẽ lý tưởng: chỉ cần 3 thử nghiệm thay vì so với 9. Tuy nhiên, các giá trị thất bại có thể được báo cáo, như được hiển thị, vì vậy hạt thô có thể là có thể chấp nhận được.

+0

Bất kỳ ý tưởng làm thế nào để có được một sản phẩm Descartes của các thông số loại/giá trị mà không cần mã hóa cứng nó? – memecs

+0

Để khá rõ ràng, bạn muốn kiểm tra từng loại 'T0, .., Tn' cho mỗi một tập hợp các giá trị' V0, .., Vm' sao cho 'Ti' có thể được cấu thành từ' Vj' cho bất kỳ 'i <= n' và' j <= m'. Có đúng không? –

+0

Phải, không chắc chắn ý bạn là gì với "Ti constructible from Vj". Tôi sẽ cung cấp cho bạn một ví dụ rõ ràng hơn: giả sử tôi có ba loại {T1, T2, T3} và hai tham số giá trị {V1, V2}, tôi muốn thử nghiệm với các bộ dữ liệu sau: {(T1, V1), (T1, V2), (T1, V3), (T2, V1), (T2, V2), v.v ...}. Điểm là, tôi có nhiều tham số và loại để kiểm tra và tôi không thể mã hóa tất cả chúng. – memecs

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