生成用于测试的随机结构的通用方法
我已经被赋予了重构一堆C++代码的任务,这些代码有很多数学知识,而不是解释它的功能。 为了做到这一点,我设置了一堆自动测试,给出随机数据比较新旧代码结果。生成用于测试的随机结构的通用方法
事情是,尽管生成任意大小的随机向量很简单,但我有很多带有许多公共字段(> 20)的“struct”,我有点厌倦了编写自定义函数来填充它们。
可以想到使用某种脚本来解析定义并自动生成相应的生成器函数。
您认为这是一个好主意吗? 有没有这样的事情?
如果你只有Plain Old Data,那么结构大体上只是一块内存,对编译器有一定的意义。
这意味着你可以把它当作这样的,根本用随机字节填充它,用工会:
struct a {
int i;
char c;
float f;
double d;
};
union u {
char arr[sizeof(a)];
a record;
};
char generateRandomChar(); // implement some random char generation
int main() {
u foo;
for (char& c : foo.arr) {
c = generateRandomChar();
}
std::cout << "i:" << foo.record.i
<< "\nc:" << foo.record.c
<< "\nf:" << foo.record.f
<< "\nd:" << foo.record.d;
}
从技术上讲,这是Undefined Behavior。实际上,它在大多数编译器中都有明确的定义。
如果你已经知道它是一个UB的UB,你为什么不提到另一种选择:memcpy? –
@好问题。我想过了,但你仍然必须以某种方式生成(伪)随机字节。大概是一个接一个,因为大多数图书馆(包括标准图书馆,据我所知)都这样做。如果我已经逐一生成它们,为什么我会将它们存储在不同的内存位置,以便我可以“memcpy”它们? –
当然,如果你可以批量生成它们,这将是一个不错的性能提升,并且(可能)很小的内存成本。 –
我想这种测试的适当术语将是* fuzzing *。但在编写测试来比较新旧代码之前,您可能应该弄清楚现有代码的作用,并编写测试来检查其正确性。 – VTT
也许我应该,但我不能。我现在可以做的最好的事情是确保结果与以前相同。 – PeppeDx
我所做的是向结构添加反射(boost hana或类似的,[visit_struct](https://github.com/cbeck88/visit_struct))并添加访问者以根据其类型填充随机值(以及某个时间与会员名称)。 – Jarod42