2017-07-04 3 views
0

En tant que sujet, je voudrais générer des données de test pour couvrir toutes les conditions possibles pour une expression logique comme ci-dessous:Comment générer des données de test en fonction de l'expression logique?

((a==3000710)||(b==3000700)) 
    &&(b>=30 && b<=33) 
    &&((c==1)||(c>=4 && c<=6)) 
    &&((v==1.0.9)||(v==2.0.0)) 

Tout commentaire est le bienvenu. Par ailleurs, l'expression logique est une règle simplifiée qui est appliquée sur notre serveur principal.

+0

Vous devez spécifier la technologie utilisée afin que d'autres utilisateurs puissent vous indiquer les ressources pertinentes. Quel langage de programmation et quel cadre de test utilisez-vous? – vijoc

+0

En fait, je ne me soucie pas de la langue, je veux juste trouver une méthode (algorithme) réalisable ou un outil open source pour résoudre le problème. – user940178

Répondre

1

La première chose que je dois dire - refactor it! Décomposer en plusieurs instructions if qui seraient plus faciles à valider, inverser la logique et quitter tôt. Il est difficile de donner des suggestions plus détaillées sans voir le code et le contexte.

Une autre chose, si (b == 3000700), puis &&(b>=30 && b<=33) renvoie false, ce qui rend cette partie de l'instruction ||(b==3000700) inutile. Peut-être que c'était censé être (a == 3000700)?

En ce qui concerne les cas de test ... Encore une fois sans voir l'extrait de code complet et en connaissant le contexte, il est un peu difficile de fournir des suggestions significatives. Mais je vais essayer quand même. Regardons les "valeurs critiques" pour chaque variable.

  • variable a: 3000710, tout autre
  • variable b: 3000700, [30, 33], any other
  • Variable c: 1, [4, 6], any other
  • variable v: 1.0.9, 2.0.0, any other

En utilisant la théorie des tests (partition d'équivalence et de la valeur limite analyse), nous pouvons limiter la liste des valeurs "critiques" ci-dessus.

[30, 33] => 30, 31, 33 (The value outside of this range is already covered by "any other") 
[4, 6] => 4, 5, 6 (The value outside of this range is already covered by "any other". Though we did't really change anything in this case) 

Nunit a un attribut [Combinatorial] qui génère des cas de test pour toutes les combinaisons possibles des éléments de données individuelles prévues pour les paramètres de l'essai.

* Les hypothèses utilisées: les variables a, b, c sont de type int variable v est une chaîne

Le code ressemblerait à quelque chose comme ça:

 [Test, Combinatorial]   
     public void FirstTest(
      [Values(3000710, 0)] int a, 
      [Values(30, 31, 33, 3000700, 0)] int b, 
      [Values(1, 4, 5, 6, 0)] int c, 
      [Values("1.0.9", "2.0.0", "")] string v) 
     { 
      RunTestMethod(a, b, c, v); 
     } 

Vous avez juste besoin pour stocker les données de test générées sur l'exécution des tests

+0

Bonjour @buxter, merci beaucoup pour votre réponse élaborée. Vous avez raison sur la valeur de (a == 300700), c'est vraiment une faute de frappe. Votre approche est réalisable. Je pense que nous pouvons faire plus loin pour générer automatiquement toute la valeur critique en utilisant des techniques comme "analyse statique du programme", mais je ne suis pas familier avec ces domaines, pouvez-vous faire la lumière sur ce point? Merci encore. – user940178

+0

C'est un test d'unité juste en C#, utilisant le framework Nunit. Il a un attribut intégré [Combinatoire] pour un test paramétré.Ainsi, lorsque le test est exécuté, il collecte toutes les données d'entrée et génère toutes les variations possibles. Dans l'exemple donné, il crée toutes les variations possibles sur les points critiques. D'autres cadres de test unitaires peuvent avoir quelque chose de similaire. J'espère que cela répond à votre question – buxter