检测c ++结构从单元测试更新

cap*_*one 8 c++ unit-testing

我有一系列数据结构,应该使用boost :: serialization从一层传递到另一层.例如

struct DataType1
{
    std::string field1;
    std::string field2;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & field1;
        ar & field2;
    }
};
Run Code Online (Sandbox Code Playgroud)

我想写这个单元测试,只是为了确保我没有错过一些字段(有很多结构和字段).

问题是,如果我在结构中添加新字段(我肯定会这样做)而忘记更新单元测试,则单元测试不会覆盖此字段.

我的问题是:如何检测结构(或类)是否已更改.我的想法是使用static_assert(sizeof(DataType1)== HARD_CODED_VALUE)但它在不同的编译器,平台(x64,x86)和配置(发布,调试)中受到结构大小差异的影响.

有什么好主意如何处理这个?

Jan*_*rát 2

在类定义中添加注释以提醒您在添加成员时必须调整序列化器。计算机能为您做的事情是有限的——这就是代码审查很重要的原因。让其他程序员审查任何补丁,拥有一组严格的测试用例,并希望得到最好的结果。

我确信您可以编写一个 clang 插件,该插件将确保特定方法引用结构的每个成员,但是您真的需要这个吗?您可以投入时间吗?

也就是说,如果你尝试将尽可能多的工作转移到计算机上,你会获得加分。即使static_assert是一招也是好招。如果您使用一组#ifdef针对特定 ABI 和经常构建的架构的 s 来保护它,它可能会做得很好。