【问题标题】:How can I unit test a specific DML method?如何对特定的 DML 方法进行单元测试?
【发布时间】:2022-11-17 21:37:49
【问题描述】:

我正在编写一些包含相当复杂方法的常见 DML 代码,例如:

saved uint32 checksum_ini;
method calculate_checksum(bytes_t data) -> (uint32 sum) {
    uint32 result = checksum_ini;
    for (int i = 0; i < data.size; ++i) {
        result = f(result, data.data[i]);
    }
    return result;
}

我的设备通过读写一些寄存器来间接调用该函数,这使得对校验和算法的所有极端情况进行单元测试变得很麻烦。

如何有效地为我的校验和实现编写单元测试?

【问题讨论】:

    标签: simics


    【解决方案1】:

    一种方法是创建一个专用测试模块,比如test-checksum,其中包含一个测试设备,比如test_checksum_dev,它只导入你的公共代码,并将calculate_checksum方法暴露给 Python,这样很容易编写测试。这分两步完成:首先,将方法公开给 C:

    dml 1.4;
    device test_checksum_dev;
    import "checksum-common.dml";
    // Make DML method calculate_checksum available as extern C symbol "calculate_checksum"
    // The signature will be:
    // uint64 calculate_checksum(conf_object_t *obj, bytes_t data)
    export calculate_checksum as "calculate_checksum";
    

    第二步是将其暴露给 Python。创建checksum.h

    #ifndef CHECKSUM_H
    #define CHECKSUM_H
    
    #include <simics/base/types.h>
    #include <simics/pywrap.h>
    
    extern uint32 calculate_checksum(conf_object_t *obj, bytes_t data);
    
    #endif /* CHECKSUM_H */
    

    (如果您还将 header %{ #include "checksum.h" %} 添加到 DML 文件,您将得到一个硬检查以确保签名保持一致)。

    现在将头文件添加到模块 makefile 中的 IFACE_FILES 以创建 Python 包装:

    SRC_FILES = test-checksum.dml
    IFACE_FILES = checksum.h
    include $(MODULE_MAKEFILE)
    

    您现在可以直接从测试中调用 DML 方法:

    SIM_load_module('test-checksum')
    from simmod.test_checksum.checksum import calculate_checksum
    obj = SIM_create_object('test_checksum_dev', 'dev', checksum_ini=0xdeadbeef)
    assert calculate_checksum(obj, b'hello world') == (0xda39ba47).to_bytes(4, 'little')
    

    【讨论】:

      猜你喜欢
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多