2013-01-02 18 views
5

पृष्ठभूमि: जिस कोड-बेस पर मैं काम कर रहा हूं वह काफी बड़ा है और भारी रूप से जोर देता है। एक व्यक्तिगत assert (एक फ़ाइल और लाइन संख्या) से जुड़े परीक्षण में पाया गया मुद्दों की एक बड़ी संख्या। अगर कोई स्रोत कोड संशोधित करता है, हालांकि, जोर से जुड़े लाइन नंबर बदल सकते हैं और इसे फिर से चालू करने पर ट्रैक करना मुश्किल हो जाएगा।अद्वितीय आईडी के साथ आवेषण कैसे संबद्ध करें?

उदाहरण: परीक्षण के दौरान, टेस्टर्स मुख्य.cpp: 1808 पर कई आवेषणों का सामना करते हैं। इस जोर के खिलाफ हमारे दोष ट्रैकिंग सिस्टम में एक बग लॉग है। अगले दिन कोई main.cpp को संशोधित करता है। जब परीक्षक अपने परीक्षण फिर से निष्पादित करते हैं, वही जोर अभी भी होता है लेकिन अब यह मुख्य.cpp: 17 9 0 पर होने की सूचना दी गई है। इसलिए यह निर्धारित करना मुश्किल है कि क्या यह स्रोत कोड को देखे बिना पहले किए गए आवेषण का एक नया आश्वासन या पुन: प्राप्ति है।

प्रश्न: Is प्रत्येक व्यक्ति ज़ोर() एक अनन्य आईडी से, कि बजाय लाइन संख्या पर निर्भर रहने के कोड में परिवर्तन के पार बना रहेगा, संबद्ध करने के लिए संभव है? मैं खुद को एक समाधान के बारे में सोचने में सक्षम नहीं था। मुझे उम्मीद है कि मेरे से ज्यादा स्मार्ट कुछ विचार होगा। यहाँ मैं कैसे सोच रहा हूँ एक समाधान कैसा व्यवहार करेंगे है:

#include <iostream> 
#include <string> 
#include <assert.h> 

using namespace std; 

//Can ASSERT to redefined to generate a UID? 
#define ASSERT assert 

void main(void) 
{ 
    std::string name; 
    int age; 

    std::cin >> name; 
    ASSERT(name.length() < 10);  //Generate a UID if assert fails(ie 0001) 
    std::cin >> age; 
    ASSERT(age < 100);    //Generate a UID if assert fails(ie 0002) 
} 

के बाद कुछ कोड में परिवर्तन

#include <iostream> 
#include <string> 
#include <assert.h> 

using namespace std; 

#define ASSERT assert 

void main(void) 
{ 
    std::string name; 
    int age; 
    int height; 

    std::cin >> height; 
    ASSERT(height < 10);   //Generate a UID if assert fails(ie 0003) 
    std::cin >> name; 
    ASSERT(name.length() < 10); //Generate a UID if assert fails(ie 0001) 
    std::cin >> age; 
    ASSERT(age < 100);   //Generate a UID if assert fails(ie 0002) 
} 
+1

ASSERT के पाठ माना जाता है "unqiue", इस तरह है कि अपने दोष प्रणाली है कि देखो सकता है? निश्चित रूप से सही नहीं है। शायद अगर फंक्शन नाम के साथ मिलकर यह काफी अच्छा हो जाएगा? – JaredC

+1

यदि संभव हो, तो अपने एससीएम उपकरण से संशोधन संख्या या हैश जोड़ें। यह अपने निर्माण प्रणाली के साथ एकीकरण की आवश्यकता हो सकती है, और यह लाइन ट्रैक नहीं करता है, लेकिन इसका मतलब यह है कि आप एक ही संस्करण की जाँच कर सकते हैं जब एक दोष की जांच। – Useless

+0

एएसएसईआरटी का प्रयोग न करें। अपनी खुद की ज़ोर मैक्रो उस फ़ाइल का शुरू से ही मायने रखता है और उस विशेष मॉड्यूल, या जो केवल एक यूआईडी parm स्वीकार करता है करने के लिए आवंटित एक मूल्य में कहते हैं लिखें। –

उत्तर

0

मैं इसे कोड में परिवर्तन के लिए सबूत बनाने के लिए कोई रास्ता नहीं देखते हैं। अक्सर कोड ट्रैकिंग सॉफ़्टवेयर सही ढंग से पहचानने में विफल रहता है कि कोड का बिल्कुल हिस्सा किस प्रकार बदल गया है। इसलिए कोई स्वचालित ट्रैकिंग शायद असफल हो जाएगी। मेरा सुझाव है कि एक साधारण प्रोग्राम लिखें जो प्रत्येक मौजूदा assert को बिना किसी यूआईडी के समझाएगा। कार्यक्रम को aasert को sth जैसे बदलना चाहिए ASSERT(height < 10, "aagcodkv73");। और चरण को कम करने के लिए उस स्क्रिप्ट को कनेक्ट करें।

हर बार जब कोई नया दावा जोड़ता है तो उसे अपना स्वयं का यूआईडी मिल जाएगा। और यूआईडी डेवलपर्स द्वारा संरक्षित किया जाएगा

2

आप लाइन नंबर की तुलना में थोड़ा व्यापक मानदंड का उपयोग कर सकते हैं, जैसे फ़ंक्शन और एसेशन टेक्स्ट। उदाहरण के लिए,

#define ASSERT(cond) \ 
if(!(cond))   \ 
{     \ 
    std::cerr << "Assertion failure: " 
       << __FILE__ << ":" << __FUNCTION__ << "-" << #cond << std::endl; \ 
    abort();   \ 
}     \ 

यह तर्क हो सकता है कि अगर समारोह या स्थिति परिवर्तन, भले ही यूआईडी आप उत्पन्न होगा, इसकी अभी भी एक अलग त्रुटि है कि में अलग से देखा जाना चाहिए नहीं है।

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