2011-12-14 13 views
18

मुझे पता है कि टाइप-पैरामीटरयुक्त परीक्षण और मूल्य-पैरामीटर परीक्षण को अलग से कैसे विकसित किया जाए। जो मैं समझने की कोशिश कर रहा हूं वह यह है कि दोनों को गठबंधन करना संभव है। दूसरे शब्दों में, एक सामान्य परीक्षण बनाएं जो उस प्रकार के लिए किसी भी प्रकार और मानों की श्रेणी लेता है।Google टेस्ट: क्या एक परीक्षण को गठबंधन करने का कोई तरीका है जो दोनों प्रकार पैरामीटर और मान पैरामीटरकृत है?

+0

मैं वही सोच रहा था ... – memecs

उत्तर

17

वहाँ प्रकार- parameterized परीक्षण और मूल्य-पैरामिट्रीकृत परीक्षण के किसी भी करने के लिए तैयार पहनने संयोजन नहीं है। googletest डेवलपर्स asked the question and they said No. किया गया है

हालांकि, वहाँ एक नियमित और आसान तरीका (के रूप में जोड़ा चर्चा में Zhanyong वान ने सुझाव दिया) जिसमें आप तैयार कर सकते हैं आप प्रकार parameterised परीक्षण का मामला ही है कि एक निर्दिष्ट के लिए कुछ शर्त परीक्षण है पैरामीटर प्रकार के मानों की श्रेणी । यहाँ एक प्राथमिक उदाहरण है जहाँ शर्त है बस 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(); 
} 

जब संकलित और उस के उत्पादन में चलाया जाता है:

[==========] 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 

परिणाम होगा की तुलना में मोटे में विवरण का स्तर है आदर्श: केवल 3 परीक्षणों के बजाय 9। फिर भी, असफल मानों की सूचना दी जा सकती है, जैसा कि दिखाया गया है, इसलिए मोटे अनाज सहनशील हो सकते हैं।

+0

कोई विचार है कि बिना किसी कोडिंग के प्रकार/मूल्य पैरामीटर के कार्टेशियन उत्पाद को कैसे प्राप्त किया जाए? – memecs

+0

स्पष्ट होने के लिए, आप 'V0, .., VM' के प्रत्येक सेट के प्रत्येक प्रकार के लिए' T0, .., Tn' का परीक्षण करना चाहते हैं, जैसे कि 'Ti'' Vj' से रचनात्मक है कोई 'i <= n' और' j <= m'। क्या वह सही है? –

+0

सही, सुनिश्चित नहीं है कि "वीजी से टीआई रचनात्मक" के साथ आपका क्या मतलब है। मैं आपको स्पष्ट होने के लिए एक उदाहरण दूंगा: मान लीजिए कि मेरे पास तीन प्रकार हैं {टी 1, टी 2, टी 3} और दो मान पैरामीटर {वी 1, वी 2}, मैं निम्नलिखित tuples के खिलाफ परीक्षण करना चाहता हूं: {(टी 1, वी 1), (टी 1, वी 2), (टी 1, वी 3), (टी 2, वी 1), (टी 2, वी 2), आदि ...}। प्वाइंट है, मेरे पास परीक्षण करने के लिए कई पैरामीटर और प्रकार हैं और मैं उन सभी को हार्ड-कोड नहीं कर सकता। – memecs

संबंधित मुद्दे

 संबंधित मुद्दे