मैं googletest का उपयोग कर परीक्षण लागू करने के लिए शुरू कर दिया और के बारे में value-parameterized testsडेटा-संचालित परीक्षण खराब है?
- आप विभिन्न आदानों पर अपने कोड (यानी डेटा के आधार पर परीक्षण) परीक्षण करना चाहते दस्तावेज में इस उद्धरण भर में ठोकर खाई है। यह सुविधा दुरुपयोग के लिए आसान है, इसलिए इसे करने के दौरान कृपया अपने अच्छे भावना का प्रयोग करें!
मुझे लगता है कि मैं वास्तव में "दुरुपयोग" कर रहा हूँ प्रणाली जब निम्न कार्य और इस मामले पर अपने इनपुट और राय सुनना पसंद करेंगे।
मान लें हम निम्नलिखित कोड है: तो इस कोड के साथ, यह निश्चित रूप से परीक्षण करने के लिए बेतरतीब ढंग से उत्पन्न डेटा की विभिन्न इनपुट सरणी आकारों के साथ समझ में आता है (f_alt()
के साथ तुलना करके) f()
परीक्षण करने के लिए,
template<typename T>
struct SumMethod {
T op(T x, T y) { return x + y; }
};
// optimized function to handle different input array sizes
// in the most efficient way
template<typename T, class Method>
T f(T input[], int size) {
Method m;
T result = (T) 0;
if(size <= 128) {
// use m.op() to compute result etc.
return result;
}
if(size <= 256) {
// use m.op() to compute result etc.
return result;
}
// ...
}
// naive and correct, but slow alternative implementation of f()
template<typename T, class Method>
T f_alt(T input[], int size);
ठीक है शाखाओं की शुद्धता।
typedef MultiplyMethod<int> MultInt;
typedef SumMethod<int> SumInt;
typedef MultiplyMethod<float> MultFlt;
// ...
ASSERT(f<int, MultInt>(int_in, 128), f_alt<int, MultInt>(int_in, 128));
ASSERT(f<int, MultInt>(int_in, 256), f_alt<int, MultInt>(int_in, 256));
// ...
ASSERT(f<int, SumInt>(int_in, 128), f_alt<int, SumInt>(int_in, 128));
ASSERT(f<int, SumInt>(int_in, 256), f_alt<int, SumInt>(int_in, 256));
// ...
const float ep = 1e-6;
ASSERT_NEAR(f<float, MultFlt>(flt_in, 128), f_alt<float, MultFlt>(flt_in, 128), ep);
ASSERT_NEAR(f<float, MultFlt>(flt_in, 256), f_alt<float, MultFlt>(flt_in, 256), ep);
// ...
अब निश्चित रूप से मेरे सवाल है: उस के शीर्ष पर, मैं कई structs
SumMethod
, MultiplyMethod
, आदि जैसे, इसलिए मैं परीक्षण की काफी बड़ी संख्या में भी चल रहा हूँ विभिन्न प्रकार के लिए है इस पड़ता है कोई समझ और यह बुरा क्यों होगा?
वास्तव में, मैं एक "बग" जब float
के साथ परीक्षण चलाने जहां f()
और f_alt()
, गोलाई जो मैं इनपुट सरणी आदि presorting से सुधार सकता है की वजह से SumMethod
के साथ अलग अलग मान प्रदान करेगा .. इस अनुभव से पाया है मैं वास्तव में कुछ हद तक अच्छा अभ्यास मानता हूं।
यादृच्छिक रूप से जेनरेट किया गया डेटा दो कारणों से खराब है - पहला, क्योंकि जैसा आपने बताया है, परीक्षण पुन: उत्पन्न नहीं होते हैं। और दूसरी बात, क्योंकि कोने के मामलों को यादृच्छिक रूप से जेनरेट किए गए डेटा द्वारा कवर नहीं किया जा सकता है। यादृच्छिक वैक्टर को सहेजना दूसरी कमी के लिए कुछ भी नहीं करता है। –
धन्यवाद। मैंने अपना जवाब संशोधित किया, आप बिल्कुल सही हैं। – haimg
@haimg - यदि आप ब्लैक बॉक्स परीक्षण कर रहे हैं, तो आप एल्गोरिदम का उपयोग कैसे करते हैं और इसके कोने के मामलों को कैसे जानते हैं? :-) –