背景:我正在处理的代码库非常大,大量使用断言。测试中发现的大量问题最终与单个断言(文件和行号)相关联。但是,如果有人修改了源代码,与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)
}
ASSERT的文本是否被认为是“unqiue”的,这样你的缺陷系统就可以看到这个文件?绝对不完美。也许如果与功能名称相结合,它会变得足够好? – JaredC
如果可能的话,从您的SCM工具添加版本号或散列。这可能需要与您的构建系统集成,并且不会跟踪该行,但这确实意味着您在检查缺陷时可以检出相同的版本。 – Useless
请勿使用ASSERT。编写自己的断言宏,该文件从文件的开始处开始计数,并添加分配给该特定模块的值,或者只接受UID parm。 –