2016-03-03 8 views
3

Un programme sur lequel je travaille effectue des calculs impliquant des objets qui ne peuvent avoir que plusieurs ensembles de valeurs possibles. Ces jeux de paramètres sont lus à partir d'un fichier de catalogue. A titre d'exemple, disons que les objets représentent des voitures et que le catalogue contient un ensemble de valeurs {id: (nom, couleur, puissance, etc.)} pour chaque modèle. Il y a cependant beaucoup de ces catalogues.Comment générer des paramètres de méthode en fonction des paramètres de classe pour les tests unitaires Matlab

J'utilise le package unittest de Matlab pour tester si les calculs échouent pour l'une des combinaisons de propriétés répertoriées dans les catalogues. Je veux utiliser ce paquet, car il fournit une belle liste d'entrées qui ont échoué. J'ai déjà un test qui génère un tableau de cellules de tous les identifiants pour un fichier catalogue (codé en dur) et l'utilise pour les tests paramétrés.

Pour l'instant j'ai besoin de créer une nouvelle classe pour chaque fichier de catalogue. Je voudrais définir le nom de fichier de catalogue comme paramètre de classe et les entrées comme paramètres de méthode (qui sont générés pour tous les paramètres de classe), mais je ne trouve pas un moyen de passer le paramètre de classe actuel à la méthode locale pour créer liste de paramètres de méthode.

Comment est-ce que je peux faire ce travail?

Dans le cas où c'est important: J'utilise Matlab 2014a, 2015b ou 2016a.

+0

Chaque méthode de test ne peut-elle pas effectuer une boucle sur les noms de fichier de configuration stockés dans une propriété de classe de test? – Jonas

+0

Généralement, chaque fois que je fais un code de boucle à l'intérieur d'une méthode de test, je pense que "ceci devrait utiliser le paramétrage à la place". J'ai une matinée occupée, mais j'essaierai de me connecter cet après-midi pour tenter de répondre à celui-ci. –

Répondre

1

J'ai quelques réflexions.

  1. Réponse courte est pas cela ne peut pas être fait actuellement parce que les TestParameters sont définis comme des propriétés constantes et ne peut donc pas changer sur chaque valeur ClassSetupParameter.

  2. Cependant, pour moi, créer une classe séparée pour chaque catalogue ne semble pas être une mauvaise idée. Où ce flux de travail tombe-t-il pour vous? Si vous le souhaitez, vous pouvez toujours partager du code entre ces fichiers en utilisant une classe de base de test avec votre contenu et une propriété abstraite pour le fichier de catalogue.

    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 
    

    Est-ce que cela fonctionne pour ce que vous essayez de faire?

  3. Lorsque vous parlez de paramètres de méthode, je suppose que vous voulez dire "TestParameters" par opposition à "MethodSetupParameters" correct? Si je lis bien votre question je ne suis pas sûr que cela s'applique à votre cas, mais je voulais mentionner que vous pouvez obtenir les données de votre ClassSetupParameters/MethodSetupParameters dans vos méthodes de test en créant une autre propriété sur votre classe pour contenir les valeurs dans Test [Méthode | Classe] Configurez puis faites référence à ces valeurs dans votre méthode de test. comme ceci:

    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 
    

    Bien sûr, dans cet exemple, vous devez simplement utiliser un TestParameter, mais il peut y avoir des cas où cela pourrait être utile. Je ne sais pas si c'est utile ici ou non.

+0

Je l'ai fait en utilisant une méthode statique pour cela. Merci beaucoup! – Tim