2013-01-02 32 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没有,它仍然是应分别调查了不同的错误。

相关问题