अब तक, मैंने एक इम्प्रोविज्ड यूनिट परीक्षण प्रक्रिया का उपयोग किया है - मूल रूप से एक बैच फ़ाइल द्वारा स्वचालित रूप से चलने वाले यूनिट परीक्षण प्रोग्राम का एक पूरा भार। हालांकि इनमें से बहुत से अपने परिणामों की स्पष्ट रूप से जांच करते हैं, बहुत अधिक धोखा देती है - वे परिणामस्वरूप टेक्स्ट फ़ाइलों को परिणाम निकाल देते हैं। परीक्षण परिणामों में कोई भी बदलाव उपversण द्वारा ध्वजांकित हो जाता है और मैं आसानी से पहचान सकता हूं कि परिवर्तन क्या था। कई परीक्षण आउटपुट डॉट फाइल या कुछ अन्य रूप जो मुझे आउटपुट का दृश्य प्रतिनिधित्व प्राप्त करने की अनुमति देता है।मेरे यूनिट परीक्षण को सेमेक और सीटेस्ट में कैसे अनुकूलित करें?
समस्या यह है कि मैं cmake का उपयोग करने के लिए स्विच कर रहा हूं। सेमेक प्रवाह के साथ जाने का मतलब है आउट-ऑफ-सोर्स बिल्ड का उपयोग करना, जिसका अर्थ यह है कि डंपिंग की सुविधा साझा स्रोत/बिल्ड फ़ोल्डर में होती है और स्रोत के साथ उन्हें वर्जनिंग वास्तव में काम नहीं करती है।
एक प्रतिस्थापन के रूप में, मैं की तरह करने के लिए यूनिट टेस्ट टूल को बताना है कि अपेक्षित परिणामों की फाइलें (स्रोत पेड़ में) कहां मिलें और तुलना करने के लिए इसे प्राप्त करें। विफलता पर, यह वास्तविक परिणाम और diff लिस्टिंग प्रदान करना चाहिए।
क्या यह संभव है, या क्या मुझे पूरी तरह से अलग दृष्टिकोण लेना चाहिए?
जाहिर है, मैं सीटीएस्ट को अनदेखा कर सकता हूं और केवल उस स्रोत को अनुकूलित कर सकता हूं जो मैंने हमेशा स्रोत के निर्माण के लिए किया है। मैं उदाहरण के लिए (उदाहरण के लिए 'अनदेखा' के उदार उपयोग के साथ) मेरे फ़ोल्डर-जहां-सब-बिल्ड-लाइव संस्करण बना सकता हूं। क्या वह साईं है? शायद नहीं, क्योंकि प्रत्येक निर्माण अपेक्षित परिणामों की एक अलग प्रति के साथ खत्म हो जाएगा।
इसके अलावा, cmake/ctest gratefuly के साथ इकाई परीक्षण करने के अनुशंसित तरीके से कोई सलाह प्राप्त की गई। मैंने सेमीकेक के साथ काफी समय बर्बाद कर दिया, क्योंकि यह बुरा नहीं है, लेकिन क्योंकि मुझे समझ में नहीं आया कि इसके साथ कैसे काम करना है।
संपादित
अंत में, मैं यथासंभव सरल इकाई परीक्षण के cmake/ctest पक्ष रखने का फैसला किया। अपेक्षित परिणाम के विरुद्ध वास्तविक परीक्षण करने के लिए, मैं अपने पुस्तकालय में निम्नलिखित समारोह के लिए एक घर ...
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;
}
एक ठेठ इकाई परीक्षण अब तरह दिखता है ...
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);
}
मैं एक कहाँ की जरूरत है पाया पुनः उपयोग करने योग्य डेटा-डंपिंग फ़ंक्शन, यह std::ostream&
प्रकार का पैरामीटर लेता है, इसलिए यह वास्तविक-परिणाम स्ट्रीम पर डंप कर सकता है।
आपको इसके बजाय एक उत्तर के रूप में अपना संपादन जोड़ना चाहिए, क्योंकि यह आपके अपने प्रश्न का उत्तर देता है – Joakim