我正在开发一个将在嵌入式ARM芯片上运行的模块来运行一个用C语言编写的姿态控制器。我们有一个MATLAB仿真,带有一堆我想要的低级函数能够使用MATLAB程序生成的数据进行单元测试。
每个函数都相当复杂,我想计算Matlab输出和C输出之间的误差以进行验证。每个函数在两个实现之间具有相同的输入和输出,因此它们应该匹配(允许的容差)。
有没有好的现有文件格式可用?测试数据的类型是:
<Test Input 1> <Test Input 2> <Test input 3> <Expected Output 1> <Expected output 2>
输入和输出是任意单浮点数,数组或矩阵。我考虑过XML,因为有一些很好的解析器,但这就是我所知道的。
有任何建议或指示吗?
答案 0 :(得分:3)
答案 1 :(得分:1)
听起来你想从C运行这些单元测试?您是否考虑过在MATLAB中运行它们?如果是这样,那么您将能够利用MATLAB Unit Test Framework和parameterized 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也可以以这种格式导出数据。