如何基于Matlab单元测试的类参数生成方法参数

时间:2016-03-03 09:18:55

标签: matlab unit-testing parameterized-unit-test

我正在处理的程序执行的计算涉及的对象只能有几组可能的值。这些参数集从目录文件中读取。

例如,对象表示汽车,目录包含每个模型的值集{id :(名称,颜色,功率等)}。但是有很多这些目录。

我使用Matlab的unittest包来测试目录中列出的任何属性组合的计算是否失败。我想使用这个包,因为它提供了一个很好的失败条目列表。我已经有一个测试,它为(硬编码的)目录文件生成所有id的单元数组,并将其用于参数化测试。

现在我需要为每个目录文件创建一个新类。我想将目录文件名设置为类参数,并将其中的条目设置为方法参数(为所有类参数生成),但我找不到将当前类参数传递给本地方法以创建的方法方法参数列表。

我该如何做到这一点?

如果重要:我使用的是Matlab 2014a,2015b或2016a。

1 个答案:

答案 0 :(得分:1)

我有几个想法。

  1. 简短的回答是,目前无法做到这一点,因为TestParameters被定义为常量属性,因此无法在每个ClassSetupParameter值中进行更改。

  2. 但是,对我来说,为每个目录创建一个单独的类似乎并不是一个坏主意。那个工作流程在哪里失败了?如果需要,您仍然可以通过使用包含内容的测试基类和目录文件的抽象属性来跨这些文件共享代码。

    classdef CatalogueTest < matlab.unittest.TestCase
        properties(Abstract)
            Catalogue;
        end
        properties(Abstract, TestParameter)
             catalogueValue
        end
    
        methods(Static) 
            function cellOfValues = getValuesFor(catalog)
                % Takes a catalog and returns the values applicable to 
                % that catalog.
            end
        end
    
        methods(Test)
            function testSomething(testCase, catalogueValue)
                % do stuff with the catalogue value
            end
            function testAnotherThing(testCase, catalogueValue)
                % do more stuff with the catalogue value
            end
        end
    
    end
    
    
    
    classdef CarModel1Test < CatalogueTest
    
        properties
            % If the catalog is not needed elsewhere in the test then
            % maybe the Catalogue abstract property is not needed and you
            % only need the abstract TestParameter.
            Catalogue = 'Model1';
        end
        properties(TestParameter)
             % Note call a function that lives next to these tests
             catalogueValue = CatalogueTest.getValuesFor('Model1');
        end
    end
    

    这对你想要做的事情有用吗?

  3. 当你说方法参数时我假设你的意思是“TestParameters”而不是“MethodSetupParameters”正确吗?如果我正在阅读您的问题,我不确定这适用于您的情况,但我想提一下,您可以通过在类上创建另一个属性来保存Test中的值,从而将ClassSetupParameters / MethodSetupParameters中的数据导入到您的测试方法中[Method | Class]设置然后在Test方法中引用这些值。 像这样:

    classdef TestMethodUsesSetupParamsTest < matlab.unittest.TestCase
        properties(ClassSetupParameter)
            classParam = {'data'};
        end
        properties
            ThisClassParam
        end
    
        methods(TestClassSetup)
            function storeClassSetupParam(testCase, classParam)
                testCase.ThisClassParam = classParam;       
            end
        end
    
        methods(Test)
            function testSomethingAgainstClassParam(testCase)
                testCase.ThisClassParam
            end
        end
    
    end
    

    当然,在这个示例中,您应该只使用TestParameter,但在某些情况下可能会有用。不知道这里是否有用。