2013-01-02 34 views
5

背景:我正在處理的代碼庫非常大,大量使用斷言。測試中發現的大量問題最終與單個斷言(文件和行號)相關聯。但是,如果有人修改了源代碼,與assert關聯的行號可能會改變,並且很難追蹤它何時重新出現。如何將斷言與唯一ID相關聯?

例子: 在測試過程中,說測試者遇到幾個聲稱在main.cpp中:1808。針對這一斷言,我們的缺陷跟蹤系統會記錄一個錯誤。第二天有人修改main.cpp。當測試人員重新執行測試時,仍然會發生相同的斷言,但現在報告發生在main.cpp:1790。因此很難確定這是否是一個新的斷言或者在不查看源代碼的情況下重新發現之前看到的斷言。

問: 是可能每個人斷言()有唯一的ID,將整個代碼更改堅持,而不是依靠行號,相關聯?我自己無法想到一個解決方案。我希望比我聰明的人會有一些想法。以下是我在想一個解決辦法的行爲:

#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

如果可能的話,從您的SCM工具添加版本號或散列。這可能需要與您的構建系統集成,並且不會跟蹤該行,但這確實意味着您在檢查缺陷時可以檢出相同的版本。 – Useless

+0

請勿使用ASSERT。編寫自己的斷言宏,該文件從文件的開始處開始計數,並添加分配給該特定模塊的值,或者只接受UID parm。 –

回答

0

我看不出有什麼辦法讓它證明代碼的變化。通常代碼跟蹤軟件無法正確識別代碼的哪一部分已經改變。所以任何自動跟蹤可能會失敗。我建議寫一個簡單的程序,它會在沒有使用uid的情況下枚舉每個現有的assert。該程序應該改變aasert以像例如ASSERT(height < 10, "aagcodkv73");。並將該腳本連接到提交階段。

這種方式每次有人添加新的斷言,它會得到它自己的uid。和UID將由開發商

2

你可以使用一個比行號稍寬標準,如功能和斷言的文本被保留。例如,

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

有人可能會說,如果該功能或狀態改變,即使你將生成UID沒有,它仍然是應分別調查了不同的錯誤。

相關問題