将测试数据解析为C程序

时间:2016-08-02 08:16:14

标签: c matlab unit-testing testing integration-testing

我正在开发一个将在嵌入式ARM芯片上运行的模块来运行一个用C语言编写的姿态控制器。我们有一个MATLAB仿真,带有一堆我想要的低级函数能够使用MATLAB程序生成的数据进行单元测试。

每个函数都相当复杂,我想计算Matlab输出和C输出之间的误差以进行验证。每个函数在两个实现之间具有相同的输入和输出,因此它们应该匹配(允许的容差)。

有没有好的现有文件格式可用?测试数据的类型是:

<Test Input 1> <Test Input 2> <Test input 3> <Expected Output 1> <Expected output 2>

输入和输出是任意单浮点数,数组或矩阵。我考虑过XML,因为有一些很好的解析器,但这就是我所知道的。

有任何建议或指示吗?

4 个答案:

答案 0 :(得分:3)

一种简单的方法是使用CSV文件格式:

  1. 很容易从C. see here
  2. 处理
  3. 稍后只需将文件后缀更改为* .csv
  4. 即可使用OpenOffice / Excel

    查看有关CSV文件的更多here

答案 1 :(得分:1)

听起来你想从C运行这些单元测试?您是否考虑过在MATLAB中运行它们?如果是这样,那么您将能够利用MATLAB Unit Test Frameworkparameterized testing对实际值和期望值进行编码(使用MATLAB测试中的“顺序”ParameterCombination属性。这将要求您创建MEX包装器您的C代码,以便您可以从MATLAB调用它们,但除了这个额外的步骤,这可能是非常无缝的。另外,您是否考虑过使用MATLAB Coder

MATLAB单元测试看起来像这样:

classdef Times2Test < matlab.unittest.TestCase

    properties(TestParameter)
        input = {1,2,3};
        expectedResult = {2,4,6};
    end

    methods(Test, ParameterCombination='sequential')
        function testMATLABSimulation(testCase, input, expectedResult)
            actualResult = times2(input);
            testCase.verifyEqual(actualResult, expectedResult, ...
                'RelTol', 1e-6);
        end
        function testCAlgorithm(testCase, input, expectedResult)
            % Must expose to MATLAB by compiling C code to Mex
            actualResult = times2Mex(input); 
            testCase.verifyEqual(actualResult, expectedResult, ...
                'RelTol', 1e-6);
        end
    end
end

答案 2 :(得分:0)

由于每个函数都有相同的输入,因此没有理由不以最简单的形式创建输入文件 - 只是数字!

您确切知道要阅读的数字的类型和数量,因此只需使用fscanf

阅读它们

该文件可能如下所示:

12.3 100 200.3

1 2 3
4 5 6
7 8 9

第一行是任意浮点数,你将每一行都读成一个变量。

接下来的9个是一个矩阵,所以你把它们循环读成3x3矩阵等......

答案 3 :(得分:0)

你的问题中有一点是一种眉毛提升者: “输入和输出是任意单个浮点数,数组或矩阵”。这会增加一些复杂性,但也许没有办法解决这个问题。

.Xml 文件格式是一个不错的选择,因为它为您提供了很大的灵活性,您可以在编辑器中导入/导出测试,以帮助您理解它。

但也许更好的选择是 .JSON 文件格式。它提供与xml文件相同的灵活性,但重量不是很大。有一些开源库可以在C中使用它们,我确信matlab也可以以这种格式导出数据。