生成随机结构以进行测试的通用方法

时间:2017-07-18 07:31:19

标签: c++ unit-testing automated-tests

我已经完成了重构一堆C ++代码的任务,这些代码有很多数学,而不是对它的作用的解释。 为了做到这一点,我设置了一堆自动测试,给出随机数据比较新旧代码结果。

问题是,虽然生成任意大小的随机向量很简单,但我有很多" struct"有很多公共领域(> 20)我有点厌倦了编写自定义函数来填充它们。

可以想到使用某种脚本来解析定义并自动生成相应的生成器函数。

你认为这是个好主意吗? 有没有这样的事情已经完成了?

1 个答案:

答案 0 :(得分:1)

如果你只有Plain Old Data,那么结构只是一块内存,对编译器有一些意义。

这意味着您可以将其视为这样,并使用union:

简单地用随机字节填充它
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;
}

See it live!

从技术上讲,这是Undefined Behavior。实际上,它在大多数编译器中都有明确的定义。